在维护老项目时,发现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
没有被回调!
看一下这两个类的 单例创建方法,是有问题的!
下面是修复后的代码
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 可以使用,但不推荐!
转载于:https://blog.51cto.com/kome2000/2376708