iOS アプリにアプリ内購入を追加したところ、何人かのユーザーがクラッシュしてしまいました
-[__NSCFString objectForKey:]: unrecognized selector sent to instance 0xf0a6f10
BugSense から取得したメモリの場所は、Apple の VerificationController.m からのこの抜粋の最後の行を参照します。
- (BOOL)isTransactionAndItsReceiptValid:(SKPaymentTransaction *)transaction
{
if (!(transaction && transaction.transactionReceipt && [transaction.transactionReceipt length] > 0))
{
// Transaction is not valid.
return NO;
}
// Pull the purchase-info out of the transaction receipt, decode it, and save it for later so
// it can be cross checked with the verifyReceipt.
NSDictionary *receiptDict = [self dictionaryFromPlistData:transaction.transactionReceipt];
NSString *transactionPurchaseInfo = [receiptDict objectForKey:@"purchase-info"];
...
このコードにより、recipientDict が生成されます (VerificationController.m にも含まれています)。
- (NSDictionary *)dictionaryFromPlistData:(NSData *)data
{
NSError *error;
NSDictionary *dictionaryParsed = [NSPropertyListSerialization propertyListWithData:data
options:NSPropertyListImmutable
format:nil
error:&error];
if (!dictionaryParsed)
{
if (error)
{
#warning Handle the error here.
}
return nil;
}
return dictionaryParsed;
}
NSDictionary または nil を返す必要があります。
ARC がオンになっています。この問題は、iOS 5.0.1 ユーザーでのみ発生するようです。VerificationController.m に必要な変更を加えましたが、この部分は変更されていません。iOS 5.1.1 を実行している iPad で問題を再現することはできないようですが、ユーザーはアプリを再インストールした後でも問題が解決しないと言っています。私が正しく行っていない単純なことを誰かが見ることができれば、感謝します。
EDIT フォローアップの質問。とはどういう意味ですか?
- (BOOL)isTransactionAndItsReceiptValid:(SKPaymentTransaction *)transaction
transaction.transactionReceipt
NSString のみを提供し、無視しても安全ですか?