IOS内购集成(InAppPurchase)

集成步骤:
1 .前往  https://developer.apple.com 添加对应项目 的 iOS App IDs
图片
并创建对应的
iOS Provisioning Profiles

3. 
  你需要在iTunesConnect中创建个新的App,然后为这个App设置一些产品(付费道具)等
(注: iTunesConnect是苹果提供的一个平台,主要提供AP发布和管理App的,最重要的功能是创建管理项目信息,项目付费产品(道具)管理、付费的测试账号、提交App等等 )
 
图片

协议、税务和银行业务   : 管理银行账号、联系人以及税等等;这里要根据提示完成对应的信息填写!一定要详细填写

用户和职能 :管理用户的,比如主账号以及测试付费的(测试App)账号;
我的 APP:管理应用程序的,你所有发布的应用和每个应用的状态都在这里面

 4.进入创建的app,进入App 内购买项目 创建自己需要的内购产品
图片 

(注意:这里的App的Bundle ID一定要跟你的项目中的info.plist中的Bundle ID保证一致!!!!)

     这里可以管理你的项目的信息、状态、是否嵌入GameCenter等等选项,那么我们重点介绍如何使用IAp沙盒测试程序内付费,所以这里我们点击右上角的”App 内购买项目“选项进入创建产品(游戏道具)界面如下:
图片 

(创建说明 )
    类型选择有四种选择:

   1.Consumable(消耗品): 每次下载都需要付费;

   2.Non-consumable(非消耗品): 仅需付费一次;

   3.Auto-Renewable Subscriptions:自动订阅;

   4.Free Subscription:免费订阅
    内部说明:
   
Reference Name: 付费产品(道具的)参考名称

   Product ID(产品ID): 你产品的唯一id。通常格式是 com.xx.yy,但它可以是任何形式,不要求以程序的App ID作为前缀。

   Add Language: 添加产品名称与描述语言;

   Price Tier:选择价格,这里你选择价格后,会出现如上图最下方的价格对照表

   Screenshot(截屏): 展示你产品的截屏

  5.进入 [ 用户和职能 ] 添加对应内部测试人员(省略)

***********附上代码***********
1.创建 
InAppPurchaseManager.h 代码如下
 

#import <StoreKit/StoreKit.h>



@interface InAppPurchaseManager : NSObject <SKProductsRequestDelegate,SKPaymentTransactionObserver>

{

    SKProduct *proUpgradeProduct;

    SKProductsRequest *productsRequest;

}

+ (InAppPurchaseManager *) shareMessageAppPurchaseManager;

//查询内购项目

- (void)requestProUpgradeProductData;

//启动时候调用

- (void)loadStore;

//购买产品

- (void)purchaseGoods:(NSString *)productId;

//检查是否支持内购付费

- (BOOL)canMakePurchases;

//提示

- (void)showTipMess:(NSString *)contents;


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

// 存储收据交易记录

- (void)recordTransaction:(SKPaymentTransaction *)transaction;

// enable pro features

- (void)provideContent:(NSString *)productId;

// 删除交易从队列和张贴通知与交易结果

- (void)finishTransaction:(SKPaymentTransaction *)transaction wasSuccessful:(BOOL)wasSuccessful;

// 交易成功后调用

- (void)completeTransaction:(SKPaymentTransaction *)transaction;

// 已经购买过该商品

- (void)restoreTransaction:(SKPaymentTransaction *)transaction;

// 失败时候调用

- (void)failedTransaction:(SKPaymentTransaction *)transaction;

// 当用户购买的操作有结果时,就会触发下面的回调函数,相应进行处理即可

- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions;

@end  

 
2.创建  InAppPurchaseManager.mm 代码如下

/****************************************************************************

 

                ios集成内购(In AppPurchase Product)

 

 ****************************************************************************/

#import "InAppPurchaseManager.h"


static InAppPurchaseManager *_pInAppPurchaseManager = [[InAppPurchaseManager alloc] init];


@implementation InAppPurchaseManager

//****************************************************************************

//返回内购管理指针

//****************************************************************************

+ (InAppPurchaseManager *) shareMessageAppPurchaseManager

{

    

    return _pInAppPurchaseManager;

}

//****************************************************************************

//查询内购项目

//****************************************************************************

- (void)requestProUpgradeProductData

{

    NSSet *productIdentifiers = [NSSet setWithObject:@"com.ideastudio.xxxx.xxxx"]; //内购产品编号

    productsRequest = [[SKProductsRequest alloc] initWithProductIdentifiers:productIdentifiers];

    productsRequest.delegate = self;

    [productsRequest start];

    

}

//****************************************************************************

//查询回调

//****************************************************************************

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

{

     NSArray *products = response.products;

     proUpgradeProduct = [products count] == 1 ? [[products firstObject] retain] : nil;

    if (proUpgradeProduct)

    {

          NSLog(@"Product title: %@" , proUpgradeProduct.localizedTitle);

          NSLog(@"Product description: %@" , proUpgradeProduct.localizedDescription);

          NSLog(@"Product price: %@" , proUpgradeProduct.price);

          NSLog(@"Product id: %@" , proUpgradeProduct.productIdentifier);

     }

    else

    {

        NSLog(@"无法获取产品信息失败。");

    }

     for (NSString *invalidProductId in response.invalidProductIdentifiers)

    {

        NSLog(@"Invalid product id: %@" , invalidProductId);

    }

    

    // finally release the reqest we alloc/init’ed in requestProUpgradeProductData

    [productsRequest release];

    [[NSNotificationCenter defaultCenterpostNotificationName:@"kInAppPurchaseManagerProductsFetchedNotification" object:selfuserInfo:nil];

}




//****************************************************************************

//启动时候调用

//****************************************************************************

- (void)loadStore

{

    if ([SKPaymentQueue canMakePayments]) {

        // restarts any purchases if they were interrupted last time the app was open

        [[SKPaymentQueue defaultQueueaddTransactionObserver:self];

        

        // get the product description (defined in early sections)

        [self requestProUpgradeProductData];

    }

    else

    {

        {

           NSLog(@"失败,用户禁止应用内付费购买.");

        }

    }

}

//****************************************************************************

// 检测用户是否允许付费

//****************************************************************************

- (BOOL)canMakePurchases

{

    return [SKPaymentQueue canMakePayments];

}


//****************************************************************************

// 存储收据交易记录

//****************************************************************************

- (void)recordTransaction:(SKPaymentTransaction *)transaction

{

   

    [[NSUserDefaults standardUserDefaults] setValue:transaction.transactionReceipt forKey:@"proUpgradeTransactionReceipt" ];

    [[NSUserDefaults standardUserDefaults] synchronize];

    

}

//****************************************************************************

// enable pro features

//****************************************************************************

- (void)provideContent:(NSString *)productId

{

   

    if ([productId isEqualToString:productId])

    {

        // enable the pro features

        [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"isProUpgradePurchased" ];

        [[NSUserDefaults standardUserDefaults] synchronize];

    }

}

//****************************************************************************

// 购买商品

//****************************************************************************

- (void)purchaseGoods:(NSString *)productId

{

    SKPayment *payment = [SKPayment paymentWithProductIdentifier:productId];

    [[SKPaymentQueue defaultQueue] addPayment:payment];

}

//****************************************************************************

// 删除交易从队列和张贴通知与交易结果

//****************************************************************************

- (void)finishTransaction:(SKPaymentTransaction *)transaction wasSuccessful:(BOOL)wasSuccessful

{

    // remove the transaction from the payment queue.

    [[SKPaymentQueue defaultQueue] finishTransaction:transaction];

    

    NSDictionary *userInfo = [NSDictionary dictionaryWithObjectsAndKeys:transaction, @"transaction" , nil];

    if (wasSuccessful)

    {

        // send out a notification that we’ve finished the transaction

        [[NSNotificationCenter defaultCenter] postNotificationName:@"kInAppPurchaseManagerTransactionSucceededNotification"object:self userInfo:userInfo];

    }

    else

    {

        // send out a notification for the failed transaction

        [[NSNotificationCenter defaultCenter] postNotificationName:@"kInAppPurchaseManagerTransactionFailedNotification"object:self userInfo:userInfo];

    }

}

//****************************************************************************

//提示框

//****************************************************************************

- (void)showTipMess:(NSString *)contents

{

    UIAlertView *alerView =  [[UIAlertView alloc] initWithTitle:@" "

                                                        message:contents

                                                       delegate:nil cancelButtonTitle:NSLocalizedString(@"Close(关闭)",nil) otherButtonTitles:nil];

    

    [alerView show];

    [alerView release];

}

//****************************************************************************

// 交易成功后调用

//****************************************************************************

- (void)completeTransaction:(SKPaymentTransaction *)transaction

{

    [self recordTransaction:transaction];

    [self provideContent:transaction.payment.productIdentifier];

    [self finishTransaction:transaction wasSuccessful:YES];

}

//****************************************************************************

// 已经购买过该商品

//****************************************************************************

- (void)restoreTransaction:(SKPaymentTransaction *)transaction

{

    [self recordTransaction:transaction.originalTransaction];

    [self provideContent:transaction.originalTransaction.payment.productIdentifier];

    [self finishTransaction:transaction wasSuccessful:YES];

}

//****************************************************************************

// 失败时候调用

//****************************************************************************

- (void)failedTransaction:(SKPaymentTransaction *)transaction

{

    if (transaction.error.code != SKErrorPaymentCancelled)

    {

        // error!

        [self finishTransaction:transaction wasSuccessful:NO];

    }

    else

    {

        // this is fine, the user just cancelled, so don’t notify

        [[SKPaymentQueue defaultQueue] finishTransaction:transaction];

    }

    [self showTipMess:@"交易失败"];

}

//****************************************************************************

// 当用户购买的操作有结果时,就会触发下面的回调函数,相应进行处理即可

//****************************************************************************

- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions

{

    for (SKPaymentTransaction *transaction in transactions)

    {

        switch (transaction.transactionState)

        {

            case SKPaymentTransactionStatePurchased://交易完成

                

                [self completeTransaction:transaction];

                break;

            case SKPaymentTransactionStateFailed://交易失败

                [self failedTransaction:transaction];

                break;

            case SKPaymentTransactionStateRestored://已经购买过该商品

                [self restoreTransaction:transaction];

                break;

            default:

                break;

        }

    }

}



@end

 


注意:

代码注释的相当清楚了,没有什么可解释,这里说几点值得注意的地方:

1.添加对应对应代码时不要忘记,添加框架 StoreKit.framework,如何添加框架

2. 越狱机器无法沙盒测试!模拟器的话,4.3模拟器不可以,因为提示没有开启程序内付费- -;但是使用iOS5的模拟器可以测试沙盒,但是执行的顺序会有些问题,但是还没真机的童鞋可以使用,建议一切以真机实测为准

3. 千万不要忘记在iTunesConnect中创建App Bundle ID一定要跟你的项目中的info.plist中的Bundle ID保证一致!!!!  

顺便提示一下:Bundle ID 尽可能与开发者证书的app ID 一致。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值