背景
今天早上審核過了一款APP,很開心地發布了。各個組激動地趕緊打開AppStore下載,然后一個大臉的懵逼——Iap無法購買,點擊購買沒有任何反應。
各個組第一時間致電 —— 發布組說發布參數一切正常,工程師組表示代碼絕對無誤。
既然這樣,讓我們心平氣和地喝杯茶,吃個午飯,睡個午覺。
兩個小時過去了——沒有任何改變,點擊購買依然沒用。
hold不住了,開始聯調。
找到問題所在
調試過程非常曲折且艱辛。包括重新review代碼、修改debug工程正式服參數、在越獄機上用Class-dump調試、注入代碼。最后發現,
NSSet *s = [NSSet setWithObjects:@"ProductId", nil];
SKProductsRequest *request = [[SKProductsRequest alloc] initWithProductIdentifiers:s];
request.delegate = self;
[request start];
代理回調的
- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response NS_AVAILABLE_IOS(3_0);
response.products 為空
response.invalidProductIdentifiers 全返回invalidProductIdentifiers
這就很尷尬了。所有的購買項都invalid,蘋果你在逗我,不該呀,APP都審核通過了,講道理審核員購買成功吧,難講,萬一審核員大人日理萬機沒有試過APP的內購就通過了呢?后背一涼,是不是我們什么參數搞錯了。What the fuck? 蘋果你這個回調就不能返回一個error信息?
invalidProductIdentifiers
既然知道了是購買項無效,就開始排除無效情況。
蘋果文檔 里寫到
Why are my product identifiers being returned in the invalidProductIdentifiers array?
翻譯過來大概是
- 使用了帶有通配符(*)的App ID。(這個問題很好排查,去ITC看一眼即可)
- 最近提交的二進制文件被拒或者自己撤回。(修改App為準備提交狀態即可,最好在ITC刪除被拒的二進制文件,不上傳二進制文件也可測試IAP)
- 沒有清除ITC上在出售的IAP商品。
- 沒有使用與App ID相關聯的描述文件來簽名App。
- 你可能更改了商品,但是還沒有在AppStore服務器生效。(大概會等幾個小時吧,具體不是很清楚)
- 還沒完成所有的金融需求。(我最初的理解是:協議、稅務和銀行業務沒有填寫完整)
- 針對非消耗型商品,本人沒仔細研究,感興趣的童鞋可以點這里了解。
- ITC上的商品ID和代碼里的不一致。(對比一下即可排查)
上面8條參考了簡書另一篇文章,前面7條挺好確認的,在這補充一下第8條。
NSSet *s = [NSSet setWithObjects:@"ProductId", nil];
SKProductsRequest *request = [[SKProductsRequest alloc] initWithProductIdentifiers:s];
// 確保 @"ProductId" 一定和ITC上配的ProductId是一致的。
// 配的是com.company.app.product,在這兒就用@”com.company.app.product“
接下來補充幾條:
- 手機網絡是否能連上ITC??? ??
- bundle Id是否一致。
- In-App Purchases是否勾選?
- ITC上的購買項,是否是Cleared for Sale?
- app是更新提交的話,卸載掉APP重新下載試一下。
- ITC銀行信息填寫完整并通過了嗎?
這些假如都確認沒問題,那么恭喜你,通關了。
是真的通關了,在折騰了一下午到晚上,確認了各種參數,review了N次代碼,查看了簡書、stackoverflow等多篇文獻。萬念俱灰,開發組都準備提交新版本來和審核員溝通的時候,準備購買最后一次 —— 就,真的,買成功了——成功了——功了——了——
原來是Apple跟你開了個玩笑,即使APP能上線了,內購也不一定能上線。等一等,世界和平。