iOS App Receipt Validation - 调试时模拟器和设备上缺少收据

Posted

技术标签:

【中文标题】iOS App Receipt Validation - 调试时模拟器和设备上缺少收据【英文标题】:iOS App Receipt Validation - Receipt is missing in simulator and on device while debugging 【发布时间】:2016-10-08 10:02:39 【问题描述】:

为什么我的应用在开发过程中会缺少收据?

我正在从 Xcode 7.3.1 运行我的 ios(7、8、9)应用程序。该应用程序的收据似乎丢失了。这个应用程序目前在 App Store 中发布,所以我有我的开发者凭据和一个“沙盒”用户登录。

模拟器

运行以下代码时:

NSURL* url = [[NSBundle mainBundle] appStoreReceiptURL];
NSLog(@"url: %@", url);

Simulator 9.3 for iPhone 6s Plus 中的结果:

file:///Users/Bourque/Library/Developer/CoreSimulator/Devices/7F32850A-CC1A-45A3-8ED6-95C75CD9DD44/data/Containers/Data/Application/46BDF021-D2A3-418E-91E1-61A15215942B/StoreKit/收据

然而,当我导航到以第二个 UUID 命名的文件夹时,我没有找到 StoreKit 文件夹。

真实设备

为了在真正的 iOS iPod touch 上进行测试,我将该代码扩展为……

…看看应该在哪里找到收据。

NSURL* url = [[NSBundle mainBundle] appStoreReceiptURL];
NSLog(@"url: %@", url);

…尝试加载这样的文件。

NSString* urlContents = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:nil];
NSLog(@"urlContents: %@", urlContents);

…验证文件是否存在。

NSError *err;
if ( [url checkResourceIsReachableAndReturnError:&err] == NO ) 
    NSLog(@"BAD No receipt found for url: %@" , url );
 else 
    NSLog(@"GOOD Receipt found for url: %@" , url );

运行时的结果。

网址:file:///private/var/mobile/Containers/Data/Application/21430192-6E3A-4929-B847-23FD525D804E/StoreKit/sandboxReceipt

urlContents: (null)

未找到以下网址的收据:file:///private/var/mobile/Containers/Data/Application/21430192-6E3A-4929-B847-23FD525D804E/StoreKit/sandboxReceipt

file:///private/var/mobile/Containers/Data/Application/B1497F0D-95A7-4AD8-A9D5-7AF95663A04F/StoreKit/sandboxReceipt

【问题讨论】:

弗兰克的回答似乎回答了你的问题。能接受就好了。 【参考方案1】:

由于您是通过 Xcode 而不是从商店安装应用程序,因此它不包含收据。但是,您可以启动 SKReceiptRefreshRequest 以获得可用于测试的沙盒收据。

另外请注意,您需要退出 App Store 并使用测试用户帐户(在 iTunes Connect 中创建)在您启动请求以使其正常工作后提示您登录。

【讨论】:

非常有用的答案。谢谢弗兰克。另一个重要提示:从 iOS 12 开始,在设置 > iTunes 和 App Store > 滚动到底部,您应该会看到一个名为“沙盒帐户”的部分和一个允许您使用测试用户帐户登录的字段(创建于应用商店连接)。我仍然必须使用真实的 Apple ID 进行“退出舞会”,才能使初始收据刷新、加载和验证正常工作。但是有了这个设置,您可以在 Xcode 中构建的开发应用程序中执行沙盒事务,同时使用真实的 Apple ID 登录到该设备 这非常有用。感谢分享! 快速跟进。我注意到即使可以通过“设置”>“iTunes 和 App Store”>“沙盒帐户”登录,也请避免这样做。相反,如果这是第一次在设备上安装 Xcode 开发版本: 1) 确保您已退出真实的“iTunes & App Store 帐户”。 2) 从 Xcode 构建和运行。 3) 如果您的应用在启动时运行收据验证代码,则应提示您使用电子邮件和密码登录 - 使用沙盒帐户。 4) 收据现已出现,您将能够重新登录到您的真实 iTunes 和 App Store 帐户。

以上是关于iOS App Receipt Validation - 调试时模拟器和设备上缺少收据的主要内容,如果未能解决你的问题,请参考以下文章

iOS Receipt验证作为后端服务

苹果receipt例子

iOS 订阅 DID_CHANGE_RENEWAL_STATUS 通知:latest_expired_receipt vs latest_receipt

iOS StoreKit Transaction Identifier 与 Receipt 不匹配

IOS7验证iap收据,in_app文件是啥意思?

Flutter iOS内购(代码篇-全网最全)