web-dev-qa-db-ja.com

containerURLForSecurityApplicationGroupIdentifierは、iOSシミュレーターでnilを返します

環境

IOS8と拡張機能でAppleはアプリグループコンテナを導入しました( 詳細はこちら )。

問題

NSFileManagerの_containerURLForSecurityApplicationGroupIdentifier:_メソッドを介して使用します。 AppStore(iOS8とiOS7の両方)での本番環境でうまく機能します。問題は、チームがXcode 6.1 (6A1052d)に更新されたため、メソッドがシミュレーターでnilを返すことです。

たくさん検索しましたが、手がかりを見つけることができませんでした。これでも 質問 または これ ここでは適用されません。

TLDR:質問

NSFileManagerの_containerURLForSecurityApplicationGroupIdentifier:_メソッドはシミュレーターで機能しますか?それを修正する方法はありますか?

21
Francescu

私は自分の側でこの問題を解決することができました。ドキュメントには

アプリには、指定したアプリケーショングループのcom.Apple.security.application-groups資格が必要です。 https://developer.Apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSFileManager_Class/index.html#//Apple_ref/occ/instm/NSFileManager/containerURLForSecurityApplicationGroupIdentifier

アプリのある時点で、アプリのターゲット/ビルド設定/コード署名/コード署名資格から資格ファイルを削除しました。デバッグとリリースの両方にYOUR_APP.entitlementsファイルを含める必要があります。私のデバッグにはそれが含まれていなかったので、シミュレーターで動作していませんでした

15
Matthieu Rouif

メソッドcontainerURLForSecurityApplicationGroupIdentifier:デバイスとシミュレータの両方で動作します。

グループをサポートするためにデータを共有する両方のターゲット(またはたとえばTargetとWatchKit Extension)をセットアップしていて、それがnilを返し続ける場合は、ターゲットの設定を確認することをお勧めします。

  1. ターゲット設定>一般>チーム> yourCompany署名チームをここで選択する必要があります。警告とFix This Issueボタンがある場合は、問題を解決してください:)

  2. [ターゲット設定]> [機能]> [アプリグループ]> [オン] +は、group.com.yourcompany.yourapp.sharedContainterグループ名(「sharedContainer」が私の選択名です)が選択され、黒(赤ではない)で表示されます。赤の場合、または警告が表示されて[この問題を修正]ボタンがある場合は、グループを更新するか、別のグループを作成します。

  3. ターゲット設定>ビルド設定>コード署名>コード署名エンタイトルメント:デバッグとリリースの両方のエンタイトルメントファイルを指します(yourApp/yourApp.entitlementsなど)

  4. ターゲット設定>ビルド設定>コード署名>コード署名ID:IDが上記で選択したチームの一部であることを確認してください。私はiOS Developerを使用します。

  5. ターゲット設定>ビルド設定>コード署名>プロビジョニングプロファイル:上記のように、使用しているPPが必要なチームのものであることを確認してください。自動に設定しました。

両方のターゲットデータの共有についてそれらを確認してください。

お役に立てば幸いです

22

ドキュメントは明確ではありませんが、グループ識別子では大文字と小文字が区別されることがわかりました。

4
respectTheCode

ContainerURLForSecurityApplicationGroupIdentifierは、xcode6.2を使用して実際のデバイスとシミュレーターの両方で機能することがわかりました。私もnilを取得したため、このスレッドに出くわしましたが、根本的な原因は「アプリグループ」名の入力エラーであることがわかりました。

さらに、チェックが必要なリストは次のとおりです。

  1. 「アプリグループ」がxcodeまたはWebコンソールのいずれかで作成されていることを確認してください https://developer.Apple.com
  2. 「Webコンソール:識別子->アプリID」の「開発」および「本番」で「アプリグループ」が「有効」になっていることを確認します
  3. 一致した「プロビジョニングプロファイル」が「アクティブ」であることを確認してください
  4. 含むアプリと拡張アプリの両方のエンタイトルメントのグループ名は、手順1で作成したものと一致する必要があります
  5. すべてのターゲットのバンドル識別子が 'Webコンソールのものと同じであることを確認してください:識別子->アプリID
  6. すべてのターゲット内の「チーム」がWebコンソールのものと一致することを確認してください
  7. 含まれているアプリと拡張アプリの両方のターゲットの[機能]タブで正しいグループを選択し、赤い色がないことを確認してください
  8. cmd + shift + kでxcodeキャッシュをクリーンアップします
  9. 再建して祈る
1
superZhen

メソッドcontainerURLForSecurityApplicationGroupIdentifier:私のシミュレーターで動作します。しかし、グループフォルダー内のすべてのファイルを削除すると(ユーザーがアプリでログアウトを実行した場合)、メソッドはXcode6.1の次の実行でnilを返します。これをXcode6.2とiOSSDK 8.2 Betaでもテストしましたが、機能しません。

コードは実際のデバイスで正常に実行されます。

私も上記の解決策を試しましたが成功しませんでした。

0
lahmar

私の場合、このエラーの理由はファイル"。com.Apple.mobile_container_manager.metadata.plist"であることがわかりました。このディレクトリからファイルを取得した後、その中のすべてのファイルを削除しました。そのため、このファイルも削除されました。そして、このファイルを削除すると、アプリはnilに対してcontainerURLForSecurityApplicationGroupIdentifierを返します

だから私は自分のコードをこれに変更しました:

    NSURL *groupPath = [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:YGGroupIdentifier];
    NSArray *fileArray = [fileManager contentsOfDirectoryAtPath:[groupPath path] error:nil];
    for (NSString *filename in fileArray)  {
        if (![filename hasPrefix:@".com"]) {
            [fileManager removeItemAtPath:[[groupPath path] stringByAppendingPathComponent:filename] error:nil];
        }
    }

今では、シミュレーターでもうまく機能します。

0
George

私にとっては、iOS Team Provisioning Profile(Simulatorで実行する必要はありません)にいくつかの混乱がありました。

IPhoneでアプリを実行するには、最初にデバッグ環境用にiOS Team Provisioning Profileを再構成する必要がありました。 containerURLForSecurityApplicationGroupIdentifier:の呼び出しは、デバイス上で完全に正常に機能しました。その後、私はシミュレーターに戻り、-そこに行きます-それもまた機能しました。

0
martn_st