iOS 內(nèi)購(gòu)返回invalidProductIdentifiers

背景

今天早上審核過(guò)了一款A(yù)PP,很開(kāi)心地發(fā)布了。各個(gè)組激動(dòng)地趕緊打開(kāi)AppStore下載,然后一個(gè)大臉的懵逼——Iap無(wú)法購(gòu)買(mǎi),點(diǎn)擊購(gòu)買(mǎi)沒(méi)有任何反應(yīng)。

各個(gè)組第一時(shí)間致電 —— 發(fā)布組說(shuō)發(fā)布參數(shù)一切正常,工程師組表示代碼絕對(duì)無(wú)誤。
既然這樣,讓我們心平氣和地喝杯茶,吃個(gè)午飯,睡個(gè)午覺(jué)。
兩個(gè)小時(shí)過(guò)去了——沒(méi)有任何改變,點(diǎn)擊購(gòu)買(mǎi)依然沒(méi)用。

What the fuck?

hold不住了,開(kāi)始聯(lián)調(diào)。

找到問(wèn)題所在

調(diào)試過(guò)程非常曲折且艱辛。包括重新review代碼、修改debug工程正式服參數(shù)、在越獄機(jī)上用Class-dump調(diào)試、注入代碼。最后發(fā)現(xiàn),

NSSet *s = [NSSet setWithObjects:@"ProductId",  nil];  
SKProductsRequest *request = [[SKProductsRequest alloc] initWithProductIdentifiers:s];  
request.delegate = self;
[request start];

代理回調(diào)的
- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response NS_AVAILABLE_IOS(3_0);

response.products 為空
response.invalidProductIdentifiers 全返回invalidProductIdentifiers

這就很尷尬了。所有的購(gòu)買(mǎi)項(xiàng)都invalid,蘋(píng)果你在逗我,不該呀,APP都審核通過(guò)了,講道理審核員購(gòu)買(mǎi)成功吧,難講,萬(wàn)一審核員大人日理萬(wàn)機(jī)沒(méi)有試過(guò)APP的內(nèi)購(gòu)就通過(guò)了呢?后背一涼,是不是我們什么參數(shù)搞錯(cuò)了。What the fuck? 蘋(píng)果你這個(gè)回調(diào)就不能返回一個(gè)error信息?

invalidProductIdentifiers

既然知道了是購(gòu)買(mǎi)項(xiàng)無(wú)效,就開(kāi)始排除無(wú)效情況。
蘋(píng)果文檔 里寫(xiě)到
Why are my product identifiers being returned in the invalidProductIdentifiers array?

官方文檔-8種情況

翻譯過(guò)來(lái)大概是

  1. 使用了帶有通配符(*)的App ID。(這個(gè)問(wèn)題很好排查,去ITC看一眼即可)
  2. 最近提交的二進(jìn)制文件被拒或者自己撤回。(修改App為準(zhǔn)備提交狀態(tài)即可,最好在ITC刪除被拒的二進(jìn)制文件,不上傳二進(jìn)制文件也可測(cè)試IAP)
  3. 沒(méi)有清除ITC上在出售的IAP商品。
  4. 沒(méi)有使用與App ID相關(guān)聯(lián)的描述文件來(lái)簽名App。
  5. 你可能更改了商品,但是還沒(méi)有在AppStore服務(wù)器生效。(大概會(huì)等幾個(gè)小時(shí)吧,具體不是很清楚)
  6. 還沒(méi)完成所有的金融需求。(我最初的理解是:協(xié)議、稅務(wù)和銀行業(yè)務(wù)沒(méi)有填寫(xiě)完整)
  7. 針對(duì)非消耗型商品,本人沒(méi)仔細(xì)研究,感興趣的童鞋可以點(diǎn)這里了解。
  8. ITC上的商品ID和代碼里的不一致。(對(duì)比一下即可排查)

上面8條參考了簡(jiǎn)書(shū)另一篇文章,前面7條挺好確認(rèn)的,在這補(bǔ)充一下第8條。

NSSet *s = [NSSet setWithObjects:@"ProductId",  nil];  
SKProductsRequest *request = [[SKProductsRequest alloc] initWithProductIdentifiers:s];  
// 確保 @"ProductId" 一定和ITC上配的ProductId是一致的。
// 配的是com.company.app.product,在這兒就用@”com.company.app.product“

接下來(lái)補(bǔ)充幾條:

  1. 手機(jī)網(wǎng)絡(luò)是否能連上ITC??? ??
  2. bundle Id是否一致。
  3. In-App Purchases是否勾選?
  4. ITC上的購(gòu)買(mǎi)項(xiàng),是否是Cleared for Sale?
  5. app是更新提交的話(huà),卸載掉APP重新下載試一下。
  6. ITC銀行信息填寫(xiě)完整并通過(guò)了嗎?

這些假如都確認(rèn)沒(méi)問(wèn)題,那么恭喜你,通關(guān)了。

納尼?

是真的通關(guān)了,在折騰了一下午到晚上,確認(rèn)了各種參數(shù),review了N次代碼,查看了簡(jiǎn)書(shū)、stackoverflow等多篇文獻(xiàn)。萬(wàn)念俱灰,開(kāi)發(fā)組都準(zhǔn)備提交新版本來(lái)和審核員溝通的時(shí)候,準(zhǔn)備購(gòu)買(mǎi)最后一次 —— 就,真的,買(mǎi)成功了——成功了——功了——了——
原來(lái)是Apple跟你開(kāi)了個(gè)玩笑,即使APP能上線了,內(nèi)購(gòu)也不一定能上線。等一等,世界和平。

Apple你過(guò)來(lái)我們談?wù)?/div>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容