【问题标题】:iPhone In App Purchase - response.products are still empty?iPhone In App Purchase - response.products 还是空的?
【发布时间】:2011-01-09 11:39:25
【问题描述】:

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

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

我在 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 似乎没有任何示例应用程序。

【问题讨论】:

    标签: iphone iphone-sdk-3.0 in-app-purchase storekit


    【解决方案1】:

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

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

    【讨论】:

    • 提交就直接拒绝。不想把日期定在未来而忘记它!
    • 谢谢。不幸的是,Apple 忘记在他们的文档中包含这一非常重要的信息,但我在阅读了这个有用的教程后发现了这一点:troybrant.net/blog/2010/01/in-app-purchases-a-full-walkthrough
    • 谢谢,这已经帮我解决了。
    • 现在是 2014 年,情况仍然如此。在新的 iTC 中,您只需提交新版本即可,无需提交审核。
    • 测试时无需提交二进制文件。确保协议、税务和银行信息。您已提交银行详细信息。参考developer.apple.com/library/content/technotes/tn2259/…
    【解决方案2】:

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

    【讨论】:

    • 我是否已经必须添加一个有效的银行帐户来测试 InApp 购买?
    • 在沙盒中我没有启用这些,也无法获得产品列表
    • 将银行信息添加到 iTunes 帐户有效。
    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        检查是否有无效的产品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/

        这是一个针对这个问题的非常全面的检查清单。

        编辑:(13/11/20) 网站似乎已关闭。我不确定这是否是永久性问题,但您可以从 archive.org 看到该页面: https://web.archive.org/web/20200212001158/http://troybrant.net/blog/2010/01/invalid-product-ids/

        【讨论】:

          【解决方案6】:

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

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

          【讨论】:

          • 我重命名了项目,并且捆绑 ID 也发生了变化(来自 Xcode 的奇怪行为)。这导致所有产品 ID 无效。你的回答解决了。谢谢。
          【解决方案7】:

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

          【讨论】:

            【解决方案8】:

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

            【讨论】:

            • 这确实有效。免费的出现了,但付费的没有,因为合同没有签署。测试的好技巧
            【解决方案9】:

            在我的情况下,原因是 Apple 错误地打开了内容托管。该产品只有在我关闭时才可用

            【讨论】:

              【解决方案10】:

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

              【讨论】:

                猜你喜欢
                • 2010-12-14
                • 1970-01-01
                • 1970-01-01
                • 2021-02-15
                • 2013-08-18
                • 2014-02-13
                • 2016-11-23
                • 2016-03-15
                • 2019-07-22
                相关资源
                最近更新 更多