iOS Share Extension is not working in Chrome iOS Share Extension is not working in Chrome google-chrome google-chrome

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.