45

基本上,我尝试在测试应用程序上设置应用程序购买,然后再将它们实施到我公司正在开发的适当应用程序中。我已经阅读了大约 1000 次 Store kit pdf 和其他片段,但产品仍然以空的形式返回。这正是我到目前为止所做的:

设置测试应用程序和应用程序内购买测试项目
我在 iPhone 开发中心的公司开发人员门户上为“测试应用程序一”创建了一个新的应用程序 ID。我确保前缀是com.mycompany.testappone为了确保可以配置应用内购买。留在 App IDs 部分,我通过勾选“启用应用内购买”选项来配置应用内购买。

我在 iTunes Connect 中创建了“Test App One”并完成了通常的程序,但选择了“稍后上传二进制文件”并且没有提交以供审核,因为该应用程序什么都不做。当然,我们不必提交应用程序来审查这个工作吗?!然后我点击了在应用程序购买中管理并创建了一个产品 ID 为“test1”的新产品并批准了它,以便它可以出售。

代码
我在 XCode 中建立了一个名为的新项目TestAppOne,这里是我现在使用的仅有的 2 个类:

TestAppOneAppDelegate.h:

#import <UIKit/UIKit.h>
#import <StoreKit/StoreKit.h>  

@interface TestAppOneAppDelegate : NSObject <UIApplicationDelegate, SKRequestDelegate, SKProductsRequestDelegate> {
    UIWindow *window;
}

TestAppOneDelegate.m:

#import "TestAppOneAppDelegate.h"

static NSString *kMyFeatureIdentifier1 = @"com.mycompany.testappone.test1";

@implementation TestAppOneAppDelegate
@synthesize window;

- (void)applicationDidFinishLaunching:(UIApplication *)application {    
 if([SKPaymentQueue canMakePayments]) {
  NSLog(@"IN-APP:can make payments");
 }
 else {
  NSLog(@"IN-APP:can't make payments");
 }

 [self requestProductData];
 [window makeKeyAndVisible]; 
}

- (void)requestProductData {
 NSLog(@"IN-APP:requestProductData");
 SKProductsRequest *request = [[SKProductsRequest alloc] initWithProductIdentifiers: [NSSet setWithObject:kMyFeatureIdentifier1]];
 request.delegate = self; 
 [request start];
 NSLog(@"IN-APP:requestProductData END");  
} 

- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response {
 NSLog(@"IN-APP:productsRequest");
 NSArray *myProduct = response.products;
 NSLog(@"IN-APP:array count: %i", [myProduct count]);
 [request autorelease];
 NSLog(@"IN-APP:productsRequest END"); 
}

- (void)dealloc {
    [window release];
    [super dealloc];
}

@end

在设备上进行测试
我创建了一个沙盒测试帐户并在 iPhone 上注销了我的 iTunes 帐户,但没有使用测试帐户登录,因为文档告诉我们在购买阶段提示我们之前不要这样做。然后我构建应用程序,这是我得到的日志:

IN-APP:can make payments
IN-APP:requestProductData
IN-APP:requestProductData END
IN-APP:productsRequest
IN-APP:array count: 0
IN-APP:productsRequest END

谁能告诉我我是否遗漏了任何阶段,或者我做错了什么。不幸的是,Apple 似乎没有任何示例应用程序。

4

10 回答 10

34

另一个经常被忽视的重要步骤是您需要确保您有一个 iOS 付费应用程序合同设置,该设置位于 iTunes 连接的“合同、税务和银行”部分下。首先您必须点击请求按钮,然后您必须点击 3 个设置按钮(联系信息、银行信息、税务信息)

于 2011-02-12T07:54:50.507 回答
24

实际上,我确实认为您必须提交二进制文件才能使其正常工作。

您可以将发布日期设置为遥远的未来。

于 2010-01-26T11:19:41.167 回答
20

检查是否有无效的产品 ID。

- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response {

for (NSString *invalidProductId in response.invalidProductIdentifiers)
    {
        NSLog(@"Invalid product id: %@" , invalidProductId);
    }
}

如果有无效的产品 ID,请访问http://troybrant.net/blog/2010/01/invalid-product-ids/

对于这个问题,这是一个非常全面的清单。

编辑:(20 年 13 月 11 日)网站似乎已关闭。我不确定这是否是一个永久性问题,但您可以从 archive.org 看到该页面: https ://web.archive.org/web/20200212001158/http://troybrant.net/blog/2010/01/无效的产品 ID/

于 2013-01-16T23:44:48.233 回答
10

检查 XCode 中的 Bundle Identifier(例如 com.company.appname)是否与 iTunes Connect 中的匹配。

您无需提交二进制文件即可使用。

于 2013-02-01T02:49:39.617 回答
6

只需删除设备上的应用程序,然后从 XCode 重新启动它。它为我解决了这个问题。

无需上传二进制文件,也无需在 iTunes Connect 中创建应用内购买后等待数小时。

于 2012-07-27T14:19:06.563 回答
3

感谢 alpere 的回答,我发现我使用了错误的产品 ID。不是我想的那样de.company.appname.PROFESSIONAL_LICENSE。仅PROFESSIONAL_LICENSE在我的情况下使用(没有领先的捆绑ID)就可以了:)

于 2014-04-14T14:21:14.807 回答
2

无需为 InAppPurchase 的沙盒测试上传二进制文件。您只需在 iTunesConnect 中添加 InAppPurchase 项目并将其置于“准备提交”(必须)状态。如果您提交它以供审核,它将始终给您 response.product 空。

于 2012-08-31T06:07:44.387 回答
1

尝试添加免费订阅产品。如果它出现在响应中,那么您的代码没有任何问题。由于免费订阅是唯一不需要协议、税收和银行业务的类型,如果它出现而其他类型没有,那么这是与您的合同有关的问题。

于 2016-04-04T00:23:48.640 回答
0

就我而言(MacOS),我正在创建一个测试应用程序(与主应用程序具有相同的捆绑 ID)。SKFetchRequest 仅在我将捆绑名称(二进制名称)设置为与原始应用程序相同后才开始返回测试应用程序的产品 ID。

于 2019-07-02T05:14:00.630 回答
0

就我而言,原因是苹果错误地打开了内容托管。该产品仅在我将其关闭时才可用

于 2017-08-31T20:38:38.647 回答