应用内购买沙盒未提示我输入登录信息

6
我们正在开发一个应用程序,当然,它使用应用内购买(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:委托方法显示了两款产品的名称/价格,就像我在iTunes连接站点中输入的一样。

但是,一旦我点击“购买”按钮,没有对话框弹出或要求我提供我的凭据。只有“SKPaymentTransactionStatePurchasing”被记录下来。

而且我:
- ...已在设置/商店窗格中注销
- ...正在使用正确的配置文件
- ...非常绝望
任何人可以帮忙吗?

昨天我的应用内购买功能正常运作(使用类似于你的代码)。我成功地弹出了“立即购买”弹窗,但今天早上测试时,我遇到了和你一样的问题。它能够识别我的产品(我可以获取名称、描述、价格、产品ID等信息),但当我在“purchaseUpgrade”函数中设置付款并添加付款时,什么也没有发生。我想知道现在沙盒是否存在问题...其他人能否正常测试他们的应用内购买? - Drew_TwistedPair
我希望这是真的,已经阅读了官方指南4次并按照指南操作... 但仍然没有对话框。 - basvk
现在应该可以了,刚刚试过了。 - negersiu
你说得对,似乎苹果的沙盒服务器出了一些问题。感谢你的帮助。 - basvk
这种情况也发生在我身上。这只发生在沙盒中吗? - Vaibhav Saran
5个回答

13

我遇到了一个类似的问题,但那是因为我太蠢了。我已经“重构”了对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 中可以解决该问题。


5

在遇到类似问题(不是要求输入凭据,而是在设置应用程序中退出登录后,即使自动填充了电子邮件地址,也没有更改选项)时,我非常沮丧地抓住头发。后来我发现,在同一设备上进行的开发构建中有一个失败的事务被卡在队列中,必须清除设备上队列中的所有事务,然后再次尝试测试。

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

我将此代码连接到了IBOutlet,运行一次后我的应用内购买就可以正常工作了。


2
在我的第一次点击时,我的支付队列是空的,第二次点击会抛出一个“NSInvalidArgumentException: Cannot finish a purchasing transaction”异常。这是有道理的,因为在第一次点击时,我将一个项目添加到了队列中,但没有对话框显示出来... - basvk
我在我的开发构建中遇到了同样的问题。我尝试使用上面的代码清除失败的交易,但SKPaymentQueue没有任何内容。但是,我仍然会收到一个对先前测试用户帐户的凭据请求对话框(即使我已经在设置中注销了该帐户)。有什么建议吗? - Rameez Hussain

4

我也曾为此烦恼过一段时间。结果发现,只需要简单地重启测试设备,就可以让所有的东西都正常工作。


这比一个赞更有价值 :-) - Sulea Cosmin

2
iPhone可以被限制访问苹果应用商店。例如,父母可以限制他们的孩子购买其他内容的能力。

在进行交易之前,请确保您是否可以购买。可以像这样检查 -

  -(IBAction)clickBuy:(UIButton *)__sender {

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

1
我在获取产品时检查 [SKPaymentQueue canMakePayments],并且(就像我说的那样)它向我展示了我输入的2个产品,所以我可以在这个设备上进行支付。 - basvk

0
你是在测试 iPhone/iPad 模拟器 4.2 或者其他版本吗?这可能是问题所在。在 iPhone/iPad 模拟器 5.0 或者实际设备上进行测试,将会正确运行 storekit。

我花了数小时的时间来处理这个问题。最终,我通过沙盒用户解决了它,但首先我必须删除我使用的沙盒用户,创建一个新的雅虎邮件帐户,用Apple ID注册该用户,验证我的电子邮件中的Apple ID,回到我的iPhone,在iTunes商店中使用该Apple ID登录,并进行购买。最终,在所有这些步骤之后,它终于起作用了,我正在将我的应用程序提交到应用商店。 - Jackson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接