31

ユーザーがiCloud Drive経由でファイルをインポートおよびエクスポートできるiCloud対応アプリを開発しています。(iOS 8) または Finder (OS X Yosemite)を使用して iCloud DriveUIDocumentPickerViewControllerを参照すると、Automator、Keynote、TextEdit などの他の iCloud-Drive 対応アプリによって作成/所有されているディレクトリが表示されます。

私たちのアプリがどこにでもあるドキュメント ディレクトリを iCloud Drive にも公開するようにしたいのですが、まだ解決できていません。前述のアプリのInfo.plistファイルのいくつかの中で、次のキーを発見しました。

<key>NSUbiquitousContainers</key>
<dict>
    <key>com.apple.TextEdit</key>
    <dict>
        <key>NSUbiquitousContainerIsDocumentScopePublic</key>
        <true/>
        <key>NSUbiquitousContainerSupportedFolderLevels</key>
        <string>Any</string>
    </dict>
</dict>

これらのキーはここにも文書化されていますが、より広範な主題に関する他の文書は見つかりませんでした。編集/注:私の質問に対する回答は含まれていませんが、ドキュメント ピッカー プログラミング ガイドは役立つリソースです。

上記のキー/値をアプリに追加しようとしましたが、効果がありませんでした。私が気づいた/試したこと:

  • サード パーティ製アプリの場合、iCloud コンテナーは次のように構成されますiCloud.$(CFBundleIdentifier)iCloud.TextEdit が純粋なバンドル識別子のみを使用する理由はわかりませんが、識別子については、接頭辞を付けた場合と付けない場合の両方の方法を試しました。iCloud.$(CFBundleIdentifier)また、ビルド時に PLIST の値のみが解決され、キーは解決されないように見えるため、バンドル識別子をハードコーディングする (つまり、 を使用しない) 必要があることも認識しています。

  • サブディレクトリをプログラムで (に<containerPath>/Documents) 追加したので、コンテナーは空ではありません。ただし、他のすべてのアプリのディレクトリも最初は空だったので、これは問題ではありません。

  • Info.plistiCloud Drive に表示される一部の Apple アプリでは、Numbers や Pages などにこれらのエントリがありません。

  • iCloud は正しく設定されており、 によって返された URL を使用して、ユビキタス コンテナーをプログラムで調べることができます[[NSFileManager defaultManager] URLForUbiquityContainerIdentifier:nil];

  • iCloud Drive が有効になっている iCloud アカウントにログインしています。で iCloud Drive のコンテンツを確認できますUIDocumentPickerViewController

  • 私は iOS 8 ベータ 5 シミュレーター (および Yosemite ベータ 5 を使用して Mac で iCloud Drive ディレクトリを表示) を使用しています (編集/注:これはベータ 6 にも同様に適用されます) 。

これは私の権利ファイルがどのように見えるかです(関連部分のみ)

<key>com.apple.developer.icloud-container-identifiers</key>
<array>
    <string>iCloud.$(CFBundleIdentifier)</string>
</array>
<key>com.apple.developer.icloud-services</key>
<array>
    <string>CloudDocuments</string>
</array>
<key>com.apple.developer.ubiquity-container-identifiers</key>
<array/>

Capabilities セクションで Xcode の UI を使用してこれを設定しました。最後のキーにエントリがない理由はわかりませんが、追加<string>iCloud.$(CFBundleIdentifier)</string>しても役に立ちません。代わりに、Capabilities UI で Xcode が不平を言うので、削除しました。編集/注: Xcode ベータ 6 では、これは修正されています。つまり、ユビキタス コンテナー識別子を設定する必要があり、Xcode がそれを修正できます。

元の質問:それで... バグですか? まだ機能しませんか?私はそれを間違っていますか?リリース ノートで既知の問題を見つけることができませんでした。

編集:

私が試した2つのこと:

  • NSUbiquitousContainerNameErikmitk の提案に従って、コンテナ固有の辞書に(オプションの)キー (+ 値) を追加します。

  • WWDC サンプル アプリの 1 つ(NewBox を探します)NSUbiquitousContainerIsDocumentScopePublicで行われているように、コンテナー固有のディクショナリではなく、キー/値のみを PLIST ルート ディクショナリに追加します。

4

12 に答える 12

19

アプリケーションで同様の問題が発生していました。次のことを行うことで、この作業を行うことができました。

  1. https://developer.apple.com/library/prerelease/ios/documentation/General/Conceptual/ExtensibilityPG/FileProvider.htmlのドキュメントに従って、NSUbiquitousContainers設定をファイルに追加します。関連するコードは次のとおりです。Info.plist

    <dict>
        <!-- ... other top-level Info.plist settings ... -->
        <key>NSUbiquitousContainers</key>
        <dict>
            <key>iCloud.com.example.MyApp</key>
            <dict>
                <key>NSUbiquitousContainerIsDocumentScopePublic</key>
                <true/>
                <key>NSUbiquitousContainerSupportedFolderLevels</key>
                <string>Any</string>
                <key>NSUbiquitousContainerName</key>
                <string>MyApp</string>
            </dict>
        </dict>
    </dict>
    
  2. 重要!次に、上記のNSUbiquitousContainerSupportedFolderLevels文字列値を からAnyに変更しましたOne

    <key>NSUbiquitousContainerSupportedFolderLevels</key>
    <string>One</string>
    
  3. 次に、そして最後にCFBundleVersion、より高いバージョンに変更する必要がありました。CFBundleShortVersionStringまた、新しいバージョンにもバンプしました。

ビルドして実行した後、アプリケーション アイコンのあるフォルダーが iCloud Drive に正しく表示されました。お役に立てれば!

于 2015-04-27T03:42:07.763 に答える
8

キャッチは[[NSFileManager defaultManager] URLForUbiquityContainerIdentifier:nil];、ディレクトリを初期化するために、少なくとも 1 回 (起動ごとではなく、おそらくバージョンごとに、またはそれぞれの PLIST エントリの 1 つを変更するときに) 呼び出す (または、既定のものでない場合は別のコンテナー識別子を使用して) ことです。roop's answer で示唆されているように、このステップはバンドルのバージョン番号の増加と組み合わせる必要があると思います。

問題のAPIを使用してプログラムでドキュメントディレクトリ*を調べることができると述べたように、私の質問はその点で混乱している可能性があることに気付きました。ただし、後で、おそらく残りのセットアップを正しく行う前に、そのコードをアプリから削除しました。ドキュメント ディレクトリに直接書き込むつもりはありません。ドキュメント ピッカーを使用するだけです。したがって、URL を取得する必要はありません。

ドキュメント ピッカーが必要なだけで、iCloud Drive または他のアプリのドキュメント ディレクトリからファイルを読み取り/保存する必要がある場合は、 を呼び出す必要はありませんURLForUbiquityContainerIdentifier:。アプリに独自のユビキタス コンテナーを持たせたい (そして潜在的にそれを iCloud ドライブとドキュメント ピッカーで公開したい) 場合にのみ、元の投稿に記載されている手順と への呼び出しURLForUbiquityContainerIdentifier:が必要です。

*ドキュメント ディレクトリについて言及するときは、ローカルのディレクトリではなく、ユビキタス コンテナー内のディレクトリを常に参照しています。

于 2014-08-19T09:09:54.127 に答える
4

を変更するCFBundleVersionと動作するようです。

お試しいただけると思います。これはApple Developer Forumsから入手しました。

これがうまくいくことを願っています。

于 2016-10-03T06:36:12.720 に答える
1

私のためにそれを修正したOPの発見の1つを強調したかっただけです:

また、バンドル識別子をハードコーディングする必要があることも認識しています (つまり、iCloud.$(CFBundleIdentifier))ビルド時に PLIST の値のみが解決され、キーは解決されないように見えるため、使用しないでください。

バンドル ID をハードコーディングする必要があります。バージョンアップも。

(すべての回答を確認するまで、質問でこれに気づきませんでした)。

于 2016-04-28T16:42:12.757 に答える
1

ドキュメントは見つかりませんでしたが、試行錯誤の結果、次のことがわかりました。

[[NSFileManager defaultManager] URLForUbiquityContainerIdentifier:@"com.apple.CloudDocs"]; 

ピッカーに表示されるドライブのベース URL を提供します。このベース URL を使用して、アプリにファイルを保存し、それを Yosemite 内の iCloud ドライブで見ることができました。

14.8.14 を編集

私はあなたのplist設定を試しました:

<key>NSUbiquitousContainers</key>
<dict>
    <key>iCloud.net.redacted.docTest</key>
    <dict>
        <key>NSUbiquitousContainerIsDocumentScopePublic</key>
        <true/>
        <key>NSUbiquitousContainerSupportedFolderLevels</key>
        <string>Any</string>
    </dict>
</dict>

私の小さな使い捨てのテスト アプリ「docTest」では、実際に Yosemite とドキュメント ピッカーに空の Documents ディレクトリが表示されます。

スクリーンショットhttp://spring-appstudio.com/picker-view.png

于 2014-08-13T20:15:12.713 に答える
1

このドキュメント ページの .plist エントリには追加のエントリがあります。

<key>NSUbiquitousContainerName</key>
<string>MyApp</string>

欠落している名前が表示を妨げている可能性があります。

于 2014-08-08T13:07:26.157 に答える
1

どこにも文書化されていませんがDocuments、コンテナーにフォルダーを追加して、そこにファイルを保存してみてください。

このヒントは、この Apple Developer Forum スレッドの返信で見つかりました。

于 2020-02-11T17:44:06.027 に答える