为iOS应用/游戏内建购买项目(IAP)

如果CP游戏客户端具有自己的游戏服务器,需要对充值进行数据验证的,可参考《iOS游戏IAP数据服务器验证》

一,前提:

1,注册有iOS开发者账号Apple ID(是注册过开发者账号的Apple
ID,非普通Apple ID)。


2,用上述账号Apple ID登录[苹果开发者官网]
(https://developer.apple.com/account/ios/identifiers/bundle/bundleCreate.action)为在开发的iOS应用注册一个Bundle
identifier(将正在开发的应用注册到iTunes Connect管理时用到)。
注册的字符串和对应应用XCode中的Bundle Identifier字符串
为iOS应用/游戏内建购买项目(IAP)_第1张图片


3.使用1所述开发者账号Apple ID登录 iTunes Connect(iTunes Connect可以用来管理和提交正在开发的iOS应用)。


4,此Apple ID要求已经接受或同意iTunes Connect上的一些条款,主要是关于法律,税务和银行账号完善等。否则账号上登录的很多功能不能使用,如后面注册的商品无效,商品种类选择项缺失等。

使用开发者账号登陆成功后界面如下,然后可以先点击打开最下面的红色框“协议,税务和银行业务“完成条款接受和完善银行账号信息等。
为iOS应用/游戏内建购买项目(IAP)_第2张图片



提示:现在新建APP和注册商品,包括后面的沙盒测试购买,都不会把APP提交到Appstore。

二,为在开发的应用注册商品

1,点击上图第二个红色框”我的APP“后,新建iOS APP,
为iOS应用/游戏内建购买项目(IAP)_第3张图片

为iOS应用/游戏内建购买项目(IAP)_第4张图片

SKU是自己公司应用区分的标识

”套装ID“就是账号上为应用注册过的Bundle Identity,这个要求和Xcode工程上的Bundle Identity一致。

最后,点击”创建“完成。


2,回到”我的APP“,点击刚刚创建的应用,

为iOS应用/游戏内建购买项目(IAP)_第5张图片

选择”App内置购买项目“

为iOS应用/游戏内建购买项目(IAP)_第6张图片

选择有左上角的”Create New“按钮,
为iOS应用/游戏内建购买项目(IAP)_第7张图片

对于网络游戏来讲,如购买”金币100“一般选择”消耗性项目“。(如果你的Apple ID没有完善条款或银行信息将不会看到这个选择类型)
为iOS应用/游戏内建购买项目(IAP)_第8张图片

一路填写下来,产品ID我写”Bundle Identity+自定义的商品名称“来保持唯一性
为iOS应用/游戏内建购买项目(IAP)_第9张图片

最后”Done“。

回到”APP内购买项目“就能够看到自己注册的商品了

这里写图片描述

到此为应用商品注册完成!



三,注册沙盒测试账号

这个账号用来对我们应用内的商品进行购买, 回到iTunes Connect主页,点击”用户和职能“
点击“沙箱技术测试员”
为iOS应用/游戏内建购买项目(IAP)_第10张图片
进去后点击“+”,
然后一路跟着填写,根据提示填写注册信息,完成后就看到自己注册的测试账号:
为iOS应用/游戏内建购买项目(IAP)_第11张图片
测试账号注册完成!


提交商品后并不会立即生效,提交到沙箱环境生效需要一定的时间,如果测试获取不到商品信息可过了一天再试。


四,测试商品
首先从Xcode引进StoreKit框架,import

ViewController.h

#import 
#import 


@interface ViewController : UIViewController <SKPaymentTransactionObserver, SKProductsRequestDelegate>

@end

ViewController.m


#import "ViewController.h"


@interface ViewController ()

@end

@implementation ViewController



- (void)viewDidLoad {
    [super viewDidLoad];


    [self setOnListner];


    UIButton * btn = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    [btn setFrame:CGRectMake(100, 300, self.view.bounds.size.width/2, 50)];
    [btn setTitle:@"buy" forState:UIControlStateNormal];
    btn.backgroundColor = [UIColor purpleColor];
    [btn addTarget:self action:@selector(click) forControlEvents:UIControlEventTouchDown];

    [self.view addSubview:btn];

}

//对交易进行监听和设置可购买
-(void)setOnListner{

    [[SKPaymentQueue defaultQueue] addTransactionObserver:self];
    NSString * des;
    if([SKPaymentQueue canMakePayments]){
        des = @"可购买内置项目!";
    }else{
        des = @"不可购买内置项目!";
    }
    NSLog(@"%@",des);
    UIAlertView * a = [[UIAlertView alloc]initWithTitle:@"tips" message:des delegate:self cancelButtonTitle:@"ok" otherButtonTitles:nil, nil];
    [a show];

}


-(void)click{
    [self reqBuyData];
}

//请求商品信息
-(void)reqBuyData{

    // 所注册的商品ID数组
    NSArray * arr = [[NSArray alloc] initWithObjects:@"com.test.testiap.gold100",@"com.test.testiap.gold500", nil];
    NSSet *set = [NSSet setWithArray:arr];
    SKProductsRequest * req = [[SKProductsRequest alloc] initWithProductIdentifiers:set];
    req.delegate = self;
    [req start];
}



//SKProductsRequestDelegate代理实现

-(void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response{

    NSArray * myProducts = response.products;
    //如果是无效的商品将会出现在这里,如AppleID账号没完善银行信息之类也会导致
    NSArray * dArr = response.invalidProductIdentifiers;


    NSLog(@"接受到产品返回信息%lu", myProducts.count);
    NSLog(@"接受到无效的产品返回信息%lu", dArr.count);

    if(myProducts.count < 1){
        NSLog(@"无有效商品信息!");
        return;
    }

    SKProduct * buyProduct;
    for (SKProduct * product in myProducts) {
        NSLog(@"---pay des : %@", product.localizedDescription);
        NSLog(@"product title:%@", product.localizedTitle);
        NSLog(@"price:%@", product.price);

        buyProduct = product;
    }
    //这里我直接对最后一个商品进行下单购买,
    SKPayment * pay = [SKPayment paymentWithProduct:buyProduct];
    [[SKPaymentQueue defaultQueue] addPayment:pay];

}

//SKProductsRequestDelegate代理实现,请求商品有错log
-(void)request:(SKRequest *)request didFailWithError:(NSError *)error{
    NSLog(@"---------error log----%@", error.localizedDescription);

}
//SKProductsRequestDelegate代理实现
-(void)requestDidFinish:(SKRequest *)request{
    NSLog(@"信息请求结束");
}


//SKPaymentTransactionObserver代理实现
-(void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions
{

    NSString * des;

    for(SKPaymentTransaction * trans in transactions){

        switch (trans.transactionState) {
            case SKPaymentTransactionStatePurchased:
                des = @"购买成功!";
                break;
            case SKPaymentTransactionStateFailed:
                des = @"购买失败!";

                break;
            case SKPaymentTransactionStateRestored:
                des = @"购买重复!";
                break;

            case SKPaymentTransactionStatePurchasing:
                des = @"购买ing!";
                break;
            default:
                break;
        }

        UIAlertView * a = [[UIAlertView alloc] initWithTitle:@"result" message:des delegate:self cancelButtonTitle:@"ok" otherButtonTitles:nil, nil];
        [a show];

    }
}

@end

运行: 这里可输入在沙箱注册的测试者账号进行测试,

为iOS应用/游戏内建购买项目(IAP)_第12张图片

打印信息: 已成功请求到所注册的商品信息!

为iOS应用/游戏内建购买项目(IAP)_第13张图片

以上代码只是说明购买内置产品大概流程,到实际应用时还有先验证商品信息的有效性,并对用户展示商品信息数据等步奏。

你可能感兴趣的:(Unity开发,编程语言类,ios,apple,iOS-IAP)