在 App Purchase 沙箱中不提示我的登录/通过

Posted

技术标签:

【中文标题】在 App Purchase 沙箱中不提示我的登录/通过【英文标题】:In App Purchase sandbox not prompting for my login/pass 【发布时间】:2012-01-18 13:08:27 【问题描述】:

我们正在开发一款(当然)用于应用购买 (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];
    ;

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;
            
        
    ;

productRequest: 委托方法显示 2 个产品及其名称/价格。就像我在 iTunes 连接站点中输入的一样。

但是,一旦我单击“购买”按钮,就不会弹出对话框或询问我的凭据。仅记录“SKPaymentTransactionStatePurchasing”。 我: - ... 已在设置/存储窗格中注销 - ... 我正在使用正确的配置文件 - ...我绝望了

有人吗?

【问题讨论】:

昨天我的应用内购买工作正常(代码与你的相似)。我的立即购买弹出框看起来很好,但是今天早上测试我得到了和你一样的东西。它识别我的产品(我可以获得名称描述、价格、产品 ID 等...)但是当我设置付款并在我的“purchaseUpgrade”功能中添加付款时没有任何反应。我想知道现在沙盒是否存在问题...其他人目前能够正确测试他们的应用内购买吗? 我希望是这样,阅读官方指南 4 遍并遵循它...但仍然没有对话。 它现在应该可以工作了,刚刚尝试过。 你是对的,看起来苹果在沙盒服务器上遇到了一些问题。感谢您的帮助。 也发生在我身上。这只发生在 SandBox 上吗? 【参考方案1】:

我遇到了类似的问题,但我的做法更像是一个愚蠢的举动。我已经“重构”了对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];
    

原来™,这也会在 SKPaymentTransactionStatePurchasing 上调用 finishTransaction,这将导致崩溃。将 finishTransaction 移回到 switch 语句的每个 case 中解决了这个问题。

【讨论】:

【参考方案2】:

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

NSArray *transactions = [[SKPaymentQueue defaultQueue] transactions];
for(id transaction in transactions)
    [[SKPaymentQueue defaultQueue] finishTransaction:transaction];

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

【讨论】:

第一次点击我的支付队列是空的,第二次点击会抛出一个NSInvalidArgumentException: Cannot finish a purchasing transaction。这是有道理的,因为在第一次单击时,我在队列中添加了一个项目,但没有显示对话框... 我的开发版本也有同样的问题。我尝试使用上面的代码清除失败的交易,但 SKPaymentQueue 没有。但是我仍然会收到一个对话框,询问以前的测试用户帐户的凭据(即使我已经在设置中注销了帐户)。有什么建议吗?【参考方案3】:

我也一直在用这个把头发拉出来。事实证明,只需重新启动测试设备就可以一切正常。

【讨论】:

这比竖起大拇指更值得:-)【参考方案4】:

可以限制 iPhone 访问 Apple App Store。例如,父母可以限制孩子购买额外内容的能力。

在进行交易之前确定,你能买还是不买?这样检查 -

  -(IBAction)clickBuy:(UIButton *)__sender 

      if ([SKPaymentQueue canMakePayments]) 
        SKPayment *payment = [SKPayment paymentWithProductIdentifier:@"Product_id"];
        [[SKPaymentQueue defaultQueue] addPayment:payment];
      
      else 
      //show appropriate message 
      
   

【讨论】:

【参考方案5】:

您是在 iPhone/iPad Simulator 4.2 上进行测试吗?这可能是问题所在。在 iPhone/iPad Simulator 5.0 或设备上进行测试,将正确运行 storekit。

【讨论】:

我花了好几个小时研究这个。我最终让它与沙盒用户一起工作,但首先我必须删除我正在使用的沙盒用户,创建一个新的雅虎邮件帐户,使用 Apple ID 注册该用户,验证我电子邮件中的 Apple ID,返回我的 iPhone,使用该 Apple ID 登录 iTunes 商店,然后通过它购买。最后,它成功了,我将我的应用提交到应用商店。

以上是关于在 App Purchase 沙箱中不提示我的登录/通过的主要内容,如果未能解决你的问题,请参考以下文章

iOS沙箱中测试用户的意外登录提示

苹果在 App__purchase

iOS 14 In-App Purchase 请求登录/验证两次

iOS In App Purchase in Action Extension 应用程序

iOS In-App-Purchase Sandbox 恢复消耗品购买

In-App Purchase(iap)快速指南