如何在iOS模拟器或设备上测试应用内购买(IAP)?

33

我按照 Ray Wenderlich 的教程书,实现了一个简单的非消耗性应用内购买机制。

当我的应用程序启动时,我发起产品信息请求:

self.productsRequest = [[SKProductsRequest alloc] initWithProductIdentifiers:productIdentifiers];
_productsRequest.delegate = self;
[_productsRequest start];

创建了SKProductRequest。它有一个内存地址,但是没有其他操作发生。没有调用任何委托方法:

- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response {
    NSLog(@"Product info received...");
    NSArray *products = response.products;
    for (SKProduct *product in products) {
        NSLog(@"ID: %@, title:%@, (%f)", product.productIdentifier, product.localizedTitle, product.price.floatValue);
    }

    self.productsRequest = nil;
}

- (void)request:(SKRequest *)request didFailWithError:(NSError *)error {
    NSLog(@"Failed to load list of products");
    self.productsRequest = nil;
}

我检查了两次:

  • 在iTunes Connect中完全设置了应用程序。
  • 应用程序在ITC中的状态为“准备上传”
  • 添加了一个非消耗性IAP。
  • IAP产品在ITC中的状态是“准备提交”
  • 应用程序ID为com.mycompany.myapp,包括应用程序和plist文件。检查了两次。
  • 使用com.mycompany.myapp.productname的IAP(使用相同的ID进行请求)。
  • 在ITC中创建了一个测试用户帐户。
  • 尚未向苹果提交任何内容。
  • 我的Mac已连接到互联网。
  • 控制台或屏幕上没有其他消息。

Ray Wenderlich的书中没有提到我除此之外还必须做什么。

只有一次,我在设备上看到了一个-didFailWithError:委托调用,但它再也没有出现过。我的委托无论在设备上还是在模拟器上都不会被调用。我让它运行了数分钟,没有任何响应。

iTunes Connect显示以下混淆警告:

您的第一个应用内购买必须与新应用程序版本一起提交。从版本详细信息页面的应用内购买部分中选择它们,然后单击“准备上传二进制文件”。

在能够测试应用内购买之前,是否需要这样做?


1
使用Xcode 5.1,模拟器中的IAP测试正常工作。 - Tore Olsen
7个回答

29

2
您可以在Xcode 5.1+的模拟器中测试StoreKit。 - Urkle

21
在iOS模拟器文档中写道:

API限制

iOS模拟器内部有一些API和功能的限制,包括:

Apple Push Services
Privacy alerts for access to Photos, Contacts, Calendar, and Reminders
The UIBackgroundModes key
iCloud document syncing and key-value storage support

不支持的框架包括:

External Accessory
Media Player
Message UI 
Event Kit
In UIKit, the UIVideoEditorController class
Store Kit
由于应用内购买需要使用 Store Kit 来工作,而 Store Kit 框架不支持模拟器,因此你无法在 iOS 模拟器中测试应用内购买。
更多信息: iOS 模拟器文档

7
"Store Kit可以在iOS模拟器中进行测试,但不包括托管内容下载。" - thomers
3
截至本评论撰写时,“Store Kit”不再在iOS模拟器的不支持框架列表中提到。 - rpitting
12
@rpitting - 是的,但是IAP仍然无法使用。我相信有两个苹果公司:一个为大众提供惊人的硬件和软件,另一个由达斯维达控制的苹果公司,他们讨厌开发者并创建像Xcode这样糟糕的东西。 - Duck

8

不幸的是,有几件事你无法在模拟器上测试。应用内购买就属于这个列表。

因此,你无法在模拟器上测试应用内购买,需要一个iOS设备。

编辑:据我所见,当你尝试在模拟器上测试应用内购买时,购买代理将不会被调用。


现在我正在编辑我的问题,因为设备上也没有收到任何委托调用。 - openfrog

6

2020年更新: 现在您可以在Xcode中测试应用内购买

重要通知:

在iOS、watchOS或tvOS应用程序中测试StoreKit需要运行在macOS 10.15或更高版本上的Xcode 12或更高版本。在macOS应用程序中测试StoreKit需要运行在macOS 11或更高版本上的Xcode 12或更高版本。

苹果公司在此提供教程


可以在 react-native-iap 和 iaphub 中使用这种方法吗? - Zeeshan Ahmad Khalil

2

这不是一个可接受的答案。请阅读https://meta.stackexchange.com/questions/118582/what-is-an-acceptable-answer - Ironkey

1
我发现了一个问题:

在AppDelegate的-didFinishLaunching...方法结束时立即启动SKProductRequest,但它从未起作用。

然后我进行了延迟调用并等待了3秒。从那时起它开始工作了。

因此,在应用程序启动后立即进行StoreKit请求是不可行的。

0
你的 skProductRequest 对象在哪里声明的? 尝试全局声明 skProductRequest。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接