尝试检索文件的操作扩展
Action Extension Trying to Retrieve a File
我正在尝试在 iOS 中创建一个动作扩展 8. 从一个新项目开始,我创建了一个单视图应用程序并为动作扩展添加了一个新目标。默认操作扩展模板配置为显示图像。当我从照片分享时,图像显示在扩展的视图控制器上,因此基本管道都可以正常工作。
真正的用例是我想从 Dropbox(或 Air Sharing,或其他)共享一个文本文件到应用程序并让应用程序处理该文件。
首先我改了info.plist:
<key>NSExtension</key>
<dict>
<key>NSExtensionAttributes</key>
<dict>
<key>NSExtensionActivationRule</key>
<dict>
<key>NSExtensionActivationSupportsFileWithMaxCount</key>
<string>1</string>
<key>NSExtensionActivationSupportsText</key>
<string>1</string>
</dict>
</dict>
<key>NSExtensionMainStoryboard</key>
<string>MainInterface</string>
<key>NSExtensionPointIdentifier</key>
<string>com.apple.ui-services</string>
</dict>
我将 testfile.text
添加到 Dropbox,当我在 Dropbox 应用程序中导航到它并点击共享按钮时,我的扩展程序出现了,因此激活规则似乎有效。
当我记录扩展上下文时,这就是我得到的 self.extensionContext.inputItems
:
self.extensionContext.inputItems= (
"<NSExtensionItem: 0x15657180> - userInfo: {\nNSExtensionItemAttachmentsKey = (\n \"<NSItemProvider: 0x15658c30> {types = (\n \\"public.url\\"\n)}\"\n );\n}")
有一个项目提供者的类型为 public.url
。所以我像这样修改了 viewDidLoad 中的模板代码以查找类型 kUTTypeURL
:
for (NSExtensionItem *item in self.extensionContext.inputItems) {
for (NSItemProvider *itemProvider in item.attachments) {
if ([itemProvider hasItemConformingToTypeIdentifier:(NSString *)kUTTypeURL]) {
__weak UITextView *textView = self.textView;
[itemProvider loadItemForTypeIdentifier:(NSString *)kUTTypeURL options:nil completionHandler:^(NSURL *url, NSError *error) {
if(url) {
NSString *text = [[NSString alloc] initWithContentsOfURL:url encoding:NSUTF8StringEncoding error:&error]; // just using this to test
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
[textView setText:text];
}];
url
是这样的(我在中间更改了 id 字符串):
https://www.dropbox.com/s/lskd8jejbj8wpo/testfile.text?dl=0
在 initWithContentsOfURL
之后我收到了短信,但这不是我想要的。测试文件大约 300 字节。返回的是大约 70,000 字节的元数据。
如何获取文件?我使用了错误的类型标识符吗?
注意:如果我将文件共享到 Evernote 或 TapForms,它就会直接进入,所以它与文件无关。
您返回的 URL 类型用于与人共享,因此它 returns 是一个预览页面,用户可以在其中选择下载文件等。如果您而不是需要以编程方式下载原始文件内容,您需要先修改 link 的参数。比如你假设的例子:
https://www.dropbox.com/s/lskd8jejbj8wpo/testfile.text?dl=0
可以更改为:
https://www.dropbox.com/s/lskd8jejbj8wpo/testfile.text?dl=1
只要您的代码遵循 URL 返回的重定向,您就可以下载文件内容。
有关这方面的更多信息,请参阅这篇帮助文章:
我正在尝试在 iOS 中创建一个动作扩展 8. 从一个新项目开始,我创建了一个单视图应用程序并为动作扩展添加了一个新目标。默认操作扩展模板配置为显示图像。当我从照片分享时,图像显示在扩展的视图控制器上,因此基本管道都可以正常工作。
真正的用例是我想从 Dropbox(或 Air Sharing,或其他)共享一个文本文件到应用程序并让应用程序处理该文件。
首先我改了info.plist:
<key>NSExtension</key>
<dict>
<key>NSExtensionAttributes</key>
<dict>
<key>NSExtensionActivationRule</key>
<dict>
<key>NSExtensionActivationSupportsFileWithMaxCount</key>
<string>1</string>
<key>NSExtensionActivationSupportsText</key>
<string>1</string>
</dict>
</dict>
<key>NSExtensionMainStoryboard</key>
<string>MainInterface</string>
<key>NSExtensionPointIdentifier</key>
<string>com.apple.ui-services</string>
</dict>
我将 testfile.text
添加到 Dropbox,当我在 Dropbox 应用程序中导航到它并点击共享按钮时,我的扩展程序出现了,因此激活规则似乎有效。
当我记录扩展上下文时,这就是我得到的 self.extensionContext.inputItems
:
self.extensionContext.inputItems= (
"<NSExtensionItem: 0x15657180> - userInfo: {\nNSExtensionItemAttachmentsKey = (\n \"<NSItemProvider: 0x15658c30> {types = (\n \\"public.url\\"\n)}\"\n );\n}")
有一个项目提供者的类型为 public.url
。所以我像这样修改了 viewDidLoad 中的模板代码以查找类型 kUTTypeURL
:
for (NSExtensionItem *item in self.extensionContext.inputItems) {
for (NSItemProvider *itemProvider in item.attachments) {
if ([itemProvider hasItemConformingToTypeIdentifier:(NSString *)kUTTypeURL]) {
__weak UITextView *textView = self.textView;
[itemProvider loadItemForTypeIdentifier:(NSString *)kUTTypeURL options:nil completionHandler:^(NSURL *url, NSError *error) {
if(url) {
NSString *text = [[NSString alloc] initWithContentsOfURL:url encoding:NSUTF8StringEncoding error:&error]; // just using this to test
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
[textView setText:text];
}];
url
是这样的(我在中间更改了 id 字符串):
https://www.dropbox.com/s/lskd8jejbj8wpo/testfile.text?dl=0
在 initWithContentsOfURL
之后我收到了短信,但这不是我想要的。测试文件大约 300 字节。返回的是大约 70,000 字节的元数据。
如何获取文件?我使用了错误的类型标识符吗?
注意:如果我将文件共享到 Evernote 或 TapForms,它就会直接进入,所以它与文件无关。
您返回的 URL 类型用于与人共享,因此它 returns 是一个预览页面,用户可以在其中选择下载文件等。如果您而不是需要以编程方式下载原始文件内容,您需要先修改 link 的参数。比如你假设的例子:
https://www.dropbox.com/s/lskd8jejbj8wpo/testfile.text?dl=0
可以更改为:
https://www.dropbox.com/s/lskd8jejbj8wpo/testfile.text?dl=1
只要您的代码遵循 URL 返回的重定向,您就可以下载文件内容。
有关这方面的更多信息,请参阅这篇帮助文章: