iOS共享扩展在Chrome中不起作用 适用于Safari,不适用于Chrome

iOS共享扩展在Chrome中不起作用 适用于Safari,不适用于Chrome,ios,swift,google-chrome,google-chrome-os,ios-extensions,Ios,Swift,Google Chrome,Google Chrome Os,Ios Extensions,也许这个问题很简单也很愚蠢,但我对iOS开发还不熟悉,我找不到任何正确的解决方案来解决这个问题 我需要得到: 1) 页面url 2) 页面名称 延伸 Info.plist <dict> <key>NSExtensionAttributes</key> <dict> <key>NSExtensionActivationRule</key> <dict>

也许这个问题很简单也很愚蠢,但我对iOS开发还不熟悉,我找不到任何正确的解决方案来解决这个问题

我需要得到:
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>
我尝试了三种方法,有DemoPreprocessor.js和没有DemoPreprocessor.js。但这些都不适用于Chrome:

1.ShareViewController.swift 2 ShareViewController.swift 3.ShareViewController.swift
在我的应用程序中,我已经让它工作了,但是那是很久以前的事了,我不记得具体的步骤是必要的,所以我将发布我的设置,希望它能作为一个临时解决方案

我在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>
至于获得网站名称,我认为有几种方法。一个是使用项目中已有的JS脚本,另一个是查看提供者是否有文本类型(包含站点名称)的项,但它们是特定于浏览器的(有些只适用于Safari,有些适用于Chrome等浏览器)。我选择了另一种方式,我使用了一个假的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下添加NSExtensionActivationSupportsText和NSExtensionActivationSupportsWebPageWithMaxCount,并将其设置为1


这就是我所做的。

@Eric我需要删除swift标签吗?@Eric我认为plist-manifest、ShareViewController.swift、DemoPreprocessor.js是相关的,因为我读了一些文档、问题、答案,人们在那里写道一些组合是有效的(有PreprocessingJS,有些没有,有不同的NSExtensionActivationRule)。但我尝试的只是在Safari中工作,而不是在ChromeCan中工作。你能澄清代码吗?hiddenWebview没有声明,(…)不清楚,也不清楚你为什么要使用扩展,你到底在扩展什么,以及出于什么原因。谢谢!
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!)"
       })
    }

}
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!)"
            })
        }
    }

}
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;
<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>
// 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()
        }
    }
}
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
        }
    }
}