我们正在开发一个(应用程序)在应用程序购买(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”。
而我:
- ...已在设置/存储窗格中注销
- ...我正在使用正确的配置文件
- ......我绝望了
任何?
答案 0 :(得分: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];
}
}
原来™,这也会在finishTransaction
上调用SKPaymentTransactionStatePurchasing
,这会导致崩溃。将finishTransaction
移回到switch语句的每个case中都修复了该问题。
答案 1 :(得分:4)
在沮丧地解决了类似的问题之后(不是没有被要求我的凭据,它自动填写电子邮件地址,而无需更改它,即使在设置应用程序中退出商店)。我发现我在同一设备上的开发构建中遇到了一个失败的事务,我不得不清除设备队列中的所有事务,然后再次尝试测试。
NSArray *transactions = [[SKPaymentQueue defaultQueue] transactions];
for(id transaction in transactions){
[[SKPaymentQueue defaultQueue] finishTransaction:transaction];
}
我将此代码挂钩到IBOutlet,并在我的应用内购买运行后运行。
答案 2 :(得分:3)
我也一直把头发拉出来。原来只需重新启动测试设备即可使一切正常。
答案 3 :(得分:2)
可以限制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
}
}
答案 4 :(得分:0)
您是在iPhone / iPad Simulator 4.2上进行测试吗?这可能是问题所在。在iPhone / iPad上进行测试Simulator 5.0或设备将正确运行storekit。