在App Purchase沙箱中没有提示我登录/通过

bas*_*svk 4 iphone itunesconnect in-app-purchase

我们正在开发一个(应用程序)在应用程序购买(IAP)中使用的应用程序.我已经完成了指南中的所有内容以启用iap,一切正常,直到我想购买.
一些代码:

MainViewController.m

    -(void)viewDidLoad {
            if ([SKPaymentQueue canMakePayments]) {
                    MyStoreObserver *observer = [[MyStoreObserver alloc] init];     
                    [[SKPaymentQueue defaultQueue] addTransactionObserver:observer];        

                    SKProductsRequest *request= [[SKProductsRequest alloc] initWithProductIdentifiers: [NSSet setWithObjects: @"com.company.app.product1", @"com.company.app.product1", nil]];
                    request.delegate = self;
                    [request start];
            }
    };

    -(void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response {
            for (SKProduct *prod in response.products) {
                    NSLog(@"%@ (%@)", prod.localizedTitle, prod.price);
            }
            [request release];
    };

    -(IBAction)clickBuy:(UIButton *)__sender {
            SKPayment *payment = [SKPayment paymentWithProductIdentifier:@"com.company.app.product1"];
            [[SKPaymentQueue defaultQueue] addPayment:payment];
    };
Run Code Online (Sandbox Code Playgroud)

MyStoreObserver.m

    - (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions {
        for (SKPaymentTransaction *transaction in transactions) {
            switch (transaction.transactionState) {
                case SKPaymentTransactionStatePurchased:
                    NSLog(@"SKPaymentTransactionStatePurchased");
                    break;
                case SKPaymentTransactionStateFailed:               
                    NSLog(@"SKPaymentTransactionStateFailed");
                    break;
                case SKPaymentTransactionStateRestored:
                    NSLog(@"SKPaymentTransactionStateRestored");
                    break;
                case SKPaymentTransactionStatePurchasing:
                    NSLog(@"SKPaymentTransactionStatePurchasing");
                default:
                    break;
            }
        }
    };
Run Code Online (Sandbox Code Playgroud)

productRequest:委托方法显示2种产品,其名称/价格.就像我进入iTunes连接网站一样.

但是,一旦我点击"购买"按钮,就不会弹出对话框或询问我的凭据.仅记录"SKPaymentTransactionStatePurchasing".

而且我:
- 已在设置/商店窗格中注销
- ...正在使用正确的配置文件
- ...我很绝望

任何人?

swi*_*ams 12

我遇到了类似的问题,但我的做法更像是一个愚蠢的举动.我已经"重构"了这个调用,finishTransaction以便为每个州调用它transactionState:

- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions {
    for (SKPaymentTransaction *transaction in transactions) {
        switch (transaction.transactionState) {
            case SKPaymentTransactionStatePurchased:
                // do stuff
                break;
            case SKPaymentTransactionStateFailed:
                // do stuff
                break;
            case SKPaymentTransactionStateRestored:
                // do stuff
                break;
            default:
                break;
        }
        [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
    }
}
Run Code Online (Sandbox Code Playgroud)

原来™,这也叫finishTransactionSKPaymentTransactionStatePurchasing,这将导致崩溃.移动finishTransaction回switch语句的每一种情况下固定的.


小智 5

在遇到类似问题而沮丧地拔掉头发后(而不是被要求提供我的凭据,它会自动填写电子邮件地址,即使在设置应用程序中退出商店时也没有更改它的选项)。我发现我有一个失败的事务卡在同一设备上的开发构建队列中,我必须清除设备上队列中的所有事务,然后再次尝试测试。

NSArray *transactions = [[SKPaymentQueue defaultQueue] transactions];
for(id transaction in transactions){
    [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
}
Run Code Online (Sandbox Code Playgroud)

我将此代码连接到 IBOutlet 并在我的应用内购买成功后运行。

  • 在我第一次点击时,我的付款队列是空的,第二次点击时会抛出一个“NSInvalidArgumentException:无法完成购买交易”。这是有道理的,因为在第一次单击时我将一个项目添加到队列中,但没有显示对话框...... (2认同)

cap*_*kaw 5

我也为此感到有些烦恼。事实证明,只需重新启动测试设备即可一切正常。