在维护老项目时,发现iOS12版手机上无法充值成功,经过测试发现,仅有iOS12版及以上版本手机上无法充值成功,
卡在了向苹果发送产品ID后等待回调时,无回调!
因为iOS11版没有问题,排除充值流程上的问题了,经过和能够在iOS12版上正常充值的项目比对发现:
重点在下面的代码上!
C++ TO Object-c 的 PopCapacitymanage.mm 文件上 关于 单例类的静态方法
PopCapacityManage* PopCapacityManage::sharedManage() { if (!_sharedManage) { _sharedManage = new PopCapacityManage; } return _sharedManage; } void PopCapacityManage::IOSPAYView(char*iospayID){ NSString*payIDStr=[NSString stringWithUTF8String:iospayID]; NSLog(@"%@",payIDStr); [[IOSPAYViewController sharePayViewC] buy:payIDStr];//将 产品 传递给 支付类 }
下面是 内购充值支付类:IOSPAYViewController.mm文件
static IOSPAYViewController *sharePayView = nil; +(IOSPAYViewController *)sharePayViewC{ @synchronized(self){ if(sharePayView == nil){ sharePayView = [[[self alloc] init] autorelease]; } } return sharePayView; } -(void)buy:(NSString*)type { [[SKPaymentQueue defaultQueue] addTransactionObserver:self]; buyType = type; if ([SKPaymentQueue canMakePayments]) { [self RequestProductData];// CCLOG(@"允许程序内付费购买"); _TS_alerView = [[UIAlertView alloc] initWithTitle:nil message:@"兑换正在处理,请勿关闭……" delegate:nil cancelButtonTitle:NSLocalizedString(@"Close(关闭)",nil) otherButtonTitles:nil]; [_TS_alerView show]; [_TS_alerView release]; } else { // CCLOG(@"不允许程序内付费购买"); UIAlertView *alerView = [[UIAlertView alloc] initWithTitle:@"Alert" message:@"没允许应用程序内购买" delegate:nil cancelButtonTitle:NSLocalizedString(@"Close(关闭)",nil) otherButtonTitles:nil]; [alerView show]; [alerView release]; } } -(void)RequestProductData { NSArray* product = [[NSArray alloc] initWithObjects:buyType,nil]; NSSet* nsset = [NSSet setWithArray:product]; SKProductsRequest* request=[[SKProductsRequest alloc] initWithProductIdentifiers: nsset]; request.delegate=self; [request start]; [product release]; } //<SKProductsRequestDelegate> 请求协议 //收到的产品信息 - (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response{ }
对的,就是上面这个方法
productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response
没有被回调!
扫描二维码关注公众号,回复:
5837851 查看本文章
看一下这两个类的 单例创建方法,是有问题的!
下面是修复后的代码
PopCapacityManage.mm文件
static PopCapacityManage* _sharedManage; PopCapacityManage* PopCapacityManage::sharedManage() { if (!_sharedManage) { _sharedManage = new (std::nothrow) PopCapacityManage(); } return _sharedManage; } void PopCapacityManage::IOSPAYView(const char* iospayID){ NSString* payIDStr = [NSString stringWithUTF8String:iospayID]; [[IOSPAYViewController getInstance] buy:payIDStr]; }
IOSPAYViewController.mm
static IOSPAYViewController* gIapTools = nil; +(id) getInstance { @synchronized ([IOSPAYViewController class]) { if (!gIapTools) { gIapTools = [[IOSPAYViewController alloc] initIAP]; } return gIapTools; } } -(id)initIAP { if (self = [super init]) { [[SKPaymentQueue defaultQueue]addTransactionObserver:self]; productID = nil; } return self; } -(void)releaseIAP { if (gIapTools) { [gIapTools release]; gIapTools = nil; } } -(void)buy:(NSString*)type { //[[SKPaymentQueue defaultQueue] addTransactionObserver:self]; productID = type; if ([SKPaymentQueue canMakePayments]) { [self requestProductData];// CCLOG(@"允许程序内付费购买"); _TS_alerView = [[UIAlertView alloc] initWithTitle:nil message:@"兑换正在处理,请勿关闭……" delegate:nil cancelButtonTitle:NSLocalizedString(@"Close(关闭)",nil) otherButtonTitles:nil]; [_TS_alerView show]; [_TS_alerView release]; } else { // CCLOG(@"不允许程序内付费购买"); UIAlertView* alerView = [[UIAlertView alloc] initWithTitle:@"Alert" message:@"没允许应用程序内购买" delegate:nil cancelButtonTitle:NSLocalizedString(@"Close(关闭)",nil) otherButtonTitles:nil]; [alerView show]; [alerView release]; } } -(void)requestProductData { NSArray* product = [[NSArray alloc] initWithObjects:productID, nil]; NSSet* set = [NSSet setWithArray:product]; SKProductsRequest* request = [[SKProductsRequest alloc] initWithProductIdentifiers:set]; //SKProductsRequest* request = [[SKProductsRequest alloc] initWithProductIdentifiers:[NSSet setWithObject:productID]]; request.delegate = self; [request start]; [product release]; } -(void)requestDidFinish:(SKRequest *)request { NSLog(@"--反馈信息结束------"); } -(void)request:(SKRequest *)request didFailWithError:(NSError *)error { NSLog(@"--弹出错误信息------"); } //<SKProductsRequestDelegate> 请求协议 //收到的产品信息 //#pragma mark- SKProductsRequest delegate -(void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response { NSLog(@"-----------收到产品反馈信息--------------"); NSArray *myProduct = response.products; NSLog(@"产品Product ID:%@",response.invalidProductIdentifiers); NSLog(@"产品付费数量: %lu", [myProduct count]); // populate UI for(SKProduct *product in myProduct){ NSLog(@"product info"); NSLog(@"SKProduct 描述信息%@", [product description]); NSLog(@"产品标题 %@" , product.localizedTitle); NSLog(@"产品描述信息: %@" , product.localizedDescription); NSLog(@"价格: %@" , product.price); NSLog(@"Product id: %@" , product.productIdentifier); } SKPayment* payment = nil;//SKProductsRequest payment = [SKPayment paymentWithProductIdentifier:productID]; [[SKPaymentQueue defaultQueue] addPayment:payment]; [request autorelease]; }
主要是看 单例的创建 部分, 就代码在 iOS8到iOS11 可以使用,但不推荐!