Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 应用内购买沙盒未提示我登录/通过_Iphone_In App Purchase_App Store Connect - Fatal编程技术网

Iphone 应用内购买沙盒未提示我登录/通过

Iphone 应用内购买沙盒未提示我登录/通过,iphone,in-app-purchase,app-store-connect,Iphone,In App Purchase,App Store Connect,我们正在开发一个应用程序,它(当然)使用应用程序内购买(IAP)。 我已经在指南中完成了启用iap的所有工作,一切正常,直到我想购买。 部分代码: MainViewController.m -(void)viewDidLoad { if ([SKPaymentQueue canMakePayments]) { MyStoreObserver *observer = [[MyStoreObserver alloc] init]

我们正在开发一个应用程序,它(当然)使用应用程序内购买(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];
    };
    - (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;
            }
        }
    };
MyStoreObserver.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];
    };
    - (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:
delegate方法显示两种产品及其名称/价格。就像我进入iTunes connect网站一样。

但一旦我点击“购买”按钮,就不会弹出对话框或询问我的凭证。仅记录“SKPaymentTransactionStatePurchasing”。

而我:
- ... 已在设置/存储窗格中注销
- ... 我正在使用正确的配置文件
- ... 我绝望了


有人吗?

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

NSArray *transactions = [[SKPaymentQueue defaultQueue] transactions];
for(id transaction in transactions){
    [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
}
我把这段代码挂到了一个IBOutlet上,在我的应用内购买成功后运行。

可以限制iPhone访问苹果应用商店。例如,家长可以限制孩子购买额外内容的能力。

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

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

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

你是在iPhone/iPad模拟器4.2上测试还是什么?这可能就是问题所在。在iPhone/iPad Simulator 5.0或该设备上进行测试将正确运行storekit。

我遇到了类似的问题,但我的问题更像是愚蠢的举动。我已经“重构”了对
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语句的每个案例中,修复了这一问题。

我也一直在为这个问题烦恼。结果是,简单地重新启动测试设备,一切正常。

我在获取产品时检查
[SKPaymentQueue canMakePayments]
,并且(如我所说)它显示了我输入的两个产品,因此我
可以在该设备上进行支付。第一次单击时,我的支付队列为空,第二次单击会抛出一个
NSInvalidArgumentException:无法完成采购交易
。这是有道理的,因为在第一次单击时,我向队列中添加了一个项目,但没有显示对话框……我在开发构建中遇到了同样的问题。我尝试使用上述代码清除失败的事务,但SKPaymentQueue没有。但我仍然会收到一个对话框,询问以前的测试用户帐户的凭据(即使我已从设置中的帐户注销)。有什么建议吗?昨天我的应用程序内购买工作正常(代码与您的类似)。我得到了立即购买弹出框显示刚刚好,但今天早上测试,我得到了和你一样的东西。它可以识别我的产品(我可以获得名称描述、价格、产品ID等),但当我在“purchaseUpgrade”功能中设置付款并添加付款时,什么都不会发生。我想知道沙箱现在是否有问题。。。其他人目前是否能够正确测试他们的应用程序内购买?我希望是这样,请阅读官方指南4遍,然后按照它进行操作。。。但仍然没有对话框。它现在应该可以工作了,只是试过了。你是对的,看起来苹果在沙盒服务器上遇到了一些问题。谢谢你的帮助。我也是。这只发生在沙盒上吗?我花了好几个小时在这上面。我最终让它与沙盒用户一起工作,但首先我必须删除我使用的沙盒用户,创建一个新的雅虎邮件帐户,用苹果ID注册该用户,验证我电子邮件中的苹果ID,返回我的iPhone,用该苹果ID登录iTunes商店,然后通过它购买。最后,在所有这些工作完成之后,我将我的应用提交到应用商店。这比竖起大拇指更有价值:-)