iOS动作扩展示例代码似乎不起作用。
在xCode中,我创建了一个新的Swift项目并选择了单视图应用程序。
然后我选择文件>新>目标,然后选择“操作扩展”。我输入一个名称,选择Swift,然后选择Action Type:No User Interface
然后我通过运行项目并选择Safari来测试扩展。我导航到Google网站。
我通过Safari中的“操作”图标启用了扩展程序。然后我按下扩展图标在Safari中运行它,但没有任何反应。
我希望网页背景颜色发生变化,因为应该运行的Action.js代码会设置背景颜色:document.body.style.background =“blue”
< / LI> 醇>就好像Action.js代码永远不会被调用一样。 所有代码都来自默认的Action Extension模板,并且尚未修改。
的Info.plist
<key>NSExtension</key>
<dict>
<key>NSExtensionAttributes</key>
<dict>
<key>NSExtensionActivationRule</key>
<dict>
<key>NSExtensionActivationSupportsFileWithMaxCount</key>
<integer>0</integer>
<key>NSExtensionActivationSupportsImageWithMaxCount</key>
<integer>0</integer>
<key>NSExtensionActivationSupportsMovieWithMaxCount</key>
<integer>0</integer>
<key>NSExtensionActivationSupportsText</key>
<false/>
<key>NSExtensionActivationSupportsWebPageWithMaxCount</key>
<integer>1</integer>
</dict>
<key>NSExtensionJavaScriptPreprocessingFile</key>
<string>Action</string>
</dict>
<key>NSExtensionPointIdentifier</key>
<string>com.apple.services</string>
<key>NSExtensionPrincipalClass</key>
<string>$(PRODUCT_MODULE_NAME).ActionRequestHandler</string>
</dict>
答案 0 :(得分:3)
Swift版本的Xcode项目模板中存在此类扩展的错误,显然是因为有人从Objective-C转换为Swift时出错。
简而言之:“found = true”的行位于错误的位置。这会导致方法doneWithResults
被调用两次,只应调用一次。在第一次通话时,它会设置self.extensionContext = nil
。在第二次调用时,它尝试使用self.extensionContext
并因为解包nil可选而抛出异常。但是异常消息被扩展系统吞没,所以没有线索。
如果您在项目模板中更改此代码:
itemProvider.loadItemForTypeIdentifier(String(kUTTypePropertyList), options: nil, completionHandler: { (item, error) in
let dictionary = item as! [String: AnyObject]
NSOperationQueue.mainQueue().addOperationWithBlock {
self.itemLoadCompletedWithPreprocessingResults(dictionary[NSExtensionJavaScriptPreprocessingResultsKey] as! [NSObject: AnyObject])
}
found = true
})
看起来像这个:
itemProvider.loadItemForTypeIdentifier(String(kUTTypePropertyList), options: nil, completionHandler: { (item, error) in
let dictionary = item as! [String: AnyObject]
NSOperationQueue.mainQueue().addOperationWithBlock {
self.itemLoadCompletedWithPreprocessingResults(dictionary[NSExtensionJavaScriptPreprocessingResultsKey] as! [NSObject: AnyObject])
}
})
found = true
...然后按预期工作。
我提交了有关此问题的错误rdar://22482042
,我建议您同时提交错误。