也许问题很简单而且很愚蠢,但我是 iOS开发的新手,我找不到任何正确的解决方案来解决这个问题。
我需要得到:
1)页面网址
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:
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
}
})
}
}
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!)"
})
}
}
}
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;
答案 0 :(得分:3)
在我的应用程序中我已经开始工作了,但是不久之前我还不记得哪些步骤是必要的,所以我会发布我的设置,希望它可以作为解决方案的下降。
我在你的plist中看到的第一个问题是WebURLs的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>
我的控制器负责获取网址的代码部分:
// 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脚本,另一种是查看提供者是否具有文本类型的项目(包含网站名称),但它们是特定于浏览器的(有些仅适用于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
}
}
}
答案 1 :(得分:0)
在NSExtensionActivationRule下添加NSExtensionActivationSupportsText和NSExtensionActivationSupportsWebPageWithMaxCount,类型为Number,并将它们设置为1。
这就是为我做的事情。