我有一个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文件,但为什么会发生这种情况呢?
答案 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。