通过应用内购买解决无效的产品ID问题?

时间:2011-10-27 11:39:19

标签: in-app-purchase itunesconnect subscriptions

这是“In app purchases with MKStoreKit failing: “Problem in iTunes connect configuration for product: xxx

的后续问题

我遇到了类似的问题,并尝试使用和不使用MKStoreKit进行操作并获得类似的信息。

检查列表

感谢:http://troybrant.net/blog/2010/01/invalid-product-ids/

您是否为应用ID启用了应用内购买?

YES

您是否已检查过产品的已售出商品?

YES

您是否已提交(并可选择拒绝)您的应用程序二进制文件?

YES

您项目的.plist捆绑ID是否与您的应用ID相匹配?

YES

您是否为新的App ID生成并安装了新的配置文件?

YES

您是否已使用此新配置文件将项目配置为代码签名?

YES

您是否正在为iPhone OS 3.0或更高版本构建?

YES。 iOS4.2及更高版本。

您在制作SKProductRequest时是否使用完整的产品ID?

YES。也只是没有反向域的产品ID本身

您将产品添加到iTunes Connect后等了几个小时?

YES。它说“等待审查”并且已经完成了过去的4-5天

您的银行详细信息是否在iTunes Connect上有效?

NO。这是一个客户端项目,我只是在测试它是否正常工作。我是否需要银行详细信息进行测试?

编辑:我现在改变了。但我不明白为什么我只是为了测试沙盒而需要这样做。

您是否尝试从设备中删除该应用并重新安装?

YES

您的设备是否已越狱?

NO


应用表示法正确

我见过的一些例子使用了这种表示法: com.domain.APP_ID.PRODUCT_TO_BUY

但其他人使用 com.domain.PRODUCT_TO_BUY

哪个是对的?

在我的代码中,我尝试使用完整的表示法和产品ID本身,但仍然遇到“无效的产品ID”的相同问题。

开发者被拒绝

App Bundle(发布)在iTunes Connect上,我让“开发者拒绝”该捆绑包。

照片: App developer rejected

等待审核?

在我的应用内购买中,我有1个产品,可自动续订。它被清除出售;然而,它是“等待审查”并且不是绿灯。

照片:

waiting for review

我差不多4-5天前创建了它,它仍被标记为“等待审核”??

我想知道我的应用是否被“开发者拒绝”是否会影响自动续订订阅的“等待审核”?

我没有改变这个项目中的任何内容。

根据各种文章,我必须等待24-48小时才可以使用它?

但在我可以在测试中使用它之前,是否需要等待接受或绿灯?

银行详细信息

我没有填写任何银行详细信息,因为这是一个针对客户的应用程序 - 我是否需要在继续测试之前填写银行详细信息?

根据这些文档:http://developer.apple.com/library/ios/#technotes/tn2259/_index.html需要提供银行详细信息吗?

在运行应用程序之前,我是否需要在测试帐户下登录设备上的iTunes?

我想知道是否有人可以澄清这些问题?也许就像在等待应用内购买“绿灯”一样简单,或者我错过了一步?

注意:无论我是使用MKStoreKit还是使用后面的代码,都会发生这种情况。

感谢。

我的代码(这是非MKStoreKit版本)

#define kMySubscriptionFeature @"uk.co.samplewebsite.myappproject.sub1"

    - (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view from its nib.
    self.title = @"Manage Subscriptions";


    if ([SKPaymentQueue canMakePayments])
    {
        // Display a store to the user.

        //[MKStoreManager sharedManager];
        //NSLog(@"purhcasable = %@", [[MKStoreManager sharedManager] purchasableObjectsDescription] );
        [self requestProUpgradeProductData];

    }
    else
    {
        // Warn the user that purchases are disabled.
        NSString *message = @"In-app purchases are disabled. Please review your settings";
        UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Error" message:message delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
        [alertView show];
        [alertView release];
    } // end if
}


#pragma mark - StoreKit Delegate

- (void) requestProductData
{
    SKProductsRequest *request= [[SKProductsRequest alloc] initWithProductIdentifiers: [NSSet setWithObject:kMySubscriptionFeature]];
    request.delegate = self;
    [request start];
}

- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response
{
    NSArray *myProduct = [[NSArray alloc] initWithArray:response.products];

    for(SKProduct *item in myProduct)
    {

        NSLog(@"Product title: %@" , item.localizedTitle);
        NSLog(@"Product description: %@" , item.localizedDescription);
        NSLog(@"Product price: %@" , item.price);
        NSLog(@"Product id: %@" , item.productIdentifier);
    }


    for (NSString *invalidProductId in response.invalidProductIdentifiers)
    {
        NSLog(@"Problem in iTunes connect configuration for product: %@" , invalidProductId);
    }


    [myProduct release];

    // populate UI
    [request autorelease];
}

编辑:

作为一个故障保险,我已添加银行详细信息以防万一,但我不明白为什么这会导致问题。

我还确保上传并拒绝了应用发布包,而不是adhoc;虽然我不知道这是否有所不同。

5 个答案:

答案 0 :(得分:11)

经过2天的等待,新的应用程序ID,个人资料等已经为我修好了..

为什么文档会说使用完整的com.iap.isrubbish语法?

感谢您的帮助

  

我换了:

     

定义kMySubscriptionFeature @“uk.co.somesite.someapp.sub1”

     

使用:

     

定义kMySubscriptionFeature @“sub1”

答案 1 :(得分:6)

我想我现在已经完成了。我要做一些测试只是为了确保。

这还不会被接受;我正在使用不同的storekit框架运行一些测试。

我的输出:

2011-10-27 15:17:49.297 My Simple App[7376:707] productsRequest
2011-10-27 15:17:49.298 My Simple App[7376:707] Product title: Simple subscription
2011-10-27 15:17:49.299 My Simple App[7376:707] Product description: Subscribe and get the latest content to your iPhone or iPod Touch device
2011-10-27 15:17:49.299 My Simple App[7376:707] Product price: 2.99
2011-10-27 15:17:49.300 My Simple App[7376:707] Product id: sub1

这就是我的所作所为。

  1. 我添加了银行详细信息。我仍然不认为这与它有任何关系。

  2. 请注意。该应用程序的应用内购买仍然是“等待审核”,我得到了上述输出。

  3. 我换了:

    #define kMySubscriptionFeature @"uk.co.somesite.someapp.sub1"

  4. 使用:

    #define kMySubscriptionFeature @"sub1"
    

    我将使用MKStoreKit和其他框架运行一些测试以查看它是否正常。

    我使用的代码如下,出于安全原因进行了编辑:

    .h文件

    //  ManageSubscriptionsVC.h
    //  This doesn't have visual output, just NSLog at the moment
    //  This doesn't use MKStoreKit yet
    
    #import <UIKit/UIKit.h>
    #import "StoreKit/StoreKit.h"
    
    #define kMySubscriptionFeature @"sub1"
    
    /*
     Shared Secret
    
     A shared secret is a unique code that you should use when you make the 
     call to our servers for your In-App Purchase receipts. 
     Without a shared secret, you will not be able to test auto-renewable 
     In-App Purchase subscriptions in the sandbox mode. 
    
     Also note that you will not be able to make them available 
     on the App Store.
    
     Note: Regardless of what app they are associated with, 
     all of your auto-renewable subscriptions will use this 
     same shared secret.
     */
    #define sharedSecret @"PUTSHAREDSECRETHERE"
    
    
    @interface ManageSubscriptionsVC : UIViewController
    <SKProductsRequestDelegate, SKProductsRequestDelegate, SKPaymentTransactionObserver>
    {
        SKProduct *proUpgradeProduct;
        SKProductsRequest *productsRequest;
    }
    
    - (void)requestProUpgradeProductData;
    
    @end
    

    .m文件

    //
    //  ManageSubscriptionsVC.m
    
    #import "ManageSubscriptionsVC.h"
    
    @implementation ManageSubscriptionsVC
    
    - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
    {
        self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
        if (self) {
            // Custom initialization
        }
        return self;
    }
    
    - (void)didReceiveMemoryWarning
    {
        // Releases the view if it doesn't have a superview.
        [super didReceiveMemoryWarning];
    
        // Release any cached data, images, etc that aren't in use.
    }
    
    #pragma mark - View lifecycle
    
    - (void)viewDidLoad
    {
        [super viewDidLoad];
        // Do any additional setup after loading the view from its nib.
        self.title = @"Manage Subscriptions";
    
    
        if ([SKPaymentQueue canMakePayments])
        {
            // Display a store to the user.
    
            //[MKStoreManager sharedManager];
            //NSLog(@"purhcasable = %@", [[MKStoreManager sharedManager] purchasableObjectsDescription] );
            [self requestProUpgradeProductData];
    
        }
        else
        {
            // Warn the user that purchases are disabled.
            NSString *message = @"In-app purchases are disabled. Please review your settings";
            UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Error" message:message delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
            [alertView show];
            [alertView release];
        } // end if
    }
    
    - (void)viewDidUnload
    {
        [super viewDidUnload];
        // Release any retained subviews of the main view.
        // e.g. self.myOutlet = nil;
    }
    
    - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
    {
        // Return YES for supported orientations
        return (interfaceOrientation == UIInterfaceOrientationPortrait);
    }
    
    #pragma mark - StoreKit Delegate
    
    - (void) requestProductData
    {
        NSLog(@"requestProductData");
        SKProductsRequest *request= [[SKProductsRequest alloc] initWithProductIdentifiers: [NSSet setWithObject:kMySubscriptionFeature]];
        request.delegate = self;
        [request start];
    }
    
    - (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response
    {
        NSLog(@"productsRequest");
    
        NSArray *myProduct = [[NSArray alloc] initWithArray:response.products];
    
        for(SKProduct *item in myProduct)
        {
    
            NSLog(@"Product title: %@" , item.localizedTitle);
            NSLog(@"Product description: %@" , item.localizedDescription);
            NSLog(@"Product price: %@" , item.price);
            NSLog(@"Product id: %@" , item.productIdentifier);
    
    
        }
    
        /*
        for(NSString *invalidProduct in response.invalidProductIdentifiers)
            NSLog(@"Problem in iTunes connect configuration for product: %@", invalidProduct);
        */
    
        for (NSString *invalidProductId in response.invalidProductIdentifiers)
        {
            NSLog(@"Problem in iTunes connect configuration for product: %@" , invalidProductId);
        }
    
    
        [myProduct release];
    
        // populate UI
        [request autorelease];
    }
    
    #pragma mark - PaymentQueue
    
    -(void)paymentQueue:(SKPaymentQueue *)queue removedTransactions:(NSArray *)transactions
    {
    }
    
    -(void)paymentQueue:(SKPaymentQueue *)queue restoreCompletedTransactionsFailedWithError:(NSError *)error
    {
    }
    
    -(void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions
    {
    }
    
    -(void)paymentQueueRestoreCompletedTransactionsFinished:(SKPaymentQueue *)queue
    {
    }
    
    #pragma mark - Other
    
    
    - (void)requestProUpgradeProductData
    {
        NSSet *productIdentifiers = [NSSet setWithObject:kMySubscriptionFeature];
        productsRequest = [[SKProductsRequest alloc] initWithProductIdentifiers:productIdentifiers];
        productsRequest.delegate = self;
        [productsRequest start];
    
        // we will release the request object in the delegate callback
    }
    
    
    
    
    
    @end
    

答案 2 :(得分:1)

我刚刚发现我在创建应用内购买时交换了产品ID和引用名称,所以在我的情况下,我使用了错误的字符串来尝试找到产品......难以发现。

答案 3 :(得分:1)

我在app-purchase中测试了我现有的功能完备的应用程序的最新版本,以确保功能仍然按预期工作,当我开始看到iTunes连接消息中的问题时。我的问题是(我忘了)MKStoreKit在我的各种设备的钥匙串上存储了购买的事实,所以即使我使用的是新用户帐户,我的钥匙串也在注册已购买的设备。 [self removeAllKeychainData]从MKStoreManager中修复了麻烦。 希望这可以让某些人感到沮丧。

答案 4 :(得分:0)

我的问题是,我使用真正的苹果ID登录了设备。然后退出(Iphone-&gt;设置 - &gt; App Store - &gt;我的ID-&gt;退出) 然后再次部署,并继续工作。

感谢大家在网上。