1. ホーム
  2. objective-c

[解決済み] アプリケーションに有効な 'aps-environment' エンタイトルメント文字列が見つかりませんでした。

2023-07-22 15:41:05

質問

プッシュ通知をサポートするようにアプリを設定しようとしているのですが、次のようなエラーが発生します。 トークンの取得に失敗しました。Error Domain=NSCocoaErrorDomain Code=3000 "no valid 'aps-environment' entitlement string found for application" UserInfo=0x1f818fc0 {NSLocalizedDescription=no valid 'aps-environment' entitlement string found for application} {NSLocalizedDescription="aps-environment "etc}と表示されます。

  • アプリがプッシュ通知をサポートするようにしました (この時点では開発用のみ)。
  • プッシュ通知を有効にした後に、プロビジョニング プロファイルを作成しました。
  • バンドル識別子は、プロファイルに表示されているものと同じです。
  • プロファイルファイルには aps-environment という文字列があります。
  • プロジェクトとターゲットの両方で、"Code signing identity" セクションで、すべての値が私のプロビジョニング プロファイルになるように選択されていることを確認しました。

他にアイデアがありますか。ありがとうございます。

どのように解決するのですか?

私の場合、プロビジョニングプロファイルの中のものです。

security cms -D -i ~/Downloads/spolskyDevelop.mobileprovision 
...
<key>application-identifier</key>
<string>P5GM95Q9VV.com.dca.spolsky</string>
<key>aps-environment</key>
<string>development</string>

実際にビルドされたアプリ内のものと異なっていた(XcodeのLogsタブを見ればビルドされた場所がわかるはずです)

codesign -d --entitlements - '/Users/drew/Library/Developer/Xcode/DerivedData/spolsky-bdbtdfjeeywhqzccpmmceqvnhgtm/Build/Products/Debug-iphoneos/spolsky-ios.app'
<dict>
    <key>application-identifier</key>
    <string>Y2X6Z7Z2GR.com.dca.spolsky-ios</string>
    <key>get-task-allow</key>
    <true/>
    <key>keychain-access-groups</key>
    <array>
        <string>Y2X6Z7Z2GR.com.dca.spolsky-ios</string>
    </array>
</dict>

これは本当だった にもかかわらず の下にある "Currently Matches" のヒントテキストが正しいプロビジョニングプロファイルを表示していたにもかかわらず、です。 奇妙な話をさらに奇妙にするには、私が実行したとき、正しいプロビジョニング プロファイルがデバイスにインストールされていました(設定->一般->プロファイル)ので、プロビジョニング プロファイルが正しいと信じていました。 が起動したときに .

ヒントは、この2つのコマンドの出力の違いでした。

Y2X6Z7Z2GR .com.dca. spolsky-ios P5GM95Q9VV .com.dca. スポルスキー

太字の部分を一致させると、斜体の部分も自動的に一致するように変わりました。 また、securityとcodesignの出力が一致し、aps-entitlementのエラーも出なくなりました。

ここでの私の推測は、XCode が私のワイルドカードでない ID に対してワイルドカード スタイルのマッチを使用していたことです。 ("spolsky" は、結局のところ、ほぼ "spolsky-ios" です) そして、これが "Currently Matches" の出力の説明です。 しかし、ビルドチェーン内の何かがこれに対してより厳密であるため、これは 実際のワイルドカード ID にフォールバックします。