*深坑记录,以后发现一些不常见的坑可能会更新
1.一般发生于首次提交app或添加新商品,当你的app通过审核以后,你发现在生产环境下获取不到商品,这是因为app虽然过审核了,但是内购商品还没有正式添加到苹果的服务器里,耐心等待一段时间就可以啦~
2.我创建的IAP商品,当我不用,想删除时,发现无法删除,我点击删除按钮以后,页面就自动刷新,刷新回来,那条商品依然存在,我换了N多浏览器,连手机浏览器都试了,就是不行,没办法只能提交审核,然后苹果给我反馈说他们找不到我这个商品在哪......
- 解决办法:审核时在附加里向苹果说明情况,最好录个视频上传到网站上(优酷就可以),把视频地址给苹果
- 后续:当时有过申诉,但是因为苹果只会给注册开发者账号的邮件发信息,而老大每天都不在公司,所以与苹果的沟通终中断了。我在将App转移账号以后,这个Bug消失了,不知道是转移账号解决的还是苹果修复了。
一:iap开发
具体的开发过程不太想写了,网上太多了,随随便便百度一下就有好几页,这里只给大家推荐一个库,使用起来很方便
下载地址: IAPHelper
NSSet* dataSet = [[NSSet alloc] initWithObjects:@"这里是iap商品id", nil];
[IAPShare sharedHelper].iap = [[IAPHelper alloc] initWithProductIdentifiers:dataSet];
// 请求商品信息
[[IAPShare sharedHelper].iap requestProductsWithCompletion:^(SKProductsRequest* request,SKProductsResponse* response)
{
if(response.products.count > 0 ) {
SKProduct *product = response.products[0];
[[IAPShare sharedHelper].iap buyProduct:product
onCompletion:^(SKPaymentTransaction* trans){
if(trans.error)
{
}
else if(trans.transactionState == SKPaymentTransactionStatePurchased) {
// 到这里购买就成功了,但是因为存在越狱手机下载某些破解内购软件的情况,需要跟苹果服务器的确认是否购买成功
// IAPHelper提供了这个方法,验证这步可以写在前端,也可以写在服务器端,这个自己看情况决定吧...
// 购买验证
NSData *receipt = [NSData dataWithContentsOfURL:[[NSBundle mainBundle] appStoreReceiptURL]];
//网上的攻略有的比较老,在验证时使用的是trans.transactionReceipt,需要注意trans.transactionReceipt在ios9以后被弃用
[[IAPShare sharedHelper].iap checkReceipt:receipt onCompletion:^(NSString *response, NSError *error) {}];
}
else if(trans.transactionState == SKPaymentTransactionStateFailed) {
if (trans.error.code == SKErrorPaymentCancelled) {
}else if (trans.error.code == SKErrorClientInvalid) {
}else if (trans.error.code == SKErrorPaymentInvalid) {
}else if (trans.error.code == SKErrorPaymentNotAllowed) {
}else if (trans.error.code == SKErrorStoreProductNotAvailable) {
}else{
}
}
}];
}else{
// ..未获取到商品
}
}];
关于内购的开发大概就这些,网上攻略贼多,大概搜索一下就能写的出来,iap开发起来虽然不难,但是玛德法克这里面坑实在太多...
二:iap开发时的注意事项
1.什么情况需要使用iap,什么情况使用三方支付
这里我的理解是:
购买的东西是实物,不存在于APP中,用三方支付,比如淘宝等一堆电商,他们的商品都是不存在于App中的。
如果你的支付和购买是为了解锁App的功能,就一定要用iap,即内购
举个栗子:现在有很多在线教育App,比如网易云课堂,腾讯课堂,可以在App中购买视频并在APP中观看,也就是说 '观看视频' 这个功能是本身就存在于APP中的,只是需要你先购买视频,才能使用'观看视频'这个功能,这个时候,这种解锁APP已有功能的操作,就必须要使用iap
2.关于商品类型:iap创建商品时选择的商品类型大概分三类
1.消耗型商品:
类似游戏中的钻石,还有现在某些APP中的货币,比如斗鱼里的鱼丸、映客里的映票。会被消耗的,要选择消耗型商品
2.非消耗型商品:
无法被消耗的商品,比如上文提到的视频课程,一次购买,就应该永久可以观看
3.订阅类型商品:
多用于会员,会员也可以做成用消耗型商品获取的货币来购买
现在不行了,之前提交过很多都没事,也许以前会员功能存在感太低审核团队没发现?又或是最近的新规,新提交的版本因为这个原因被拒了,错误描述:
Business - 3.1.1 We noticed that your app is using Consumable In-App Purchase products as intermediary currency for the exchange of items that function as Non-Renewing Subscriptions.
这里要提一点:如果你的公司是外包公司,有订阅类型商品的APP一定要用客户的账号提交审核,因为当APP中有过订阅类型商品,注意是有过,创建过再删除也算,这个APP无法被转移账号
3.注意事项
1.当你使用消耗型商品
大多数的消耗型商品都是需要登录的,因为需要在数据库存余额嘛。
需要注意的是:在登录之前,你最好不要让用户看到商品,有可能会因为这个原因被拒(看运气),栗子:
如上图。这是充值页面,即商品页面。
你有两个选择:
# 1.增加游客购买,即用户到达充值页面,点击充值时,即使用户未登陆,也能充值
# 2.让未登录用户无法到达充值页面。且必须要由用户来选择
栗子:有个按钮,点击跳转此充值页面,当未登录用户点击按钮时,
你必须要弹出选择框,由用户来选择是登录/注册或者取消,并说明情况
如下:
2.当你使用非消耗型商品
当你使用非消耗型商品时,你需要添加一个恢复购买的按钮
这个常见于各种游戏中,其实知道这个规定以后还是挺好理解的,非消耗型商品是不可被消耗的,一次购买终身使用的,非消耗型的商品是跟appleId绑定的,就是你平时下载APP让你输入账号密码的内个。
你需要一个恢复购买的按钮,来让用户恢复他购买的内容,上面内个IAPHelper也有这个方法,自己看一下
3.订阅型商品
使用或曾经使用过订阅型商品的APP无法转移
在苹果帮助里,有个分类是:什么样的APP可以被转让
我一看,完全符合啊,然后就是开发、提交审核、通过,但是当我转让时却TM提示我无法转让,当我再次回去查看帮助,向下拉网页拉倒底部时
发现有另一个分类:为什么我的APP无法转让。。。。。。