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

Bas*_*que 5 sandbox ios receipt-validation

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

我从Xcode 7.3.1运行我的iOS(7,8,9)应用程序.该应用程序的收据似乎丢失了.此应用程序目前在App Store中发布,因此我有我的开发人员凭据和"沙盒"用户登录.

模拟器

运行以下代码时:

NSURL* url = [[NSBundle mainBundle] appStoreReceiptURL];
NSLog(@"url: %@", url);
Run Code Online (Sandbox Code Playgroud)

适用于iPhone 6s Plus的Simulator 9.3的结果:

文件:///用户/布尔克/库/开发商/ CoreSimulator /设备/ 7F32850A-CC1A-45A3-8ED6-95C75CD9DD44 /数据/集装箱/数据/应用/ 46BDF021-D2A3-418E-91E1-61A15215942B/StoreKit /收据

然而,当我导航到以第二个UUID命名的文件夹时,我找不到任何StoreKit文件夹.

真实设备

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

...查看应该找到收据的位置.

NSURL* url = [[NSBundle mainBundle] appStoreReceiptURL];
NSLog(@"url: %@", url);
Run Code Online (Sandbox Code Playgroud)

...尝试加载这样的文件.

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

...验证文件是否存在.

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

运行结果.

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

urlContents :( null)

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

文件:///私人的/ var /移动/集装箱/数据/应用/ B1497F0D-95A7-4AD8-A9D5-7AF95663A04F/StoreKit/sandboxReceipt

Fra*_*gel 9

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

另请注意,在启动请求后,如果提示您登录App Store,则需要注销App Store并使用测试用户帐户(在iTunes Connect中创建).

  • 非常有用的答案。谢谢弗兰克。另一个重要提示:从 iOS 12 开始,在设置 > iTunes 和 App Store > 滚动到底部,您应该会看到一个名为“沙盒帐户”的部分和一个允许您使用测试用户帐户登录的字段(创建于应用商店连接)。我仍然需要使用真实的 Apple ID 进行“退出舞蹈”,以使初始收据刷新、加载和验证工作。但是有了这个设置,你可以在使用真实的 Apple ID 登录到该设备的同时,在 Xcode 内置的开发应用程序中执行沙盒事务 (2认同)