iOS共享扩展,操纵网页
问题描述:
我想弄清楚如何让我的共享扩展访问网页并操纵其内容。我遵循the documentation 但我必须缺少一些东西,因为我没有看到任何符合kUTTypePropertyList
的项目,因为我认为我应该这样做。iOS共享扩展,操纵网页
我的plist看起来是这样的:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>en</string>
<key>CFBundleDisplayName</key>
<string>WebOutLoudExtension</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
<string>com.bretlester.WebsiteReader.$(PRODUCT_NAME:rfc1034identifier)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>$(PRODUCT_NAME)</string>
<key>CFBundlePackageType</key>
<string>XPC!</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>1</string>
<key>NSExtension</key>
<dict>
<key>NSExtensionAttributes</key>
<dict>
<key>NSExtensionActivationRule</key>
<dict>
<key>NSExtensionActivationSupportsWebPageWithMaxCount</key>
<integer>1</integer>
<key>NSExtensionActivationSupportsWebURLWithMaxCount</key>
<integer>1</integer>
<key>NSExtensionJavaScriptPreprocessingFile</key>
<string>ExtensionPreProcessing</string>
</dict>
</dict>
<key>NSExtensionMainStoryboard</key>
<string>MainInterface</string>
<key>NSExtensionPointIdentifier</key>
<string>com.apple.share-services</string>
</dict>
</dict>
</plist>
我ExtensionPreProcessing是这样的:
ExtensionPreprocessingJS = {
run : function(arguments) {
arguments.completionFunction({"hello":"world"});
},
finalize : function(arguments) {
document.body.style.backgroundColor = 'red';
}
};
最后,我ShareViewController看起来是这样的:
class ShareViewController: UIViewController, NSExtensionRequestHandling {
override func viewDidLoad() {
let identifierType = NSString(format: kUTTypePropertyList, NSUTF8StringEncoding)
for (item: NSExtensionItem) in self.extensionContext?.inputItems as [NSExtensionItem] {
for (itemProvider: NSItemProvider) in item.attachments as [NSItemProvider] {
if itemProvider.hasItemConformingToTypeIdentifier(identifierType) {
println("why doesn't this happen?")
}
}
}
}
override func viewDidAppear(animated: Bool) {
}
override func beginRequestWithExtensionContext(context: NSExtensionContext) {
super.beginRequestWithExtensionContext(context)
let identifierType = NSString(format: kUTTypePropertyList, NSUTF8StringEncoding)
//println(self.extensionContext?.inputItems)
for (item: NSExtensionItem) in context.inputItems as [NSExtensionItem] {
for (itemProvider: NSItemProvider) in item.attachments as [NSItemProvider] {
if itemProvider.hasItemConformingToTypeIdentifier(identifierType) {
println("why doesn't this happen?")
}
}
}
}
}
通知我println语句。他们从不执行。我基本上只是寻求某种确认事情正在发挥作用。我的共享扩展名在Safari中显示,但我不认为我的自定义JavaScript正在运行。希望有人能够发现我做错了什么。在此先感谢
答
你是正确的JS没有运行。这是因为你的Info.plist配置。 NSExtensionJavaScriptPreprocessingFile
需要是NSExtensionAttributes
的子密钥,而不是NSExtensionActivationRule
。类似于
<key>NSExtension</key>
<dict>
<key>NSExtensionAttributes</key>
<dict>
<key>NSExtensionJavaScriptPreprocessingFile</key>
<string>ExtensionPreProcessing</string>
<key>NSExtensionActivationRule</key>
<dict>
<key>NSExtensionActivationSupportsWebPageWithMaxCount</key>
<integer>1</integer>
<key>NSExtensionActivationSupportsWebURLWithMaxCount</key>
<integer>1</integer>
</dict>
</dict>
<key>NSExtensionMainStoryboard</key>
<string>MainInterface</string>
<key>NSExtensionPointIdentifier</key>
<string>com.apple.share-services</string>
</dict>
宾果。谢谢。 – Bret 2015-02-24 06:39:42
这会使JavaScript在Firefox和Chrome中运行吗? – 2016-11-17 09:43:23
我不知道。如果对你很重要,那么只需要大约5分钟的时间来尝试一下,看看会发生什么。 – 2016-11-17 17:09:58