9

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

“意外的价值等级。”

. 如果我尝试将它作为一个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];
          }
        }];
      }
    }
  }
4

3 回答 3

1

如果您阅读以下文档:

loadItemForTypeIdentifier(_:options:completionHandler:)

你会看到:

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

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

于 2016-04-26T13:14:50.960 回答
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];

输出 - 将是您的 URL。

于 2015-10-28T12:54:20.500 回答
0

我自己现在偶然发现了这个问题。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 正在执行的特殊操作才能触发此错误,因为否则这将无法在所有其他应用程序中运行。

于 2015-12-07T14:01:17.417 回答