iOS共享扩展程序不会从Safari接收数据

时间:2016-04-20 12:45:03

标签: ios ios-app-extension

我有一个iOS共享扩展,需要打开的网页的URL。一切都很好,特别是在模拟器中。但在真实设备上,我有大约20-30%的情况,其中扩展没有收到任何数据,例如:

NSExtensionItem *inputItem = self.extensionContext.inputItems.firstObject;
NSItemProvider *item = inputItem.attachments.firstObject;

[item loadItemForTypeIdentifier:(NSString *)kUTTypePropertyList options:nil completionHandler:^(NSDictionary *item, NSError *error) {
    // here the error is sometimes not nil and thus the _baseURI ends up nil
    _baseURI = [item[NSExtensionJavaScriptPreprocessingResultsKey] objectForKey:@"baseURI"];
}];

错误代码为 -100 ,其描述为“没有可用于请求的类型标识符的项目。”。这种情况主要发生在连续多次打开扩展程序而不更改/刷新Safari中的网页时。

在这些情况下,我看到一个设备日志说“iPhone kernel [0]:Sandbox:MobileSafari(7033)deny(1)file-read-data / private / var / containers / Bundle / Application / .. ./bundle.js“其中bundle.js是带有ExtensionPreprocessingJS对象的javascript。 bundle.js像这样声明ExtensionPreprocessingJS对象(提取相关部分):

ExtensionPreprocessingJS = {
  run: function(arguments){
      arguments.completionFunction({
        "baseURI": document.baseURI
      })
  },

  finalize: function(arguments){
  }
}

在这种情况下,有时可能会发生这样的情况:当扩展程序关闭时,下次在Safari中打开共享对话框时会显示我的扩展名没有图标。这种情况发生在我使用iOS 9.3测试iPhone 5s和iPhone 6上。

我认为丢失的数据是因为系统无法读取扩展程序的JavaScript文件,但为什么会发生这种情况呢?

1 个答案:

答案 0 :(得分:0)

如果您阅读以下文档:

loadItemForTypeIdentifier(_:options:completionHandler:)

你会看到:

  

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

尝试使用此代码查看您收到的内容:

[item loadItemForTypeIdentifier:(NSString *)kUTTypePropertyList options:nil completionHandler:^(id item, NSError *error) {
// here the error is sometimes not nil and thus the _baseURI ends up nil
_baseURI = [item[NSExtensionJavaScriptPreprocessingResultsKey] objectForKey:@"baseURI"];
}];

请注意,item未设置为NSDictionary。