30

我按照 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。
  • ITC 中 IAP 产品的状态为“准备提交”
  • 应用程序和 plist 中的应用程序 ID 都是 com.mycompany.myapp。检查了两次。
  • IAP 使用 com.mycompany.myapp.productname(对请求使用完全相同的 ID)。
  • 在 ITC 中创建了一个测试用户帐户。
  • 尚未向 Apple 提交任何内容。
  • 我的 Mac 可以访问互联网。
  • 控制台或屏幕上没有其他消息。

Ray Wenderlich 的书没有提到除此之外我必须做任何其他事情。

只有一次我看到 -didFailWithError: 在设备上调用我的委托,但它再也没有出现。我的代表不会在设备或模拟器上都被调用。我让它运行了几分钟,根本没有任何反应。

iTunes Connect 给出了这个令人困惑的警告:

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

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

4

7 回答 7

28

In the current version of Xcode 5.0 (5A1413), In-App purchases will not work in the iOS simulator.

StoreKit (In-App purchases) will not work in the Simulator. 13962338

Source: Xcode 5.0 Release Notes > Known issues > iOS Simulator https://developer.apple.com/library/ios/releasenotes/DeveloperTools/RN-Xcode/xc5_release_notes/xc5_release_notes.html#//apple_ref/doc/uid/TP40001051-CH2-SW303

于 2013-10-01T21:22:59.660 回答
22

在 iOS 模拟器文档中是这样写的:

API 限制

在 iOS Simulator 中,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 模拟器中测试 IAP。

更多信息:iOS 模拟器文档

于 2013-04-16T15:33:09.467 回答
8

不幸的是,有几件事您无法在模拟器上进行测试。In App Purchases 属于该列表。

所以你不能在模拟器中测试 In App Purchases,你需要一个 iOS 设备。

编辑:据我所知,当您尝试在模拟器上测试 IAP 时会发生这种情况,不会调用购买代表。

于 2013-04-16T15:11:37.930 回答
3

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

重要通知:

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

苹果教程在这里

于 2020-12-28T01:14:43.610 回答
2

您可以从 Apple 文档中测试 Xcode 12 中的应用内购买

https://developer.apple.com/documentation/storekit/in-app_purchase/testing_in-app_purchases_in_xcode?language=objc

和定制手册

https://www.appcoda.com/storekit-testing/

于 2020-10-05T20:02:00.907 回答
1

我想出了一些东西:

我在 AppDelegate 的 -didFinishLaunching... 结束时立即启动了 SKProductRequest,但它从未奏效。

然后我打了一个延迟电话,等了 3 秒。从那时起,它开始工作。因此,您不能在应用启动后立即发出 StoreKit 请求。

于 2013-04-16T15:30:48.113 回答
0

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

于 2014-03-07T08:48:14.830 回答