1

iOS 8 でアクション拡張機能を作成しようとしています。新しいプロジェクトから始めて、単一のビュー アプリケーションを作成し、アクション拡張機能の新しいターゲットを追加しました。デフォルトの Action Extension テンプレートは、画像を表示するように構成されています。写真から共有すると、拡張機能のビュー コントローラーに画像が表示されるので、基本的な配管はすべて機能しています。

実際の使用例は、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>

Dropboxに追加testfile.textし、Dropbox アプリでそこに移動して共有ボタンをタップすると、拡張機能が表示され、アクティベーション ルールが機能しているように見えます。

拡張コンテキストをログに記録すると、次のようになりますself.extensionContext.inputItems

self.extensionContext.inputItems= (
    "<NSExtensionItem: 0x15657180> - userInfo: {\nNSExtensionItemAttachmentsKey =     (\n        \"<NSItemProvider: 0x15658c30> {types = (\\n    \\\"public.url\\\"\\n)}\"\n    );\n}")

のタイプの項目プロバイダーが 1 つありますpublic.url。そこで、 type を探すために、 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 に共有すると、ファイルはすぐに共有されるため、ファイルに関するものではありません。

4

1 に答える 1

2

返される URL のタイプは人間と共有することを目的としているため、ユーザーがファイルのダウンロードなどを選択できるプレビュー ページが返されます。元のファイル コンテンツをプログラムでダウンロードする必要がある場合は、最初にリンクのパラメーターを変更する必要があります。たとえば、架空の例:

https://www.dropbox.com/s/lskd8jejbj8wpo/testfile.text?dl=0

次のように変更できます。

https://www.dropbox.com/s/lskd8jejbj8wpo/testfile.text?dl=1

コードが URL によって返されるリダイレクトに従っている限り、ファイル コンテンツをダウンロードできます。

詳細については、次のヘルプ記事を参照してください。

https://www.dropbox.com/help/201

于 2015-02-10T18:59:03.853 に答える