ココアでAPNSを使用するための素晴らしい解釈を見つけました。APNSプッシャー 今、私は毎回SecIdentityRefを選択したくありません(私は怠惰なので)SecIdentityRefをNSDataに入れて、デフォルトに保存しようとしました。次回アプリを起動すると、再度ロードしますが、常にexc_bad_accessを取得します。これが私が追加したコードです:
// For saving
NSData *secRefData = [NSData dataWithBytes:[SFChooseIdentityPanel sharedChooseIdentityPanel].identity length:sizeof([SFChooseIdentityPanel sharedChooseIdentityPanel].identity)];
[[NSUserDefaults standardUserDefaults] setValue:secRefData forKey:@"identity"];
//For loading
NSData *secRefData = [[NSUserDefaults standardUserDefaults] valueForKey:@"identity"];
if([secRefData length] != 0) {
[[APNS sharedAPNS] setIdentity:(SecIdentityRef)CFRetain([secRefData bytes])];
}
どうすればこれを機能させることができますか?IDを保存する別の方法はありますか?
編集
だから私はIDの名前を保存することで解決策を見つけました。アプリを起動すると、利用可能なIDのどれがこの名前を持っているかを調べ、正しい名前のIDを使用します。コードは次のとおりです。
//For loading
NSString *lastIdentityName = [[NSUserDefaults standardUserDefaults] valueForKey:@"identityName"];
if([lastIdentityName length] != 0) {
NSArray *allIdentities = [self identities];
for (id object in allIdentities) {
NSString *theName = [[[X509Certificate extractCertDictFromIdentity:(SecIdentityRef)object] valueForKey:@"Subject"] objectForKey:@"CommonName"];
if([theName isEqualToString:lastIdentityName]) {
[[APNS sharedAPNS] setIdentity:(SecIdentityRef)CFRetain((__bridge_retained SecIdentityRef)object)];
[[NSUserDefaults standardUserDefaults] setValue:[self identityName] forKey:@"identityName"];
// KVO trigger
[self willChangeValueForKey:@"identityName"];
[self didChangeValueForKey:@"identityName"];
}
}
}
//For saving
[[NSUserDefaults standardUserDefaults] setValue:[self identityName] forKey:@"identityName"];