详解iOS应用程序内购/内付费(一)

2020-01-18 18:28:54王振洲

代码就这么多,到这边我们的IOS内购教程就接近尾声了,在测试的时候还有几点因素要注意一下:

1.沙盒环境测试appStore内购流程的时候,请使用没越狱的设备。

2.请务必使用真机来测试,一切以真机为准。

3.项目的Bundle identifier需要与您申请AppID时填写的bundleID一致,不然会无法请求到商品信息。

讲了这么多,附上几张测试截屏给大家展示一下:

请求商品时的打印日志:

ios应用程序内购买,应用内购,ios,ios应用程序内购

交易成功后:

ios应用程序内购买,应用内购,ios,ios应用程序内购

手机截屏:

要求输入AppStore帐密,使用测试生成的即可:

ios应用程序内购买,应用内购,ios,ios应用程序内购

确定购买:

ios应用程序内购买,应用内购,ios,ios应用程序内购

交易完成:

ios应用程序内购买,应用内购,ios,ios应用程序内购

当我们的交易完成后还要去appstore 上面去验证票据信息是否正确,这样我们才可以给玩家发放道具,apple官方文档:


//交易结束 
- (void)completeTransaction:(SKPaymentTransaction *)transaction{ 
  NSLog(@"交易结束"); 
  //交易验证 
  NSURL *recepitURL = [[NSBundle mainBundle] appStoreReceiptURL]; 
  NSData *receipt = [NSData dataWithContentsOfURL:recepitURL]; 
   
  if(!receipt){ 
     
  } 
   
  NSError *error; 
  NSDictionary *requestContents = @{ 
                   @"receipt-data": [receipt base64EncodedStringWithOptions:0] 
                   }; 
  NSData *requestData = [NSJSONSerialization dataWithJSONObject:requestContents 
                             options:0 
                              error:&error]; 
   
  if (!requestData) { /* ... Handle error ... */ } 
   
  //In the test environment, use https://www.easck.com/verifyReceipt 
  //In the real environment, use https://www.easck.com/verifyReceipt 
  // Create a POST request with the receipt data. 
  NSURL *storeURL = [NSURL URLWithString:@"https://www.easck.com/verifyReceipt"]; 
  NSMutableURLRequest *storeRequest = [NSMutableURLRequest requestWithURL:storeURL]; 
  [storeRequest setHTTPMethod:@"POST"]; 
  [storeRequest setHTTPBody:requestData]; 
   
  // Make a connection to the iTunes Store on a background queue. 
  NSOperationQueue *queue = [[NSOperationQueue alloc] init]; 
  [NSURLConnection sendAsynchronousRequest:storeRequest queue:queue 
              completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) { 
                if (connectionError) { 
                  /* ... Handle error ... */ 
                } else { 
                  NSError *error; 
                  NSDictionary *jsonResponse = [NSJSONSerialization JSONObjectWithData:data options:0 error:&error]; 
                  if (!jsonResponse) { /* ... Handle error ...*/ } 
                  /* ... Send a response back to the device ... */ 
                  //Parse the Response 
                } 
              }]; 
 
   
   
  [[SKPaymentQueue defaultQueue] finishTransaction:transaction]; 
}