我已经设置了应用内购买功能,并且在buySubscriptionAction
方法后出现以下错误:
***由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“无效的产品标识符:(空)”
这是我的应用内购买代码:
在.h文件中
SKProductsRequest *productsRequest;
NSArray *validProducts;
@property (nonatomic, strong) SKProduct *product;
@property (nonatomic, strong) NSString *productID;
在.m文件中
-(void) startInAppPurchase {
self.productID = @"1year";
[self getProductID];
[self buySubscriptionAction];
}
// called FIRST
-(void) getProductID {
if ([SKPaymentQueue canMakePayments]) {
SKProductsRequest *request = [[SKProductsRequest alloc] initWithProductIdentifiers:[NSSet setWithObject:self.productID]];
request.delegate = self;
[request start];
} else {
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error" message:@"Please enable in app purchases in your settings" delegate:self cancelButtonTitle:nil otherButtonTitles:@"OK", nil];
[alert show];
}
}
// called SECOND
-(void) buySubscriptionAction {
SKPayment *payment = [SKPayment paymentWithProduct:self.product];
[[SKPaymentQueue defaultQueue] addPayment:payment];
}
buySubscriptionAction
方法后,应用程序崩溃。我尝试将
self.productID
用作com.companyName.appname.year1
和仅作为year1
。有谁知道是什么原因导致此崩溃和错误消息?注意:
永远不会调用此方法:
- (void) productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response {
NSArray *products = response.products;
NSLog(@"products: %@",products);
if (products.count != 0) {
self.product = products[0];
productName = self.product.localizedTitle;
productDescription = self.product.localizedDescription;
} else {
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error" message:@"Product Not Found" delegate:self cancelButtonTitle:nil otherButtonTitles:@"OK", nil];
[alert show];
}
products = response.invalidProductIdentifiers;
for (SKProduct *prod in products) {
NSLog(@"Product not found: %@",prod);
}
}
因此,self.products在
buySubscriptionAction
中为null。在.h中,我包含了
<SKProductsRequestDelegate, SKPaymentTransactionObserver>
最佳答案
即使您分配了proxy = self,也不会调用您的委托方法。
想想为什么会发生这种情况。 SKProductsRequest
promise 在请求完成或超时时调用单个委托方法。既然没有发生,您可以假设1)系统错误2)SKProductsRequest
不知何故消失了。
1)绝不是框架错误。
2)因此SKProductsRequest
消失了。想一想。您的方法结束了,您希望SKProductsRequest
实例继续运行。但是,您现在离开了方法范围,而没有告诉编译器您想让SKProductsRequest
保持 Activity 状态。系统假定您已经完成SKProductsRequest
实例并将其销毁。
您的问题是,在离开方法范围后,您无法确保SKProductsRequest
实例继续存在。
创建一个strong
属性并将其用于存储请求。这将明确告诉编译器在离开类上下文之前不要丢弃SKProductsRequest
对象。问题应该解决。
关于ios - iOS应用内购买:Objective-c,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34794150/