iOS IAP教程

1. 创建应用

iOS IAP教程_第1张图片

首先进入iTunes Connect然后按下 Manage Your Applications

iOS IAP教程_第2张图片

接下来按下Add New Application按钮创建应用

2. 在应用中创建IAP

iOS IAP教程_第3张图片

创建应用之后,在Manage Your Applications中点应用的图示,进入应用

就会看到上图画面点击Manage In App Purchases就可以进入IAP的管理画面

在这边要注意左边的Bundle ID,在Xcode项目中,info.plist中的设定需与此Bundle相同

(此Bundle ID会在创建应用时填入)

iOS IAP教程_第4张图片

此为IAP的管理画面,只要按下Create New按钮就可创建IAP

在本图中我已经创建好三个IAP

而其中要注意的是Product ID,只要用Product ID就可以请求IAP的相关讯息及交易

Consumable

消耗品,每次下载都需付费

Non-Consumable

一次性付费,通常用在升级pro版或是移除广告等

Auto-Renewable Subscriptions

自动更新订阅

Free Subscription

免费订阅

Non-Renewing Subscription

自动更新订阅

3. 如何创建沙盒测试用户

iOS IAP教程_第5张图片

进入iTunes Connect,点击Manage Users

iOS IAP教程_第6张图片

在这个画面中点下Test User

iOS IAP教程_第7张图片

按下Add New User就可以了Email Address就是登入沙盒测试的用户名

密码的部份在Add New User时可自行创建

4.代码

[cpp] view plain copy
  1. /* 
  2.  *  CBiOSStoreManager.h 
  3.  *  CloudBox Cross-Platform Framework Project 
  4.  * 
  5.  *  Created by Cloud on 2012/10/30. 
  6.  *  Copyright 2011 Cloud Hsu. All rights reserved. 
  7.  * 
  8.  */  
  9.   
  10. #import <UIKit/UIKit.h>   
  11. #import <StoreKit/StoreKit.h>  
  12.   
  13. @interface CBiOSStoreManager : NSObject<SKProductsRequestDelegate,SKPaymentTransactionObserver>  
  14. {  
  15.     NSString* _buyProductIDTag;  
  16. }  
  17.   
  18. + (CBiOSStoreManager*) sharedInstance;  
  19.   
  20. - (void) buy:(NSString*)buyProductIDTag;  
  21. - (bool) CanMakePay;  
  22. - (void) initialStore;  
  23. - (void) releaseStore;  
  24. - (void) requestProductData:(NSString*)buyProductIDTag;  
  25. - (void) provideContent:(NSString *)product;  
  26. - (void) recordTransaction:(NSString *)product;  
  27.   
  28. - (void) requestProUpgradeProductData:(NSString*)buyProductIDTag;  
  29. - (void) paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions;  
  30. - (void) purchasedTransaction: (SKPaymentTransaction *)transaction;  
  31. - (void) completeTransaction: (SKPaymentTransaction *)transaction;  
  32. - (void) failedTransaction: (SKPaymentTransaction *)transaction;  
  33. - (void) paymentQueueRestoreCompletedTransactionsFinished: (SKPaymentTransaction *)transaction;  
  34. - (void) paymentQueue:(SKPaymentQueue *) paymentQueue restoreCompletedTransactionsFailedWithError:(NSError *)error;  
  35. - (void) restoreTransaction: (SKPaymentTransaction *)transaction;  
  36.   
  37. @end  

[cpp] view plain copy
  1. /* 
  2.  *  CBiOSStoreManager.mm 
  3.  *  CloudBox Cross-Platform Framework Project 
  4.  * 
  5.  *  Created by Cloud on 2012/10/30. 
  6.  *  Copyright 2011 Cloud Hsu. All rights reserved. 
  7.  * 
  8.  */  
  9.   
  10. #import "CBiOSStoreManager.h"  
  11.   
  12. @implementation CBiOSStoreManager  
  13.   
  14. static CBiOSStoreManager* _sharedInstance = nil;  
  15.   
  16. +(CBiOSStoreManager*)sharedInstance  
  17. {  
  18.     @synchronized([CBiOSStoreManager class])  
  19.     {  
  20.         if (!_sharedInstance)  
  21.             [[self alloc] init];  
  22.           
  23.         return _sharedInstance;  
  24.     }  
  25.     return nil;  
  26. }  
  27.   
  28. +(id)alloc  
  29. {  
  30.     @synchronized([CBiOSStoreManager class])  
  31.     {  
  32.         NSAssert(_sharedInstance == nil, @"Attempted to allocate a second instance of a singleton.\n");  
  33.         _sharedInstance = [super alloc];  
  34.         return _sharedInstance;  
  35.     }  
  36.     return nil;  
  37. }  
  38.   
  39. -(id)init {  
  40.     self = [super init];  
  41.     if (self != nil) {  
  42.         // initialize stuff here  
  43.     }  
  44.     return self;  
  45. }  
  46.   
  47. -(void)initialStore  
  48. {  
  49.     [[SKPaymentQueue defaultQueue] addTransactionObserver:self];  
  50. }  
  51. -(void)releaseStore  
  52. {  
  53.     [[SKPaymentQueue defaultQueue] removeTransactionObserver:self];  
  54. }  
  55.   
  56. -(void)buy:(NSString*)buyProductIDTag  
  57. {  
  58.     [self requestProductData:buyProductIDTag];  
  59. }  
  60.   
  61. -(bool)CanMakePay  
  62. {  
  63.     return [SKPaymentQueue canMakePayments];  
  64. }     
  65.   
  66. -(void)requestProductData:(NSString*)buyProductIDTag  
  67. {  
  68.     NSLog(@"---------Request product information------------\n");  
  69.     _buyProductIDTag = [buyProductIDTag retain];  
  70.     NSArray *product = [[NSArray alloc] initWithObjects:buyProductIDTag,nil];  
  71.     NSSet *nsset = [NSSet setWithArray:product];  
  72.     SKProductsRequest *request=[[SKProductsRequest alloc] initWithProductIdentifiers: nsset];  
  73.     request.delegate=self;  
  74.     [request start];  
  75.     [product release];  
  76. }  
  77.   
  78. - (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response{     
  79.       
  80.     NSLog(@"-----------Getting product information--------------\n");  
  81.     NSArray *myProduct = response.products;  
  82.     NSLog(@"Product ID:%@\n",response.invalidProductIdentifiers);  
  83.     NSLog(@"Product count: %d\n", [myProduct count]);  
  84.     // populate UI  
  85.     for(SKProduct *product in myProduct){  
  86.         NSLog(@"Detail product info\n");  
  87.         NSLog(@"SKProduct description: %@\n", [product description]);  
  88.         NSLog(@"Product localized title: %@\n" , product.localizedTitle);  
  89.         NSLog(@"Product localized descitption: %@\n" , product.localizedDescription);  
  90.         NSLog(@"Product price: %@\n" , product.price);  
  91.         NSLog(@"Product identifier: %@\n" , product.productIdentifier);  
  92.     }  
  93.     SKPayment *payment = nil;  
  94.     payment = [SKPayment paymentWithProduct:[response.products objectAtIndex:0]];  
  95.     NSLog(@"---------Request payment------------\n");  
  96.     [[SKPaymentQueue defaultQueue] addPayment:payment];  
  97.     [request autorelease];      
  98.       
  99. }  
  100. - (void)requestProUpgradeProductData:(NSString*)buyProductIDTag  
  101. {  
  102.     NSLog(@"------Request to upgrade product data---------\n");  
  103.     NSSet *productIdentifiers = [NSSet setWithObject:buyProductIDTag];  
  104.     SKProductsRequest* productsRequest = [[SKProductsRequest alloc] initWithProductIdentifiers:productIdentifiers];  
  105.     productsRequest.delegate = self;  
  106.     [productsRequest start];      
  107.       
  108. }  
  109.   
  110. - (void)request:(SKRequest *)request didFailWithError:(NSError *)error  
  111. {  
  112.     NSLog(@"-------Show fail message----------\n");  
  113.     UIAlertView *alerView =  [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Alert",NULL) message:[error localizedDescription]  
  114.                                                        delegate:nil cancelButtonTitle:NSLocalizedString(@"Close",nil) otherButtonTitles:nil];  
  115.     [alerView show];  
  116.     [alerView release];  
  117. }     
  118.   
  119. -(void) requestDidFinish:(SKRequest *)request  
  120. {  
  121.     NSLog(@"----------Request finished--------------\n");  
  122.       
  123. }     
  124.   
  125. -(void) purchasedTransaction: (SKPaymentTransaction *)transaction  
  126. {  
  127.     NSLog(@"-----Purchased Transaction----\n");  
  128.     NSArray *transactions =[[NSArray alloc] initWithObjects:transaction, nil];  
  129.     [self paymentQueue:[SKPaymentQueue defaultQueue] updatedTransactions:transactions];  
  130.     [transactions release];  
  131. }      
  132.   
  133. - (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions  
  134. {  
  135.     NSLog(@"-----Payment result--------\n");  
  136.     for (SKPaymentTransaction *transaction in transactions)  
  137.     {  
  138.         switch (transaction.transactionState)  
  139.         {  
  140.             case SKPaymentTransactionStatePurchased:  
  141.                 [self completeTransaction:transaction];  
  142.                 NSLog(@"-----Transaction purchased--------\n");  
  143.                 UIAlertView *alerView =  [[UIAlertView alloc] initWithTitle:@"Congratulation"  
  144.                                                               message:@"Transaction suceed!"  
  145.                                                               delegate:nil cancelButtonTitle:NSLocalizedString(@"Close",nil) otherButtonTitles:nil];     
  146.                   
  147.                 [alerView show];  
  148.                 [alerView release];  
  149.                 break;  
  150.             case SKPaymentTransactionStateFailed:  
  151.                 [self failedTransaction:transaction];  
  152.                 NSLog(@"-----Transaction Failed--------\n");  
  153.                 UIAlertView *alerView2 =  [[UIAlertView alloc] initWithTitle:@"Failed"  
  154.                                                                message:@"Sorry, your transcation failed, try again."  
  155.                                                                delegate:nil cancelButtonTitle:NSLocalizedString(@"Close",nil) otherButtonTitles:nil];     
  156.                   
  157.                 [alerView2 show];  
  158.                 [alerView2 release];  
  159.                 break;  
  160.             case SKPaymentTransactionStateRestored:  
  161.                 [self restoreTransaction:transaction];  
  162.                 NSLog(@"----- Already buy this product--------\n");  
  163.             case SKPaymentTransactionStatePurchasing:  
  164.                 NSLog(@"-----Transcation puchasing--------\n");  
  165.                 break;  
  166.             default:  
  167.                 break;  
  168.         }  
  169.     }  
  170. }  
  171.   
  172. - (void) completeTransaction: (SKPaymentTransaction *)transaction     
  173. {  
  174.     NSLog(@"-----completeTransaction--------\n");  
  175.     // Your application should implement these two methods.  
  176.     NSString *product = transaction.payment.productIdentifier;  
  177.     if ([product length] > 0) {     
  178.           
  179.         NSArray *tt = [product componentsSeparatedByString:@"."];  
  180.         NSString *bookid = [tt lastObject];  
  181.         if ([bookid length] > 0) {  
  182.             [self recordTransaction:bookid];  
  183.             [self provideContent:bookid];  
  184.         }  
  185.     }     
  186.       
  187.     // Remove the transaction from the payment queue.     
  188.     [[SKPaymentQueue defaultQueue] finishTransaction: transaction];     
  189.       
  190. }     
  191.   
  192. -(void)recordTransaction:(NSString *)product  
  193. {  
  194.     NSLog(@"-----Record transcation--------\n");  
  195.     // Todo: Maybe you want to save transaction result into plist.  
  196. }     
  197.   
  198. -(void)provideContent:(NSString *)product  
  199. {  
  200.     NSLog(@"-----Download product content--------\n");  
  201. }     
  202.   
  203. - (void) failedTransaction: (SKPaymentTransaction *)transaction  
  204. {  
  205.     NSLog(@"Failed\n");  
  206.     if (transaction.error.code != SKErrorPaymentCancelled)  
  207.     {  
  208.     }  
  209.     [[SKPaymentQueue defaultQueue] finishTransaction: transaction];  
  210. }  
  211. -(void) paymentQueueRestoreCompletedTransactionsFinished: (SKPaymentTransaction *)transaction  
  212. {     
  213.       
  214. }  
  215.   
  216. - (void) restoreTransaction: (SKPaymentTransaction *)transaction  
  217. {  
  218.     NSLog(@"-----Restore transaction--------\n");  
  219. }  
  220.   
  221. -(void) paymentQueue:(SKPaymentQueue *) paymentQueue restoreCompletedTransactionsFailedWithError:(NSError *)error  
  222. {  
  223.     NSLog(@"-------Payment Queue----\n");  
  224. }  
  225.   
  226. #pragma mark connection delegate  
  227. - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data  
  228. {  
  229.     NSLog(@"%@\n",  [[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding] autorelease]);  
  230. }  
  231. - (void)connectionDidFinishLoading:(NSURLConnection *)connection  
  232. {     
  233.       
  234. }     
  235.   
  236. - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response  
  237. {  
  238.     switch([(NSHTTPURLResponse *)response statusCode]) {  
  239.         case 200:  
  240.         case 206:  
  241.             break;  
  242.         case 304:  
  243.             break;  
  244.         case 400:  
  245.             break;  
  246.         case 404:  
  247.             break;  
  248.         case 416:  
  249.             break;  
  250.         case 403:  
  251.             break;  
  252.         case 401:  
  253.         case 500:  
  254.             break;  
  255.         default:  
  256.             break;  
  257.     }  
  258. }     
  259.   
  260. - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error  
  261. {  
  262.     NSLog(@"test\n");  
  263. }     
  264.   
  265. -(void)dealloc  
  266. {  
  267.     [super dealloc];  
  268. }  
  269.   
  270. @end  


[cpp] view plain copy
  1. [[SKPaymentQueue defaultQueue] addTransactionObserver:self];  
由于交易是永久有效的,建议addTransactionObserver这个于应用启动后就行监听,而不要在用户想买东西时才监听

[cpp] view plain copy
  1. - (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions  
交易结果会于此处显示

iOS IAP教程_第8张图片

苹果准备沙盒测试环境需一段时间,若是创建IAP后可以取得资讯,却无法交易成功,要稍待一下

另外若是模拟器可以购买,但真机购买却失败的话,做Hard Reset就可以了,一直按住Home键跟电源键就可以做Hard Reset

按住后会出现关机画面,不要理会它,继续等,直到等到白苹果出现后,就可以放开等重开机完毕后再测试

5. IAP运作流程图

iOS IAP教程_第9张图片

iOS IAP教程_第10张图片

6.范例下载

下载连结

你可能感兴趣的:(iOS IAP教程)