iOS操作扩展示例代码不起作用

时间:2015-08-25 17:36:20

标签: ios ios-app-extension

iOS动作扩展示例代码似乎不起作用。

  1. 在xCode中,我创建了一个新的Swift项目并选择了单视图应用程序。

  2. 然后我选择文件>新>目标,然后选择“操作扩展”。我输入一个名称,选择Swift,然后选择Action Type:No User Interface

  3. 然后我通过运行项目并选择Safari来测试扩展。我导航到Google网站。

  4. 我通过Safari中的“操作”图标启用了扩展程序。然后我按下扩展图标在Safari中运行它,但没有任何反应。

  5. 我希望网页背景颜色发生变化,因为应该运行的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>
    

1 个答案:

答案 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,我建议您同时提交错误。