You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

iOS内购:设置applicationUserName后获取始终为null,求排查原因

iOS内购:applicationUserName在回调中始终为null的排查方案

我之前在沙箱环境测试内购时也碰到过一模一样的问题,结合你的代码和环境,给你几个实用的排查方向:

  • 确认交易类型是否为新购买
    恢复购买(SKPaymentTransactionStateRestored)的交易中,系统会重新生成SKPayment对象,不会保留你原来设置的applicationUserName。只有**新购买的交易(SKPaymentTransactionStatePurchased)**才会携带这个值。你可以在处理逻辑里先判断交易状态,避免误处理恢复交易的情况。

  • 排查沙箱环境缓存干扰
    苹果沙箱的交易记录有时候会有缓存残留,导致回调拿到的是旧的交易数据。建议你先退出当前沙箱账号,重启设备,再重新登录沙箱账号进行测试,这一步解决了我当时的问题。

  • 验证applicationUserName是否真的被设置成功
    在添加支付队列前,先打印日志确认值已经正确设置,排除代码中其他地方意外重置的可能:

    SKMutablePayment *payment = [SKMutablePayment paymentWithProduct:product];
    payment.applicationUserName = @"data";
    NSLog(@"添加支付前的appUserName: %@", payment.applicationUserName); // 确认这里输出"data"
    [[SKPaymentQueue defaultQueue] addPayment:payment];
    
  • 考虑版本兼容性问题
    Xcode 12.1 和 iOS 14.1 确实存在一些内购相关的小bug,你可以尝试升级到稍新的版本(比如Xcode 12.5、iOS 14.5),看看是否是系统层面的问题导致值丢失。

另外,在处理交易回调时,也可以多打印一些交易相关的信息,比如transaction.transactionIdentifier,确认每次测试都是新的交易,而不是重复处理旧的缓存交易。

内容的提问来源于stack exchange,提问作者Dum William

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 20:22:42