iOS共享扩展程序在Chrome中无法使用

适用于Safari,不适用于Chrome

也许这个问题很简单和愚蠢,但我是iOS开发新手,我找不到任何正确的解决scheme来解决这个问题。

我需要得到:
1)页面的url
2)页面名称

延期

的Info.plist

<dict> <key>NSExtensionAttributes</key> <dict> <key>NSExtensionActivationRule</key> <dict> <key>NSExrensionActivationSupportsText</key> <true/> <key>NSExtensionActivationSupportsFileWithMaxCount</key> <integer>1</integer> <key>NSExtensionActivationSupportsImageWithMaxCount</key> <integer>1</integer> <key>NSExtensionActivationSupportsMovieWithMaxCount</key> <integer>20</integer> <key>NSExtensionActivationSupportsWebPageWithMaxCount</key> <integer>1</integer> <key>NSExtensionActivationSupportsWebURLWithMaxCount</key> <integer>0</integer> </dict> <key>NSExtensionJavaScriptPreprocessingFile</key> <string>DemoPreprocessor</string> </dict> <key>NSExtensionMainStoryboard</key> <string>MainInterface</string> <key>NSExtensionPointIdentifier</key> <string>com.apple.share-services</string> </dict> 

我已经添加了更多的Chrome,但它仍然无法正常工作。 对于Safari来说,这已经足够了:

 NSExtensionActivationSupportsWebPageWithMaxCount, NSExtensionActivationSupportsWebURLWithMaxCount, NSExrensionActivationSupportsText, NSExtensionJavaScriptPreprocessingFile 

我尝试了三种方法,使用和不使用DemoPreprocessor.js 。 但是,所有这些都不适用于Chrome:

1. ShareViewController.swift

 override func viewDidLoad() { super.viewDidLoad() let items = extensionContext?.inputItems var itemProvider: NSItemProvider? if items != nil && items!.isEmpty == false { let item = items![0] as! NSExtensionItem if let attachments = item.attachments { if !attachments.isEmpty { itemProvider = (attachments[0] as? NSItemProvider)! } } } let urlType = kUTTypePropertyList as String if ((itemProvider?.hasItemConformingToTypeIdentifier(urlType)) != nil) { itemProvider?.loadItemForTypeIdentifier(urlType, options: nil, completionHandler: { (item: NSSecureCoding?, error: NSError!) -> Void in if let resultDict = item as? NSDictionary { self.linkName = resultDict[NSExtensionJavaScriptPreprocessingResultsKey]!["URL"] as! String self.linkUrl = resultDict[NSExtensionJavaScriptPreprocessingResultsKey]!["title"] as! String } }) } } 

2 ShareViewController.swift

 override func viewDidLoad() { super.viewDidLoad() let items = extensionContext?.inputItems var itemProvider: NSItemProvider? if items != nil && items!.isEmpty == false { let item = items![0] as! NSExtensionItem if let attachments = item.attachments { if !attachments.isEmpty { itemProvider = (attachments[0] as? NSItemProvider)! } } } let urlType = kUTTypeURL as NSString as String if ((itemProvider?.hasItemConformingToTypeIdentifier(urlType)) != nil) { itemProvider?.loadItemForTypeIdentifier(urlType, options: nil, completionHandler: { item, error in self.linkName = self.contentText self.linkUrl = "\(item!)" }) } } 

3 ShareViewController.swift

 override func viewDidLoad() { super.viewDidLoad() let items = extensionContext?.inputItems var itemProvider: NSItemProvider? if items != nil && items!.isEmpty == false { let item = items![0] as! NSExtensionItem if let attachments = item.attachments { if !attachments.isEmpty { itemProvider = (attachments[0] as? NSItemProvider)! } } } if self.linkUrl.characters.count < 1 { if ((itemProvider?.hasItemConformingToTypeIdentifier("public.url")) != nil) { itemProvider?.loadItemForTypeIdentifier("public.url", options: nil, completionHandler: { item, error in self.linkUrl = "\(item!)" }) } } } 

DemoPreprocessor.js

 var MyPreprocessor = function() {}; MyPreprocessor.prototype = { run: function(arguments) { arguments.completionFunction({"URL": document.URL, "pageSource": document.documentElement.outerHTML, "title": document.title, "selection": window.getSelection().toString()}); } }; var ExtensionPreprocessingJS = new MyPreprocessor; 

在我的应用程序中,我已经使其工作,但是它是前一段时间,我不记得哪个确切的步骤是必要的,所以我会发布我的设置,希望它可以作为一个解决scheme的下降。

我在你的plist中看到的第一个问题是WebURL的0计数。

这是我的扩展名.plist的一部分。 我认为,允许任意加载与共享无关,这是访问我的服务器所需要的,但我会把它放在这里作为参考。

 <key>NSAppTransportSecurity</key> <dict> <key>NSAllowsArbitraryLoads</key> <true/> </dict> <key>NSExtension</key> <dict> <key>NSExtensionAttributes</key> <dict> <key>NSExtensionActivationRule</key> <dict> <key>NSExtensionActivationSupportsImageWithMaxCount</key> <integer>1</integer> <key>NSExtensionActivationSupportsWebURLWithMaxCount</key> <integer>1</integer> </dict> </dict> <key>NSExtensionPointIdentifier</key> <string>com.apple.share-services</string> <key>NSExtensionPrincipalClass</key> <string>ShareViewController</string> </dict> 

我的控制器负责获取URL的代码部分:

 // MARK: - NSExtensionRequestHandling extension ShareViewController { override func beginRequestWithExtensionContext(context: NSExtensionContext) { super.beginRequestWithExtensionContext(context) guard let provider = (context.inputItems.first?.attachments as? [NSItemProvider])?.first else { return cancel() } if provider.hasItemConformingToTypeIdentifier(kUTTypeURL as String) { provider.loadItemForTypeIdentifier(kUTTypeURL as String, options: nil) { url, error in guard let url = url as? NSURL else { return self.cancel() } // do what you want with the url } } else { cancel() } } } 

至于获取网站的名字,以及我认为有几种方法。 一个是使用你已经在你的项目中的JS脚本,另一个是查看提供者是否有一个文本types的项目(包含网站的名称),但它们是浏览器特定的(一些只适用于Safari,一些适用于浏览器像Chrome)。 我select了以不同的方式来处理它,我使用了一个假的WKWebView(它永远不会被添加到视图层次结构中,它只是一个属性),并使用我从提供者那里得到的URL发出请求。 然后,我可以从它的JS代码拦截网站的名称,如下所示:

 func setupHiddenWebView() { hiddenWebView = WKWebView() hiddenWebView?.navigationDelegate = self } func setupForURL(url: NSURL) { (...) hiddenWebView?.loadRequest(NSURLRequest(URL: url)) } // MARK: - WKNavigationDelegate extension ShareView: WKNavigationDelegate { func webView(webView: WKWebView, didFinishNavigation navigation: WKNavigation!) { webView.evaluateJavaScript("document.title") { result, error in guard let title = result as? String else { return } // do what you want with the page's title } } } 

在NSExtensionActivationRule下添加types为Number的NSExtensionActivationSupportsText和NSExtensionActivationSupportsWebPageWithMaxCount,并将它们设置为1。

那对我来说就是这样。