课程表

iOS课程

工具箱
速查手册

应用内购买

当前位置:免费教程 » 移动开发 » iOS

简介

应用程序内购买是应用程序用于购买额外内容或升级功能。

实例步骤

1.在 iTunes 连接中请确保拥有一个唯一的 App ID(unique App ID ),当创建捆绑的ID( bundle ID)应用程序更新时,代码会以相应的配置文件签名在Xcode上

2.创建新的应用程序和更新应用程序信息。你可以知道更多有关的,在苹果的 添加新的应用程序 文档中

3.在应用程序页的管理应用程序( Manage In-App Purchase)中,为app内付费添加新产品

4.确保设置的应用程序为的银行详细。需要将其设置为在应用程序内购买(In-App purchase)。此外在 iTunes 中使用管理用户(Manage Users)选项,创建一个测试用户帐户连接您的应用程序的页。

5.下一步是与处理代码和为我们在应用程序内购买创建有关的 UI。

6.创建一个单一的视图应用程序,并在 iTunes 中指定的标识符连接输入捆绑标识符

7.更新ViewController.xib ,如下所示

InAppPurchase_OutputInterface

8.为三个标签创建IBOutlets,且将按钮分别命名为 productTitleLabel、 productDescriptionLabel、 productPriceLabel 和 purchaseButton

9.选择项目文件,然后选择目标,然后添加StoreKit.framework

10.更新ViewController.h ,如下所示

  1. #import <UIKit/UIKit.h>
  2. #import <StoreKit/StoreKit.h>
  3.  
  4. @interface ViewController : UIViewController<
  5. SKProductsRequestDelegate,SKPaymentTransactionObserver>
  6. {
  7. SKProductsRequest *productsRequest;
  8. NSArray *validProducts;
  9. UIActivityIndicatorView *activityIndicatorView;
  10. IBOutlet UILabel *productTitleLabel;
  11. IBOutlet UILabel *productDescriptionLabel;
  12. IBOutlet UILabel *productPriceLabel;
  13. IBOutlet UIButton *purchaseButton;
  14. }
  15. - (void)fetchAvailableProducts;
  16. - (BOOL)canMakePurchases;
  17. - (void)purchaseMyProduct:(SKProduct*)product;
  18. - (IBAction)purchase:(id)sender;
  19.  
  20. @end

11.更新ViewController.m ,如下所示

  1. #import "ViewController.h"
  2. #define kTutorialPointProductID
  3. @"com.tutorialPoints.testApp.testProduct"
  4.  
  5. @interface ViewController ()
  6.  
  7. @end
  8.  
  9. @implementation ViewController
  10.  
  11. - (void)viewDidLoad
  12. {
  13. [super viewDidLoad];
  14. // Adding activity indicator
  15. activityIndicatorView = [[UIActivityIndicatorView alloc]
  16. initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];
  17. activityIndicatorView.center = self.view.center;
  18. [activityIndicatorView hidesWhenStopped];
  19. [self.view addSubview:activityIndicatorView];
  20. [activityIndicatorView startAnimating];
  21. //Hide purchase button initially
  22. purchaseButton.hidden = YES;
  23. [self fetchAvailableProducts];
  24. }
  25.  
  26. - (void)didReceiveMemoryWarning
  27. {
  28. [super didReceiveMemoryWarning];
  29. // Dispose of any resources that can be recreated.
  30. }
  31.  
  32. -(void)fetchAvailableProducts{
  33. NSSet *productIdentifiers = [NSSet
  34. setWithObjects:kTutorialPointProductID,nil];
  35. productsRequest = [[SKProductsRequest alloc]
  36. initWithProductIdentifiers:productIdentifiers];
  37. productsRequest.delegate = self;
  38. [productsRequest start];
  39. }
  40.  
  41. - (BOOL)canMakePurchases
  42. {
  43. return [SKPaymentQueue canMakePayments];
  44. }
  45. - (void)purchaseMyProduct:(SKProduct*)product{
  46. if ([self canMakePurchases]) {
  47. SKPayment *payment = [SKPayment paymentWithProduct:product];
  48. [[SKPaymentQueue defaultQueue] addTransactionObserver:self];
  49. [[SKPaymentQueue defaultQueue] addPayment:payment];
  50. }
  51. else{
  52. UIAlertView *alertView = [[UIAlertView alloc]initWithTitle:
  53. @"Purchases are disabled in your device" message:nil delegate:
  54. self cancelButtonTitle:@"Ok" otherButtonTitles: nil];
  55. [alertView show];
  56. }
  57. }
  58. -(IBAction)purchase:(id)sender{
  59. [self purchaseMyProduct:[validProducts objectAtIndex:0]];
  60. purchaseButton.enabled = NO;
  61. }
  62.  
  63. #pragma mark StoreKit Delegate
  64.  
  65. -(void)paymentQueue:(SKPaymentQueue *)queue
  66. updatedTransactions:(NSArray *)transactions {
  67. for (SKPaymentTransaction *transaction in transactions) {
  68. switch (transaction.transactionState) {
  69. case SKPaymentTransactionStatePurchasing:
  70. NSLog(@"Purchasing");
  71. break;
  72. case SKPaymentTransactionStatePurchased:
  73. if ([transaction.payment.productIdentifier
  74. isEqualToString:kTutorialPointProductID]) {
  75. NSLog(@"Purchased ");
  76. UIAlertView *alertView = [[UIAlertView alloc]initWithTitle:
  77. @"Purchase is completed succesfully" message:nil delegate:
  78. self cancelButtonTitle:@"Ok" otherButtonTitles: nil];
  79. [alertView show];
  80. }
  81. [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
  82. break;
  83. case SKPaymentTransactionStateRestored:
  84. NSLog(@"Restored ");
  85. [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
  86. break;
  87. case SKPaymentTransactionStateFailed:
  88. NSLog(@"Purchase failed ");
  89. break;
  90. default:
  91. break;
  92. }
  93. }
  94. }
  95.  
  96. -(void)productsRequest:(SKProductsRequest *)request
  97. didReceiveResponse:(SKProductsResponse *)response
  98. {
  99. SKProduct *validProduct = nil;
  100. int count = [response.products count];
  101. if (count>0) {
  102. validProducts = response.products;
  103. validProduct = [response.products objectAtIndex:0];
  104. if ([validProduct.productIdentifier
  105. isEqualToString:kTutorialPointProductID]) {
  106. [productTitleLabel setText:[NSString stringWithFormat:
  107. @"Product Title: %@",validProduct.localizedTitle]];
  108. [productDescriptionLabel setText:[NSString stringWithFormat:
  109. @"Product Desc: %@",validProduct.localizedDescription]];
  110. [productPriceLabel setText:[NSString stringWithFormat:
  111. @"Product Price: %@",validProduct.price]];
  112. }
  113. } else {
  114. UIAlertView *tmp = [[UIAlertView alloc]
  115. initWithTitle:@"Not Available"
  116. message:@"No products to purchase"
  117. delegate:self
  118. cancelButtonTitle:nil
  119. otherButtonTitles:@"Ok", nil];
  120. [tmp show];
  121. }
  122. [activityIndicatorView stopAnimating];
  123. purchaseButton.hidden = NO;
  124. }
  125.  
  126. @end

注意: 需要修改你创建In-App Pur(应用内购买)的 kTutorialPointProductID 。通过修改fetchAvailableProducts产品标识符的 NSSet, 你可以添加多个产品。

输出

运行该应用程序,输出结果如下

InAppPurchase_Output1

确保已经中登录。单击购买选择现有的Apple ID。输入有效的测试帐户的用户名和密码。几秒钟后,显示下面的信息

InAppPurchase_Output2

一旦产品成功购买,将获得以下信息。可以在显示此信息的地方,更新应用功能相关的代码

InAppPurchase_Output3

转载本站内容时,请务必注明来自W3xue,违者必究。
 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号