2

我刚刚在我的 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"];
...

这个代码生成receiptDict(也包含在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 上重现该问题,但用户表示即使重新安装应用程序后它仍然存在。如果有人能看到我做错的简单事情,我将不胜感激。

编辑 跟进问题。什么时候是什么意思

- (BOOL)isTransactionAndItsReceiptValid:(SKPaymentTransaction *)transaction

transaction.transactionReceipt

只提供一个 NSString 并且可以安全地忽略吗?

4

1 回答 1

1

在我看来

 propertyListWithData:data options:NSPropertyListImmutableformat:nil error:&error];

返回一个字符串而不是字典,但它似乎不合逻辑。你确定问题来自这个吗?

于 2012-11-20T17:41:26.670 回答