iOS共享扩展在Chrome中不起作用 适用于Safari,不适用于Chrome
也许这个问题很简单也很愚蠢,但我对iOS开发还不熟悉,我找不到任何正确的解决方案来解决这个问题 我需要得到: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>
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
}
}
}