iOS内购,如何处理购买完,App挂掉,没有来得及交付商品的问题。
2条回答 默认 最新
关注 引自免费微信小程序:皆我百晓生
查询iOS已付款但未结束交易的内购订单,以及处理购买后App意外退出导致商品未交付的问题,可以通过监听和查询StoreKit相关API来实现。以下是详细步骤及代码示例:
- 监听支付状态变化:
首先在你的应用中设置一个
SKPaymentTransactionObserver
来监听交易状态的变化。当用户完成支付但App崩溃前,系统会自动恢复这个未完成的交易。
// 在AppDelegate或初始化的地方注册观察者 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { [[SKPaymentQueue defaultQueue] addTransactionObserver:self]; // ... } // 实现SKPaymentTransactionObserver协议方法 @interface YourViewController () <SKPaymentTransactionObserver> // ... @end @implementation YourViewController - (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray<SKPaymentTransaction *> *)transactions { for (SKPaymentTransaction *transaction in transactions) { switch (transaction.transactionState) { case SKPaymentTransactionStatePurchased: // 处理已支付但未完成交付的情况 [self completeTransaction:transaction]; break; case SKPaymentTransactionStateFailed: // 处理交易失败的情况 [self failedTransaction:transaction]; break; case SKPaymentTransactionStateRestored: // 处理从其它设备上恢复的交易 [self restoreTransaction:transaction]; break; default: break; } } } // 完成交易并提供商品(虚拟商品) - (void)completeTransaction:(SKPaymentTransaction *)transaction { // 提交验证,解锁商品或服务 // 这里假设你有一个方法deliverProductIdentifier:用于提供商品 [self deliverProductIdentifier:transaction.payment.productIdentifier]; [[SKPaymentQueue defaultQueue] finishTransaction:transaction]; } // 错误处理 - (void)failedTransaction:(SKPaymentTransaction *)transaction { if (transaction.error.code != SKErrorPaymentCancelled) { NSLog(@"Transaction error: %@", transaction.error.localizedDescription); } [[SKPaymentQueue defaultQueue] finishTransaction:transaction]; } // 恢复交易处理 - (void)restoreTransaction:(SKPaymentTransaction *)transaction { // 还原用户的商品状态,类似于completeTransaction:操作 [self deliverProductIdentifier:transaction.originalTransaction.payment.productIdentifier]; [[SKPaymentQueue defaultQueue] finishTransaction:transaction]; } @end
- 启动时检查未完成的交易: 为了确保即使在App挂掉之后也能处理这种情况,在App每次启动时,可以查询所有待处理的交易。
- (void)applicationDidBecomeActive:(UIApplication *)application { // 检查是否有未完成的交易 NSArray *transactions = [[SKPaymentQueue defaultQueue].transactions]; for (SKPaymentTransaction *transaction in transactions) { if (transaction.transactionState == SKPaymentTransactionStatePurchased) { [self completeTransaction:transaction]; } } }
通过以上代码,你可以确保即使在App异常退出的情况下,也能够正确处理用户已经付款但未交付的商品问题。不过请注意,实际开发中请根据你的业务逻辑调整和完善上述代码。
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报 编辑记录- 监听支付状态变化:
首先在你的应用中设置一个
悬赏问题
- ¥15 请帮我看一看数电项目如何设计
- ¥23 (标签-bug|关键词-密码错误加密)
- ¥66 比特币地址如何生成taproot地址
- ¥20 数学建模数学建模需要
- ¥15 关于#lua#的问题,请各位专家解答!
- ¥15 什么设备可以研究OFDM的60GHz毫米波信道模型
- ¥15 不知道是该怎么引用多个函数片段
- ¥30 关于用python写支付宝扫码付异步通知收不到的问题
- ¥15 隐藏系统界面pdf的打印、下载按钮
- ¥15 基于pso参数优化的LightGBM分类模型