关于iOS12版手机内购充值无回调的一则代码级错误

在维护老项目时,发现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 可以使用,但不推荐! 



猜你喜欢

转载自blog.51cto.com/kome2000/2376708
今日推荐