背景
今天早上審核過(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)用。

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?

翻譯過(guò)來(lái)大概是
- 使用了帶有通配符(*)的App ID。(這個(gè)問(wèn)題很好排查,去ITC看一眼即可)
- 最近提交的二進(jìn)制文件被拒或者自己撤回。(修改App為準(zhǔn)備提交狀態(tài)即可,最好在ITC刪除被拒的二進(jìn)制文件,不上傳二進(jìn)制文件也可測(cè)試IAP)
- 沒(méi)有清除ITC上在出售的IAP商品。
- 沒(méi)有使用與App ID相關(guān)聯(lián)的描述文件來(lái)簽名App。
- 你可能更改了商品,但是還沒(méi)有在AppStore服務(wù)器生效。(大概會(huì)等幾個(gè)小時(shí)吧,具體不是很清楚)
- 還沒(méi)完成所有的金融需求。(我最初的理解是:協(xié)議、稅務(wù)和銀行業(yè)務(wù)沒(méi)有填寫(xiě)完整)
- 針對(duì)非消耗型商品,本人沒(méi)仔細(xì)研究,感興趣的童鞋可以點(diǎn)這里了解。
- 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ǔ)充幾條:
- 手機(jī)網(wǎng)絡(luò)是否能連上ITC??? ??
- bundle Id是否一致。
- In-App Purchases是否勾選?
- ITC上的購(gòu)買(mǎi)項(xiàng),是否是Cleared for Sale?
- app是更新提交的話(huà),卸載掉APP重新下載試一下。
- 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)也不一定能上線。等一等,世界和平。

【社區(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)容
- 簡(jiǎn)介 App 正在改變世界,豐富人們的生活,并為像您一樣的開(kāi)發(fā)者提供前所未有的創(chuàng)新機(jī)會(huì)。因此,App Store ...
- App Store 審核指南2017/07/27 簡(jiǎn)介 App 正在改變世界,豐富人們的生活,并為像您一樣的開(kāi)發(fā)者...
- 1 IAP詳細(xì)規(guī)則 IAP(In-App Purchase),是指蘋(píng)果App Store的應(yīng)用內(nèi)購(gòu)買(mǎi),是蘋(píng)果為AP...
- -我要在app里添加IAP,必須要注冊(cè)自己的產(chǎn)品標(biāo)識(shí)符(product identifiers)。產(chǎn)品標(biāo)識(shí)符是什么...
- 發(fā)生在什么時(shí)候? 以前也發(fā)生過(guò)嗎? 頻率是什么樣的? 你當(dāng)初的感受是怎么樣的? 你有什么樣的期待呢? 為什么你會(huì)有...