Q: How I can detect when this event (currently subscribed) has occurred so that I can process the transaction and grant access to my app.
时,通过与苹果的验证(我用的php网站的代码来做到这一点),你会得到一个“身份码”回响应,并可以验证它是否是一个代码21006(订阅是存在订阅,检测已过期)或其他人(我认为除0和21006以外的任何内容都是实际的错误)。
我做事情的方式是将交易详细信息存储在PLIST文件中,该文件存储在文档目录中。
你可以到PLIST添加额外的领域,如expiryDates,布尔标志等
这种方式,你有收据的复印件,但你应该总是验证它,因为它可能已过期。
Q:在paymentQueue:updatedTransactions:它 即将通过作为SKPaymentTransactionStateFailed观察者的方法。我如何 区分这种类型的故障和其他故障,如 用户按取消按钮?
在updatedTransactions方法中使用switch语句来确定不同类型的响应。
例
-(void)paymentQueue:(SKPaymentQueue *)queue restoreCompletedTransactionsFailedWithError:(NSError *)error
{
NSString *message = [NSString stringWithFormat:@"Transaction failed with error - %@", error.localizedDescription];
NSLog(@"Error - %@", message);
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Error"
message:message
delegate:nil
cancelButtonTitle:@"OK"
otherButtonTitles:nil];
[alertView show];
[alertView release];
}
-(void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions
{
NSLog(@"updatedTransactions");
for (SKPaymentTransaction *transaction in transactions)
{
switch (transaction.transactionState)
{
case SKPaymentTransactionStatePurchasing:
// take action whilst processing payment
break;
case SKPaymentTransactionStatePurchased:
// take action when feature is purchased
break;
case SKPaymentTransactionStateRestored:
// take action to restore the app as if it was purchased
break;
case SKPaymentTransactionStateFailed:
if (transaction.error.code != SKErrorPaymentCancelled)
{
// Do something with the error
} // end if
break;
default:
break;
} // end switch
} // next
的TransactionStateFailed处理失败,虽然我不代码取消,因为没有理由让我在我的应用程序这样做。
问:我是否提交退回的交易或是否需要致电 restorePreviousTransactions。
我相信StoreKit处理这种在内部与finishTransaction方法和restorePreviousTransaction方法
即
[[SKPaymentQueue defaultQueue] finishTransaction: transaction];
玩完交易
我希望这有助于