共享扩展loadItemForTypeIdentifier返回NSURL的错误

时间:2015-02-04 17:00:30

标签: ios objective-c ios8-share-extension

我有以下代码来读取传递的URL。我正在使用Pocket应用进行测试,虽然hasItemConformingToTypeIdentifierkUTTypeURL返回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];
          }
        }];
      }
    }
  }

3 个答案:

答案 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,否则这不适用于所有其他应用程序。