web-dev-qa-db-ja.com

アプリのユビキタスコンテナーをiOS 8のiCloud Driveに公開する

ユーザーがiCloudドライブを介してファイルをインポートおよびエクスポートできるiCloud対応アプリを開発しています。 UIDocumentPickerViewController(iOS 8)またはFinder(OS X Yosemite)のいずれかを使用してiCloudドライブを参照すると、Automator、Keynote、またはTextEdit。

私のアプリも、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>

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

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

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

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

  • 一部のApple iCloud Driveに表示されるアプリには、Info.plistにこれらのエントリがありません(例:NumbersおよびPages)。

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

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

  • 私はiOS 8ベータ5シミュレーター(およびYosemiteベータ5を使用してMac上のiCloudドライブディレクトリを表示します)(Edit/Note:これは同様に適用されますベータ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/>

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

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

編集:

私が試したもう2つのこと:

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

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

27
hagi

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

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

ICloud Driveや他のアプリのドキュメントディレクトリとの間でファイルを読み書きするためにドキュメントピッカーが必要な場合は、URLForUbiquityContainerIdentifier:を呼び出す必要はありません。アプリに独自のユビキタスコンテナーを持たせたい場合(およびiCloudドライブとドキュメントピッカーで公開する可能性がある場合)のみ、元の投稿で説明されている手順とURLForUbiquityContainerIdentifier:の呼び出しが必要です。

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

7
hagi

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

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

    <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ドライブに正しく表示されました。お役に立てれば!

14
Aaron Wright

Info.plistを編集したときに、バンドルのバージョン番号を上げるのを忘れたのではないでしょうか?これは WWDCセッション#234 の要件です。

13
roop

CFBundleVersionを変更すると機能するようです。

やってみてもいいと思います。 Apple Developer Forums から入手しました。

この作業があなたに役立つことを願っています。

3
Jim Tsai

今朝午前中、すべての投稿を読み、すべての変更を行った後、Yet Another Code Maker述べ、バンドルIDを変更します。バンドル用のコンテナを作成した後は、戻ってその可視性を変更してFinderに表示することはできないと思います。さまざまなinfo.plist値をすべて試しましたが、新しいバンドル名に変更してシステムに新しいバンドル名を作成させるまで、何も機能しませんでした。ちなみに、これはどこにも記載されていませんでしたが、バンドル名、NSUbiquitousContainer名、およびNSUbiquitousContainerNameはすべて異なる場合があります。これは私の場合です。これに多くの時間を費やした後、Finderに表示されているiCloudフォルダーのデバッグでまだ問題が発生している場合に備えて、GitHubに簡単なサンプルアプリを配置することを考えました-見つけることができます here 必要な手順はすべて [〜#〜] readme [〜#〜] で概説されています。

2
profRic

私の場合(Xcode 7およびiOS 9)、それを機能させた唯一のことは、複数回試行した後、新しいバンドル識別子を使用することだけでした(クラウドコンテナー識別子を変更する必要はありません。必ずコンテナーを選択してください) Apple Developer Member Centerで使用し、Xcodeでデフォルトの代わりにカスタムコンテナーを指定する).

実際、これはアプリケーションを初めて実行するときに、info.plistのNSUbiquitousContainersセクションを設定する必要があることを意味します。後で2番目のステップとして設定すると、機能しません...

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

[[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」では、ヨセミテとドキュメントピッカーの空のDocumentsディレクトリを実際に公開しています。

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

1
Ryan C. Spring

私はこれが古いスレッドであることを知っていますが、誰かが同じ問題に遭遇した場合に備えて:(上記のすべての提案を試した後)私のコンテナフォルダをiCloud Driveに表示させる唯一の方法は、アプリに一時ファイルを作成させることでしたDocumentsフォルダー内。するとすぐに、コンテナフォルダ(および作成したファイル)がMacに表示されました。これが実際にこのフォルダーを表示するためにファイルを作成する必要がある場合、私のアプリは読み取り専用アプリであるため(ユーザーがコンテナーフォルダーに追加したファイルのみを読み取るため)、これは少し面倒です。アプリが初めて起動されるとすぐに、コンテナーフォルダーが表示される必要があります。私は最初の打ち上げを検出する必要があると思います。

0
HLX74000

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

this Apple Developer Forum thread の返信でこのヒントを見つけました。

0
jki

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

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

名前の欠落が原因で表示されない可能性があります。

0
Erik

OSXアプリでも同じ問題が発生しました。

NSUbiquitousContainers設定はiCloudコンテナの作成時にのみ機能するようです。だから私は新しいApple ID(クリーンなiCloud環境を準備するため))を試してみましたが、うまくいくようになります。

0
nyamakawa

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

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

バンドルIDをハードコードする必要があります。また、バージョンを更新します。

(私はすべての答えを検討するまで、質問でこれに気づきませんでした)。

0
jasongregori