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

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

随后在左上角的选项中选择沙盒测试者,点击左上角的加号图标增加一位测试者,如图:

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

编辑好相应的内容,点击保存,就创建了一个测试账号,是不是很简单啊!当然这个账号如果你忘记了密码可以重新生成一个,无关紧要。

顺带多句嘴,不要在正式的appstore上面用沙盒测试的账号来登录,千万要牢记在心,此账号只用于测试环境下~

接下来就是代码部分啦~

1.首先在项目工程中加入“storekit.framework”,加入头文件#import <StoreKit/StoreKit.h>

2.在.h文件中加入“SKPaymentTransactionObserver,SKProductsRequestDelegate”监听机制

下面贴上内购的核心代码,就几个函数,我在这边就不在做更多详细的解释了,各位看官可以运行跑一下就一目了然了。
.h文件


// 
// PaymentViewController.h 
// IAPPayTest 
// 
// Created by silicon on 14-10-28. 
// Copyright (c) 2014年 silicon. All rights reserved. 
// 
 
#import <UIKit/UIKit.h> 
 
#import <StoreKit/StoreKit.h> 
 
@interface PaymentViewController : UIViewController<SKPaymentTransactionObserver,SKProductsRequestDelegate> 
 
@property (strong, nonatomic) IBOutlet UITextField *productID; 
 
@property (strong, nonatomic) IBOutlet UIButton *purchase; 
 
- (IBAction)purchaseFunc:(id)sender; 
 
@end 

.m文件


// 
// PaymentViewController.m 
// IAPPayTest 
// 
// Created by silicon on 14-10-28. 
// Copyright (c) 2014年 silicon. All rights reserved. 
// 
 
#import "PaymentViewController.h" 
 
@interface PaymentViewController () 
 
@end 
 
@implementation PaymentViewController 
 
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 
{ 
  self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 
  if (self) { 
    // Custom initialization 
  } 
  return self; 
} 
 
- (void)viewDidLoad 
{ 
  [super viewDidLoad]; 
  // Do any additional setup after loading the view from its nib. 
   
  [[SKPaymentQueue defaultQueue] addTransactionObserver:self]; 
  self.productID.text = @"com.games.ztyxs.product_point.1"; 
} 
 
- (void)didReceiveMemoryWarning 
{ 
  [super didReceiveMemoryWarning]; 
  // Dispose of any resources that can be recreated. 
} 
 
- (IBAction)purchaseFunc:(id)sender { 
  NSString *product = self.productID.text; 
  if([SKPaymentQueue canMakePayments]){ 
    [self requestProductData:product]; 
  }else{ 
    NSLog(@"不允许程序内付费"); 
  } 
} 
 
//请求商品 
- (void)requestProductData:(NSString *)type{ 
  NSLog(@"-------------请求对应的产品信息----------------"); 
  NSArray *product = [[NSArray alloc] initWithObjects:type, nil nil]; 
 
  NSSet *nsset = [NSSet setWithArray:product]; 
  SKProductsRequest *request = [[SKProductsRequest alloc] initWithProductIdentifiers:nsset]; 
  request.delegate = self; 
  [request start]; 
   
} 
 
//收到产品返回信息 
- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response{ 
 
  NSLog(@"--------------收到产品反馈消息---------------------"); 
  NSArray *product = response.products; 
  if([product count] == 0){ 
    NSLog(@"--------------没有商品------------------"); 
    return; 
  } 
   
  NSLog(@"productID:%@", response.invalidProductIdentifiers); 
  NSLog(@"产品付费数量:%d",[product count]); 
   
  SKProduct *p = nil; 
  for (SKProduct *pro in product) { 
    NSLog(@"%@", [pro description]); 
    NSLog(@"%@", [pro localizedTitle]); 
    NSLog(@"%@", [pro localizedDescription]); 
    NSLog(@"%@", [pro price]); 
    NSLog(@"%@", [pro productIdentifier]); 
     
    if([pro.productIdentifier isEqualToString:self.productID.text]){ 
      p = pro; 
    } 
  } 
   
  SKPayment *payment = [SKPayment paymentWithProduct:p]; 
   
  NSLog(@"发送购买请求"); 
  [[SKPaymentQueue defaultQueue] addPayment:payment]; 
} 
 
//请求失败 
- (void)request:(SKRequest *)request didFailWithError:(NSError *)error{ 
  NSLog(@"------------------错误-----------------:%@", error); 
} 
 
- (void)requestDidFinish:(SKRequest *)request{ 
  NSLog(@"------------反馈信息结束-----------------"); 
} 
 
 
//监听购买结果 
- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transaction{ 
  for(SKPaymentTransaction *tran in transaction){ 
     
    switch (tran.transactionState) { 
      case SKPaymentTransactionStatePurchased: 
        NSLog(@"交易完成"); 
         
        break; 
      case SKPaymentTransactionStatePurchasing: 
        NSLog(@"商品添加进列表"); 
         
        break; 
      case SKPaymentTransactionStateRestored: 
        NSLog(@"已经购买过商品"); 
       
        break; 
      case SKPaymentTransactionStateFailed: 
        NSLog(@"交易失败"); 
         
        break; 
      default: 
        break; 
    } 
  } 
} 
 
//交易结束 
- (void)completeTransaction:(SKPaymentTransaction *)transaction{ 
  NSLog(@"交易结束"); 
   
  [[SKPaymentQueue defaultQueue] finishTransaction:transaction]; 
} 
 
 
- (void)dealloc{ 
  [[SKPaymentQueue defaultQueue] removeTransactionObserver:self]; 
  [super dealloc]; 
} 
 
@end