在維護老項目時,發現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];
}