iOS Share Extension is not working in Chrome
In my app I've made it work, however it was some time ago and I don't remember which exact steps are necessary, so I'll post my setup in hopes it will serve as a drop in solution.
The first issue I see in your plist is a 0 count for WebURLs.
This is a part of my extension's .plist. I think that allowing arbitrary loads has nothing to do with sharing and it was needed for accessing my server, nevertheless I'll put it here for reference.
<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>
My controller's part of code responsible for getting a URL:
// MARK: - NSExtensionRequestHandlingextension 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() } }}
As for getting the site's name, well there are a few ways I think. One is to use the JS script that you already have in your project, another is to see whether the provider has an item with a text type (containing the site's name) but they are browser specific (some work only for Safari, some for browsers like Chrome). I chose to go about it in a different way, I use a fake WKWebView (which is never added to view hierarchy, it's just a property) and make a request with the url that I got from the provider. Then I'm able to intercept the site's name from it's JS code like so:
func setupHiddenWebView() { hiddenWebView = WKWebView() hiddenWebView?.navigationDelegate = self}func setupForURL(url: NSURL) { (...) hiddenWebView?.loadRequest(NSURLRequest(URL: url))}// MARK: - WKNavigationDelegateextension 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 } }}
Add NSExtensionActivationSupportsText and NSExtensionActivationSupportsWebPageWithMaxCount under NSExtensionActivationRule with the type as Number and set them to 1.
That was what did it for me.