如何获取 iOS 共享扩展以从 Safari 而不是 URL 获取网页内容
How to get a iOS share extension to get web page content from Safari instead of URL
我有一个用 swift 编写的工作共享扩展。当我从 Safari 测试共享操作时,我总是只得到 URL 类型 (kUTTypeURL)。
我想要的是获取用户正在查看的内容的某种形式的呈现版本(PDF 或 HTML?)。由于身份验证问题等原因,使用 URL 并在 webview 中打开它是不可行的。
我试过很多不同的激活规则都没有改变。这是我目前使用的:
<key>NSExtensionActivationRule</key>
<dict>
<key>NSExtensionActivationSupportsFileWithMaxCount</key>
<integer>1</integer>
<key>NSExtensionActivationSupportsImageWithMaxCount</key>
<integer>20</integer>
<key>NSExtensionActivationSupportsMovieWithMaxCount</key>
<integer>0</integer>
<key>NSExtensionActivationSupportsText</key>
<true/>
<key>NSExtensionActivationSupportsWebPageWithMaxCount</key>
<integer>1</integer>
<key>NSExtensionActivationSupportsWebURLWithMaxCount</key>
<integer>1</integer>
</dict>
我的控制器看起来像这样 - 当 运行 来自 Safari 时,它总是只有一种附件类型 - URL:
override func didSelectPost() {
if let item = extensionContext?.inputItems.first as? NSExtensionItem {
if let attachments = item.attachments {
for attachment: NSItemProvider in attachments {
if attachment.hasItemConformingToTypeIdentifier(kUTTypePropertyList as String) {
attachment.loadItem(forTypeIdentifier: kUTTypePropertyList as String, options: nil, completionHandler: { (data, error) in
// Do stuff with this content now
self.extensionContext?.completeRequest(returningItems: [], completionHandler:nil)
})
}
if attachment.hasItemConformingToTypeIdentifier(kUTTypeURL as String) {
attachment.loadItem(forTypeIdentifier: kUTTypeURL as String, options: nil, completionHandler: { (url, error) in
if let shareURL = url as? NSURL {
// Do stuff with your URL now.
}
self.extensionContext?.completeRequest(returningItems: [], completionHandler:nil)
})
}
}
}
}
}
我见过的其他方法使用 javascript 文件遍历 DOM 但没有看到很好的例子,我不清楚这是否对我有帮助。
关键在于在您的 info.plist 文件中使用这一行:
<key>NSExtensionAttributes</key>
<dict>
<key>NSExtensionJavaScriptPreprocessingFile</key>
<string>Action</string>
<key>NSExtensionActivationRule</key>
...your should be fine...
</dict>
在 NSExtensionJavaScriptPreprocessingFile
处指定包含 javascript 文件的 .js 文件的名称,该文件必须包含名为 ExtensionPreprocessingJS
的全局对象。然后您应该在您的代码中搜索符合 kUTTypePropertyList
的项目(看起来您已经在查看您的代码)。
这是您应该做的一个简短列表,问问您是否需要更多的东西,如果您也从这里开始,很容易在互联网上找到更多的数据。
我有一个用 swift 编写的工作共享扩展。当我从 Safari 测试共享操作时,我总是只得到 URL 类型 (kUTTypeURL)。
我想要的是获取用户正在查看的内容的某种形式的呈现版本(PDF 或 HTML?)。由于身份验证问题等原因,使用 URL 并在 webview 中打开它是不可行的。
我试过很多不同的激活规则都没有改变。这是我目前使用的:
<key>NSExtensionActivationRule</key>
<dict>
<key>NSExtensionActivationSupportsFileWithMaxCount</key>
<integer>1</integer>
<key>NSExtensionActivationSupportsImageWithMaxCount</key>
<integer>20</integer>
<key>NSExtensionActivationSupportsMovieWithMaxCount</key>
<integer>0</integer>
<key>NSExtensionActivationSupportsText</key>
<true/>
<key>NSExtensionActivationSupportsWebPageWithMaxCount</key>
<integer>1</integer>
<key>NSExtensionActivationSupportsWebURLWithMaxCount</key>
<integer>1</integer>
</dict>
我的控制器看起来像这样 - 当 运行 来自 Safari 时,它总是只有一种附件类型 - URL:
override func didSelectPost() {
if let item = extensionContext?.inputItems.first as? NSExtensionItem {
if let attachments = item.attachments {
for attachment: NSItemProvider in attachments {
if attachment.hasItemConformingToTypeIdentifier(kUTTypePropertyList as String) {
attachment.loadItem(forTypeIdentifier: kUTTypePropertyList as String, options: nil, completionHandler: { (data, error) in
// Do stuff with this content now
self.extensionContext?.completeRequest(returningItems: [], completionHandler:nil)
})
}
if attachment.hasItemConformingToTypeIdentifier(kUTTypeURL as String) {
attachment.loadItem(forTypeIdentifier: kUTTypeURL as String, options: nil, completionHandler: { (url, error) in
if let shareURL = url as? NSURL {
// Do stuff with your URL now.
}
self.extensionContext?.completeRequest(returningItems: [], completionHandler:nil)
})
}
}
}
}
}
我见过的其他方法使用 javascript 文件遍历 DOM 但没有看到很好的例子,我不清楚这是否对我有帮助。
关键在于在您的 info.plist 文件中使用这一行:
<key>NSExtensionAttributes</key>
<dict>
<key>NSExtensionJavaScriptPreprocessingFile</key>
<string>Action</string>
<key>NSExtensionActivationRule</key>
...your should be fine...
</dict>
在 NSExtensionJavaScriptPreprocessingFile
处指定包含 javascript 文件的 .js 文件的名称,该文件必须包含名为 ExtensionPreprocessingJS
的全局对象。然后您应该在您的代码中搜索符合 kUTTypePropertyList
的项目(看起来您已经在查看您的代码)。
这是您应该做的一个简短列表,问问您是否需要更多的东西,如果您也从这里开始,很容易在互联网上找到更多的数据。