因为ios政策问题,如果开发者需要在ios客户端中加入购买(虚拟货币)项目,需要使用ios应用内付费IAP这种方式,这也是很多苹果APP不和安卓共通的原因。因为苹果需要抽取%30的利益,详细原因就不赘述。
当你需要使用苹果内付费这项功能,首先你要有一个开发者账号,如果是公司开发者则需要申请一个公司的开发者账号而非个人,涉及到邓白氏编码的申请,我会在之后的文章提到。当你有开发这账号时,先不用打开X-code,因为内购项目最复杂的部分不是代码部分而是繁杂项目的申请。
首先你要登陆到 iTunescConnect"https://itunesconnect.apple.com",先新建一个测试内购的APP,点击我的APP,进入页面后点击左上角的+号按钮选择新建APP,填写平台IOS,名称和语言等,这里要说的是套装ID和SKU,SKU为你的此应用区别其他应用的标示符,你可以随便填写数字。而套装ID则需要去 https://developer.apple.com里的Member Center里申请,选择Certificates, Identifiers & Profiles,再选择IOS APP里的Certificates,进入页面左边选择APP IDs,点击右上角+号,App ID Description随意填写一个name,在Bundle ID里填写格式如下的名字com.XXX.XX,这里最后一个字段一定要写唯一标识符,如com.pokhara.ipa。然后continue提交之后就OK了。注意这里的Bundle ID必须和你之后工程里的Bundle ID相同。然后回到前面新建APP里将这个Bundle ID填进去,新建好一个APP,至此内购的五大步骤的第一步就实现了。
第二步就是填写银行账户信息,就是你用来收款的一些信息。回到iTunescConnect,选择协议、税务和银行业务,这里必须填写详细。详细信息咨询你的公司会计吧,毕竟你是程序员。。。如果你的银行信息填写完毕后银行这个页面的表格应该显示的都是set up的样子
第三步是为你的APP增加内购项目,点击你新建的APP项目。点击导航栏上的功能你会看到APP内购买项目,点击+号。选择消耗性项目(如打怪金币,QQ斗地主欢乐豆,可以重复购买),参考名称可以随意,但是产品ID一定要记住,最好写成com.项目名.coinXX这样,方便你记录。价格等级对应的是你的内购项目的价格。Tier 1对应的就是US$0.99也就是大概6元人民币。选择语言里的显示语言就是你想显示的商品名称,提交一个正确格式的截图,这一步就算搞定了。回到APP内购买项目里回发现这个商品已经被添加了,你会看到一个准备提交的黄色按钮或者绿色按钮或者。。。(作者色盲,不好意思,不过,不重要!),因为这时候我们已经可以用它测试了,还差最后一步就可以打开久违的X-code了。
第四步,申请沙箱测试员,因为是模拟支付环境所以需要回到iTunescConnect,选择用户和职能,沙箱技术测试员,随意添加一个,记住账号密码就OK了,如果提醒你账号已经和APPstore绑定了就随便编一个邮箱账号就OK了。申请完毕,ios 应用内付费就基本大功告成。
第五步,打开Xcode填写上刚申请的Budle ID,然后就是自己写一个购买界面,加入代理点击事件上代码
#import <StoreKit/StoreKit.h>
- (void)viewDidUnload {
[super viewDidUnload];
[[SKPaymentQueue defaultQueue] removeTransactionObserver:self];
}
-(void)clik:(id)sender
{
if ([SKPaymentQueue canMakePayments]) {//首先判断能否购买,可以购买设置需要购买的信息
// 执行下面提到的第5步:
[self getProductInfo];
} else {
NSLog(@"失败,用户禁止应用内付费购买.");
}
}
// 下面的ProductId应该是事先在itunesConnect中添加好的,已存在的付费项目。否则查询会失败。
- (void)getProductInfo {
NSSet * set = [NSSet setWithArray:@[@"com.shuhai.coin1500"]];
SKProductsRequest * request = [[SKProductsRequest alloc] initWithProductIdentifiers:set];
request.delegate = self;
[request start];
}
// 以上查询的回调函数
- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response {
NSArray *myProduct = response.products;
if (myProduct.count == 0) {
NSLog(@"无法获取产品信息,购买失败。");
return;
}
SKPayment * payment = [SKPayment paymentWithProduct:myProduct[0]];
[[SKPaymentQueue defaultQueue]addTransactionObserver:self];
[[SKPaymentQueue defaultQueue] addPayment:payment];
}
- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions {
for (SKPaymentTransaction *transaction in transactions)
{
switch (transaction.transactionState)
{
case SKPaymentTransactionStatePurchased://交易完成
NSLog(@"transactionIdentifier = %@", transaction.transactionIdentifier);
[self completeTransaction:transaction];
break;
case SKPaymentTransactionStateFailed://交易失败
[self failedTransaction:transaction];
break;
case SKPaymentTransactionStateRestored://已经购买过该商品
[self restoreTransaction:transaction];
break;
case SKPaymentTransactionStatePurchasing: //商品添加进列表
NSLog(@"商品添加进列表");
break;
default:
break;
}
}
}
- (void)completeTransaction:(SKPaymentTransaction *)transaction {
// Your application should implement these two methods.
NSString * productIdentifier = transaction.payment.productIdentifier;
// NSString * receipt = [transaction.transactionReceipt base64EncodedString];
if ([productIdentifier length] > 0) {
// 向自己的服务器验证购买凭证
}
// Remove the transaction from the payment queue.
[[SKPaymentQueue defaultQueue] finishTransaction: transaction];
}
- (void)failedTransaction:(SKPaymentTransaction *)transaction {
if(transaction.error.code != SKErrorPaymentCancelled) {
NSLog(@"购买失败");
} else {
NSLog(@"用户取消交易");
}
[[SKPaymentQueue defaultQueue] finishTransaction: transaction];
}
- (void)restoreTransaction:(SKPaymentTransaction *)transaction {
// 对于已购商品,处理恢复购买的逻辑
[[SKPaymentQueue defaultQueue] finishTransaction: transaction];
}
其中NSSet * set = [NSSet setWithArray:@[@"XXXXXX"]];为你购买项目的ID;注意用真机测试,在手机设置的iTunes Store与App Store,注销掉你之前的账号,登陆你的沙箱测试员账号测试。
viewdidload加一句
[[SKPaymentQueuedefaultQueue] addTransactionObserver:self];