我有以下代码来读取传递的URL。我正在使用Pocket
应用进行测试,虽然hasItemConformingToTypeIdentifier
为kUTTypeURL
返回YES,但尝试加载它会返回错误而不是说明
“意外的价值等级。”
。如果我尝试将其作为id<NSSecureCoding>
项加载并调试,我发现传入的对象确实只是页面的标题而不是URL。我如何阅读URL?
NSURL *pageURL = nil;
for (NSExtensionItem *item in self.extensionContext.inputItems) {
for (NSItemProvider *itemProvider in item.attachments) {
if ([itemProvider hasItemConformingToTypeIdentifier: (NSString*) kUTTypeURL]) {
[itemProvider loadItemForTypeIdentifier:(NSString*) kUTTypeURL options:nil completionHandler:^(id <NSSecureCoding> urlItem, NSError *error) {
if ([((NSObject*)urlItem) isKindOfClass: [NSURL class]]) {
pageURL = [((NSURL*)urlItem) absoluteString];
}
}];
}
}
}
答案 0 :(得分:1)
如果您阅读以下文档:
loadItemForTypeIdentifier(_:options:completionHandler:)
你会看到:
completionHandler的第一个参数的类型信息 块应设置为预期类型的类。例如, 请求文本数据时,您可以设置第一个类型 NSString或NSAttributedString的参数。项目提供者可以 对您指定的类执行数据的简单类型转换, 例如从NSURL到NSData或NSFileWrapper,或从NSData到 UIImage(在iOS中)或NSImage(在OS X中)。如果数据不能 检索或 强制 到指定的类,错误传递给 完成块。
也许你可以通过胁迫不同的类型进行实验?
答案 1 :(得分:0)
试试这个
__block NSURL *pageURL = nil;
for (NSExtensionItem *item in self.extensionContext.inputItems) {
for (NSItemProvider *itemProvider in item.attachments) {
if ([itemProvider hasItemConformingToTypeIdentifier: (NSString*) kUTTypeURL]) {
[itemProvider loadItemForTypeIdentifier:(NSString*) kUTTypeURL options:nil completionHandler:^(NSURL *urlItem, NSError *error) {
if (urlItem) {
pageURL = urlItem;
}
}];
}
}
}
现在如果您想要获取当前网站的URL,请使用
NSString *output = [pageURL absolutestring];
输出 - 将是您的网址。
答案 2 :(得分:0)
我自己偶然发现了这个问题。 Pocket App似乎是唯一一个显示此问题的应用程序。奇怪的是,有些应用程序可以获取Pocket形式的URL。例如Firefox for iOS。 Firefox是开源的,所以我查看了它的代码(在Github上)并发现它与获取此处显示的URL完全相同。唯一的区别是Firefox是用Swift编写的,我的代码(以及这里发布的代码)是Objective C.所以我想知道Pocket App是否做了一些奇怪的事情,它只会引发iOS的Objective C API中的错误,那么Swift应用程序不受影响?我还没有任何Swift经验,所以我没有检查切换到Swift会“解决”这个问题。
方法&#34; hasItemConformingToTypeIdentifier:“声明有一个URL可用,但是”loadItemForTypeIdentifier:“无法提供它,这清楚地表明iOS本身有一个错误(至少在目标中) C API)。但是,Pocket App仍然必须有一些特殊的东西才能触发这个bug,否则这不适用于所有其他应用程序。