我在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
,但是有一个更深层次的问题,我想找到它。
答案 0 :(得分:0)
此属性的内容未定义,除非 transactionState设置为SKPaymentTransactionStatePurchased。
因此,您应该始终检查事务的transactionState
,如果事务状态等于SKPaymentTransactionStatePurchased
,那么您可以从transactionReceipt
获取数据作为字典。
还要考虑从App Store发送和接收的数据是JSON格式,您应该使用JSON解析器来检索它。
答案 1 :(得分:0)
我们刚刚为我们的项目添加了收据验证。您可以在此处查看ios版本:https://github.com/soomla/ios-store