【问题标题】:Share Extension loadItemForTypeIdentifier returns error for NSURL共享扩展 loadItemForTypeIdentifier 返回 NSURL 错误
【发布时间】:2015-02-04 17:00:29
【问题描述】:

我有以下代码可以读取传递的 URL。我正在使用Pocket 应用程序对此进行测试,虽然hasItemConformingToTypeIdentifierkUTTypeURL 返回“是”,但尝试将其加载会返回错误而不是说明

“意外的值类。”

。如果我尝试将其加载为id<NSSecureCoding> 项目并进行调试,我发现传入的对象确实只是页面的标题而不是 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];
          }
        }];
      }
    }
  }

【问题讨论】:

  • 如果你用 Safari 代替 Pocket 测试它是否正常工作?
  • 是的,它确实适用于所有其他共享链接/ URL 等的应用程序。不知何故,Pocket 存在问题。真正奇怪的是它如何通过第一个“if”条件,但在第二个条件中它未能获取有效的 URL,而是将页面标题作为纯文本返回。我什至尝试了各种其他数据类型,如 NSData 等,但它们要么返回 nil,要么返回页面标题。我看不到 Wunderlist 等其他应用程序如何能够正确读取 Pocket 中的 URL。
  • @strangetimes - 你有没有找到解决方案?我刚刚遇到了同样的问题,并且一直在敲击我的键盘,试图弄清楚这些其他应用程序是如何从 Pocket 中获取 URL 的。
  • @jrtilson 很遗憾没有 - 我只是放弃了。从来没有找到解决方案,我也没有得到 devs@pocket 应用程序的回复。不值得花几个小时敲打我的脑袋让我无处可去。

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


【解决方案1】:

如果您阅读以下文档:

loadItemForTypeIdentifier(_:options:completionHandler:)

你会看到:

你的completionHandler第一个参数的类型信息 块应设置为预期类型的​​类。例如, 请求文本数据时,可以设置第一个的类型 NSString 或 NSAttributedString 的参数。项目提供者可以 执行数据到您指定的类的简单类型转换, 比如从 NSURL 到 NSData 或 NSFileWrapper,或者从 NSData 到 UIImage(在 iOS 中)或 NSImage(在 OS X 中)。如果数据不能 检索或强制到指定的类,错误被传递给 完成块。

也许您可以通过强制转换为不同的类型来进行试验?

【讨论】:

    【解决方案2】:

    试试这个

      __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];

    输出 - 将是您的 URL。

    【讨论】:

    • Pocket.app 不走运
    • 看看然后尝试将(NSString*) kUTTypeURL更改为@"public.url"
    【解决方案3】:

    我自己现在偶然发现了这个问题。 Pocket App 似乎是唯一显示此问题的应用程序。奇怪的是,有些应用程序可以从 Pocket 中获取 URL。例如 Firefox for iOS。 Firefox 是开源的,所以我查看了它的代码(在 Github 上),发现它在获取此处显示的 URL 时所做的完全相同。唯一的区别是 Firefox 是用 Swift 编写的,而我的代码(以及此处发布的代码)是 Objective C。所以我想知道 Pocket App 是否正在做一些奇怪的事情,仅触发 iOS 的 Objective C API 中的错误,所以 Swift 应用程序不受影响?我还没有任何 Swift 经验,所以我没有检查切换到 Swift 是否会“解决”这个问题。

    “hasItemConformingToTypeIdentifier:”方法表明有一个可用的 URL 但“loadItemForTypeIdentifier:”无法传递它,这清楚地表明 iOS 本身在此处存在错误(至少在 Objective C API 中) . 但是,Pocket App 仍然必须做一些特别的事情来触发这个错误,否则这在所有其他应用程序中都不起作用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-19
      • 2015-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多