1 .前往 https://developer.apple.com 添加对应项目 的 iOS App IDs
![图片](https://i-blog.csdnimg.cn/blog_migrate/1839ae12a093b50ad7398422ec6d26cd.gif)
并创建对应的 iOS Provisioning Profiles
3. 你需要在iTunesConnect中创建个新的App,然后为这个App设置一些产品(付费道具)等
![图片](https://i-blog.csdnimg.cn/blog_migrate/86a7886cf0cdc24b68fdfc60fc9c518c.gif)
协议、税务和银行业务 : 管理银行账号、联系人以及税等等;这里要根据提示完成对应的信息填写!一定要详细填写
用户和职能 :管理用户的,比如主账号以及测试付费的(测试App)账号;
我的 APP:管理应用程序的,你所有发布的应用和每个应用的状态都在这里面
4.进入创建的app,进入App 内购买项目 创建自己需要的内购产品
(注意:这里的App的Bundle ID一定要跟你的项目中的info.plist中的Bundle ID保证一致!!!!)
这里可以管理你的项目的信息、状态、是否嵌入GameCenter等等选项,那么我们重点介绍如何使用IAp沙盒测试程序内付费,所以这里我们点击右上角的”App 内购买项目“选项进入创建产品(游戏道具)界面如下:
类型选择有四种选择:
1.Consumable(消耗品): 每次下载都需要付费;
2.Non-consumable(非消耗品): 仅需付费一次;
3.Auto-Renewable Subscriptions:自动订阅;
内部说明:
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;
@end2.创建 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 defaultCenter] postNotificationName:@"kInAppPurchaseManagerProductsFetchedNotification" object:selfuserInfo:nil];
}
//****************************************************************************
//启动时候调用
//****************************************************************************
- (void)loadStore
{
if ([SKPaymentQueue canMakePayments]) {
// restarts any purchases if they were interrupted last time the app was open
[[SKPaymentQueue defaultQueue] addTransactionObserver: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 一致。