*深坑记录,以后发现一些不常见的坑可能会更新
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提供了这个方法,验证这步可以写在前端,也可以写在服务器端,这个自己看情况决定吧...
### // !! 这里有一种情况需要注意。程序走到这里的时候,已经是支付成功的状态。
### // 此时用户的钱已经被苹果扣掉了,接下来需要做的是验证购买信息。
### // 但是如果在 '购买成功'——'验证订单' 中间出现问题,断网、App崩溃等问题的话,会出现扣了钱但是充值失败的情况
### // 所以在这里可以将下文中的验证信息存在本地,验证成功再后删除。验证失败的话,可以在每次App启动时将信息取出来重新验证
// 购买验证
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创建商品时选择的商品类型大概分三类
Paste_Image.png1.消耗型商品:
类似游戏中的钻石,还有现在某些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无法转让。。。。。。
网友评论
发件人 Apple
3. 1.1 Business: Payments - In-App Purchase
Guideline 3.1.1 - Business - Payments - In-App Purchase
We noticed that your app uses in-app purchase products to purchase credits or currencies that are not consumed within the app, which is not appropriate for the App Store.
Next Steps
To resolve this issue, please revise your app to ensure that the credits or currencies purchased with in-app purchase products are used within the app or remove the in-app purchases entirely.
Request a phone call from App Review
At your request, we can arrange for an Apple Representative to call you within the next three to five business days to discuss your App Review issue. Our representative will be able to discuss the issue in English or Chinese.
Request a call to discuss your app’s review.
申请应用审核团队致电联系
如果您有需要,我们将根据您的要求在三到五个工作日内安排一位精通中文的苹果公司代表致电与您联系,讨论您的应用审核结果。
申请应用审核团队致电联系
申請應用審核團隊致電聯繫
如果您有需要,我們將根據您的要求在三到五個工作日內安排一位精通中文的蘋果公司代表致電與您聯繫,討論您的應用審核結果。
申請應用審核團隊致電聯繫
Since your App Store Connect status is Rejected, a new binary will be required.
1、我们的app是一个照片出售平台,用户通过app上传并出售照片,但是这个照片一般都是需要通过第三方编辑软件(PS之类)编辑之后才能使用,也就是说不能用在app里面,按理说应该不属于内购范畴,但是被苹果强制要求增加内购,您看这个是否属于内购?
2、如果增加内购的话,由于用户出售照片时定价都是随意的,所以没办法提前设定价格档位,是不是只能通过中间货币的方式处理?先充值中间货币,然后用中间货币购买照片,这种应该算是消耗型产品吧?
望帮忙解答!万分感谢!
我遇到了这个问题, 本来选的是消耗型,他让我 换成 非更新续订,好吧,我改成非更新续订,他又说我的商品不对,报的还是这个错误
Guideline 3.1.1 - Business - Payments - In-App Purchase
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.
Next Steps
To resolve this issue, please delete your consumable in-app purchase products, then create separate non-renewing subscription in-app purchase products for each item that the user would have exchanged those consumable products for. This product type matches the usage model for the products you are ultimately selling to your users.
Note: The product type cannot be changed once an in-app purchase product has been created. Therefore, you will need to create a new in-app purchase product with the correct product type.
To create new in-app purchases:
- Log in to iTunes Connect
- Click on "My Apps"
- Select your app
- Click on "Features" to create new in-app purchases
- Click Save
- Once you've completed all changes, click the "Submit for Review" button at the top of the App Version Information page.
Resources
真是无语了
我最近在做订阅型的内购
苹果服务器老是给我返回21004 说我共享密钥不匹配
我用的是网上的代码 不知道如何添加共享密钥
可以指示一下吗
Please refer to the attached screenshot/s for more information.
这是什么问题?楼主。苹果的描述一如既往这么不知所云。
[[IAPShare sharedHelper].iap checkReceipt:receipt onCompletion:^(NSString *response, NSError *error) {}
验证response,返回的很长一串,如何知道是验证成功?很急的~
第一次能购买成功,然后第二次购买能够弹出确认框,点击购买返回 SKErrorDomain Code=0 无法连接 itunes 的错误,然后再次购买,又能成功
另外还有个问题:我只想做个内购的demo试一下,在创建app的时候也需要填写真实的银行信息吗?不配置可以吗?