2011-11-03 3 views
12

私はiPhone applicationのデフォルト設定を少し変更して更新しています。私はそれを最後に構築して以来、しばらくしていたので、Xcodeを4.2にアップグレードし、最新のビルドにiOS 5サポートを含めました。iOS Keychain SecItemAddは-25243を返す

私はデバイス上でテストするために行くとき、私は、次のアサーションエラーを取得:

2011-11-02 20:57:18.869 RoseBandwidth[903:707] Tried to add item, got result: -25243 
2011-11-02 20:57:18.870 RoseBandwidth[903:707] *** Assertion failure in -[KeychainItemWrapper writeToKeychain], /Users/tim/code/RoseBandwidth/Classes/KeychainItemWrapper.m:312 
2011-11-02 20:57:18.872 RoseBandwidth[903:707] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Couldn't add the Keychain Item.' 

私はAppleのGenericKeychain projectからKeychainItemWrapperクラスの実装を使用しています。このエラーは、シミュレータではなく、デバイス上にしか現れないことに注意する必要があります(そして、プラットフォーム間のアクセスグループの制限の違いを認識していますが、通常、実際のハードウェアではなくシミュレータ上で問題を引き起こしたと思います)。

なぜこのエラーが戻ってきますか?私はアプリのキーチェーン関連の部分には何も触れていません。以前と同じようにデータを格納し、取得します。

答えて

18

さて、私はあなたのプロジェクトを構築することができませんでしたが、How to share keychain data between iOS applicationsから、資格ファイルを確認したいと思うかもしれません。少なくともgithubプロジェクトでは、キーチェーンアクセスグループに何も指定されていませんでした。

+0

もし私ができれば、私はあなたを何度もupvoteしていました - その答えは完全に魔法のようでした。私は、途中で資格ファイルを失ってしまったので、それらを再度有効にして(しばらくの間プロビジョニング・プロファイルで遊んで)、この問題が修正されました。ありがとう! – Tim

9

ここで終わることになる将来の調査者のために、-25243エラー(つまり、No access control、BTWを意味する)の別の原因がシミュレータ上で実行されています。

私の最も良い理論は、アプリのプロビジョニングプロファイル(またはその署名)は、アプリがそのバンドルシードがどのようになっているかを知る方法です。バンドルシードは、キーチェーンのアクセスグループ名の一部である必要があります。しかし、シミュレータ上で実行されるアプリケーションは署名されていないので、指定したコードシードがkeychain-access-groupでない(または異なる?)バンドルシードがあります。

または何か。それはすべてあまりにも文書化されていません、何が何であるかを伝えるのは難しいです。それをデバイス上で実行し、それが役立つかどうかを確認してください。

+0

これは良い点です - それを上げていただきありがとうございます。私は自分のオリジナルの質問で、Appleの[KeychainItemWrapper](https://developer.apple.com/library/ios/#samplecode/GenericKeychain/Listings/Classes_KeychainItemWrapper_m.html#//apple_ref/doc/uid/DTS40007797 -Classes_KeychainItemWrapper_m-DontLinkElementID_10)クラス。これは、アプリケーションがシミュレータ上で実行されているかどうかをチェックするコンパイラの '#if'句を含みます。そのラッパーを使用していない人は予防措置を講ずる必要があります。 – Tim

+0

ありがとう、ジェームズ。助けてくれました – makaron

3

私はコードに触れなかったとしても、シミュレータで時々同じエラーが発生します。シミュレータをリセットすると、私の問題が解決します。

この質問は/シミュレータリセットする方法を答えてください:他の人のようhttps://stackoverflow.com/a/3442326

+0

+1:まあ、これは迷惑なことです...私はシミュレータと同じ問題を抱えています(そして、リセットはそれを修正します)が、私はそれがデバイス上で起こっていないと思います。あなたはデバイス上でこれがランダムに起こるのを見たことがありますか? –

+0

いいえ、これまでのところこのエラーは見られませんでした。 – ToniTornado

1

は、デバイスに、指摘されているエラー-25243を構築し、多くの場合、あなたが権限を持っていないキーチェーンアクセスグループにアクセスしようとによって引き起こされますために。 (Entitlements.plistファイルまたはプロビジョニングプロファイルにはありません)

しかし、シミュレータでは別の原因が考えられます。シミュレータはキーチェーンアクセスグループをサポートしていません。のキーチェーン項目にkSecAttrAccessGroupプロパティを設定し、それを書き込もうとすると-25243エラーコードが表示されます。あなたが作成する必要が

:このエラーを取得し、2つのアプリケーションの間で「共有キーチェーンアクセス」を達成しようとしているあなたのそれらのために

// Ignore the access group if running on the iPhone simulator. 
// 
// Apps that are built for the simulator aren't signed, so there's no keychain access group 
// for the simulator to check. This means that all apps can see all keychain items when run 
// on the simulator. 
// 
// If a SecItem contains an access group attribute, SecItemAdd and SecItemUpdate on the 
// simulator will return -25243 (errSecNoAccessForItem). 
4

:FYI

、AppleのGenericKeychainのサンプルコードは、このコメントがあります「機能」で「共有キーチェーンアクセス」を最初にアクティブにしたときに選択した同じチームIDを持つアプリのアプリID。。 Apple Member Center

その後、あなたはそのアプリケーションイドからプロビジョニングプロファイルを作成し、コンピュータにダウンロードする必要があります(ダブルX-コードをインストールするには、それをクリックしてください)

私はあなたを想定しています。ここでアプリIDを作成あなたのApple開発者アカウントに関連付けられている一意のテキスト識別子です:enter image description here

"SharedKeychain"にアクセスするには、 "Apple ID Prefix"キーチェーンからの書き込みや読み取りを行う前に、このように実装する必要があります

keychainAccessGroupName = "AB123CDE45.myKeyChainGroup"

あなたは更なる情報については、このチュートリアルをチェックアウトすることができます:Share Keychain between iOS apps.

お役に立てば幸いです。

0

プロダクション証明書とプロビジョニングプロファイルを使用していたとき、これは私にとっては役に立ちました。デバッグを使用できませんでした。私の経験で

0

私はSecItemAdd()機能にkCFBooleanTrue値でkSecMatchLimitOnekSecReturnDatakSecMatchLimitに合格しようとしていたことに気づいたとき、私はその戻り値-25243を取得します。私はそれらを削除し、アプリIDとプロビジョニングプロファイルをダブルチェックし、すべてがうまくいきます。

これは有用かどうかわかりませんが、私の経験上、SecItemAdd()共有キーチェーンアクセスの機能を使用する場合は、それらの2つのパラメータが存在してはいけません。

関連する問題