崩溃验证iOS收据

时间:2013-06-16 20:03:02

标签: ios in-app-purchase

我在App Store上发布了一款游戏,在验证收据时,我在以下代码中遇到了几次崩溃:

-(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不是NSDictionary,因此代码崩溃了。怎么会这样? transaction.transactionReceipt可以采用其他形式吗?错误?

这种情况很少发生,也许有1%的用户尝试购买东西?这是人们黑客入侵的结果吗?

我已经办理了检查以确保它和NSDictionary,但是有一个更深层次的问题,我想找到它。

2 个答案:

答案 0 :(得分:0)

所以developer.apple

  

此属性的内容未定义,除非   transactionState设置为SKPaymentTransactionStatePurchased。

因此,您应该始终检查事务的transactionState,如果事务状态等于SKPaymentTransactionStatePurchased,那么您可以从transactionReceipt获取数据作为字典。

还要考虑从App Store发送和接收的数据是JSON格式,您应该使用JSON解析器来检索它。

答案 1 :(得分:0)

我们刚刚为我们的项目添加了收据验证。您可以在此处查看ios版本:https://github.com/soomla/ios-store