Iphone 应用内购买沙盒未提示我登录/通过
我们正在开发一个应用程序,它(当然)使用应用程序内购买(IAP)。 我已经在指南中完成了启用iap的所有工作,一切正常,直到我想购买。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]
部分代码: 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商店,然后通过它购买。最后,在所有这些工作完成之后,我将我的应用提交到应用商店。这比竖起大拇指更有价值:-)