【iOS開發(fā)】IAP開發(fā)的那些坑

最近正在做的項(xiàng)目,涉及到了IAP(In-App Purchase),即蘋果的應(yīng)用內(nèi)購買。在開發(fā)過程中遇到了各種各樣的狀況,IAP的開發(fā)步驟在網(wǎng)上有很多十分詳盡的教程,不需贅述,本文重點(diǎn)介紹說明在IAP開發(fā)過程中遇到的坑,并探討相對合理的解決辦法。

一、IAP類型與用戶系統(tǒng)



絕?大部分iOS應(yīng)用,都會維護(hù)一套自己的用戶系統(tǒng),然而IAP是使用蘋果的用戶系統(tǒng)(Apple ID)來進(jìn)行購買的,因此就會產(chǎn)生一個(gè)問題:

通過蘋果的用戶系統(tǒng)(Apple ID)的購買結(jié)果或行為,如何與應(yīng)用本身的用戶系統(tǒng)進(jìn)行關(guān)聯(lián)?

很簡單的?情況就是,應(yīng)用內(nèi)的不同用戶使用同一個(gè)Apple ID進(jìn)行IAP,或者是應(yīng)用內(nèi)同一個(gè)用戶使用不同Apple ID進(jìn)行IAP,要如何處理。

解決這個(gè)問題之前,首先要明確IAP的類型,以及每種類型的特性。下面是在iTunes Connect創(chuàng)建IAP時(shí)的提示:

可以看到IAP總共有5種類型,雖然蘋果對每種類型的說明很詳細(xì),并且都加上了舉例說明,但仍然沒有明確的信息解決之前的問題。在查閱了蘋果IAP的開發(fā)文檔后,我發(fā)現(xiàn)了下面的表格:

這個(gè)表格中表明了不同類型IAP的在使用同一Apple ID購買時(shí)的次數(shù)限制,經(jīng)過測試總結(jié)如下:

  • 非消耗型

同一Apple ID只能購買一次,再次購買會提示已購買。

無法與應(yīng)用的用戶系統(tǒng)關(guān)聯(lián),因?yàn)橥籄pple ID無法為多個(gè)應(yīng)用用戶購買。

  • 消耗型

同一Apple ID可以購買多次,?每次購買流程幾乎完全相同。

可以與應(yīng)用的用戶系統(tǒng)關(guān)聯(lián),因?yàn)槊看钨徺I與Apple ID幾乎無關(guān)系。

  • 自動續(xù)訂訂閱

同一Apple ID可以購買多次,但在購買時(shí)會檢查是否購買過,如果購買過并且權(quán)限未過期,系統(tǒng)會提示已購買而無法再購買。

無法與應(yīng)用的用戶系統(tǒng)關(guān)聯(lián),因?yàn)橥籄pple ID購買時(shí)會檢查購買紀(jì)錄并校驗(yàn)權(quán)限,未過期用戶無法重新購買。

  • 非續(xù)訂訂閱

同一Apple ID可以購買多次,但在購買時(shí)會檢查是否購買過,如果購買過并且權(quán)限未過期,系統(tǒng)會提示續(xù)期而可以再次購買。

可以與應(yīng)用的用戶系統(tǒng)關(guān)聯(lián),但同一Apple ID在購買時(shí)會檢查購買紀(jì)錄?并校驗(yàn)權(quán)限,未過期用戶會有續(xù)訂提示,這種系統(tǒng)提示在一些場景下是不合適的。

  • 免費(fèi)訂閱

同一Apple ID只能購買一次,再次購買會提示已購買。

無法與應(yīng)用的用戶系統(tǒng)關(guān)聯(lián),因?yàn)橥籄pple ID無法為多個(gè)應(yīng)用用戶購買。

p.s. 有一種比較暴力的做法,就是將應(yīng)用的用戶系統(tǒng)與Apple ID的用戶系統(tǒng)進(jìn)行關(guān)聯(lián),一個(gè)應(yīng)用用戶對應(yīng)一個(gè)Apple ID。這種方法實(shí)質(zhì)上是將兩個(gè)用戶系統(tǒng)進(jìn)行統(tǒng)一,但這種方法會產(chǎn)生很多副作用,建議盡量不要使用。

?二、IAP流程與receipt校驗(yàn)



在選取了合適的類型之后,就是實(shí)現(xiàn)IAP的基本流程,客戶端和應(yīng)用后臺的主要任務(wù)是處理購買成功后,如何校驗(yàn)用戶購買結(jié)果:

按上圖的流程,主要是處理邏輯是在最后一步Delivering Products的Observer is Called,即購買之后系統(tǒng)回調(diào)之后的處理。這里最核心的部分就是購買結(jié)果的校驗(yàn),即receipt校驗(yàn)。

在用戶IAP成功后,客戶端或服務(wù)器可以使用receipt向appstore請求,獲取用戶的購買記錄,得到一份json格式的數(shù)據(jù),通過數(shù)據(jù)解析來?校驗(yàn)用戶購買的產(chǎn)品類型、權(quán)限、期限等信息。

  • IAP是否可用判斷

這里主要注意的是對越獄用戶要添加額外的判斷,因?yàn)樵姜z用戶是無法進(jìn)行IAP的,因此在入口就要進(jìn)行判斷,其次調(diào)用canMakePayments函數(shù),判斷IAP是否可用,再次校驗(yàn)product是否合法。

當(dāng)然也可以加上應(yīng)用的一些判斷,如登錄狀態(tài),是否已經(jīng)購買等。

  • finishTransaction的調(diào)用時(shí)機(jī)

所有的教程都會說在購買完成回調(diào)時(shí),要調(diào)用finishTransaction函數(shù),但這個(gè)函數(shù)具體會產(chǎn)生哪些作用并沒有具體說明。

(1) 問:如果不調(diào)用finishTransaction會有什么影響?
:appstore會認(rèn)為購買流程未完成,如果應(yīng)用啟動時(shí)就注冊了IAP的observer,那么會出現(xiàn)應(yīng)用每次啟動時(shí),都會調(diào)到回調(diào),傳說中的Apple ID密碼的頻繁彈框大部分是這個(gè)原因造成的。

(2) 問:調(diào)用finishTransaction函數(shù)之后,對receipt有什么影響?
:在上一節(jié)中的表格中,對于不同類型IAP的receipt的保存有差別的是消耗型,它只保存一次。保存一次的意思就是說,在購買成功后會有消耗型的receipt信息,但在調(diào)用finishTransaction函數(shù)之后,消耗型的購買信息就會被刪除。因此對于消耗型IAP,建議在校驗(yàn)完成后再調(diào)用finishTransaction。

  • transaction_id和original_transaction_id

在每一條購買信息數(shù)據(jù)中,有兩個(gè)容易混淆的字段:transaction_id和original_transaction_id。

(1) transaction_id
每一次購買記錄生成唯一標(biāo)識,與SKPaymentTransaction類中的transactionIdentifier相對應(yīng)

(2) original_transaction_id
在restore時(shí)使用,與SKPaymentTransaction類中的originalTransaction?相對應(yīng)
自動續(xù)訂訂閱類型,所有的購買記錄都相同

  • in_app與latest_receipt_info

測試時(shí)發(fā)現(xiàn),這兩個(gè)字段的數(shù)值幾乎相同,不過有幾點(diǎn)需要注意:

(1)自動續(xù)訂訂閱類型,在到期后會再生成一條購買記錄,這條記錄會出現(xiàn)在last_receipt_info里,但不會出現(xiàn)在in_app里

(2)自動續(xù)訂訂閱類型可以配置試用,試用記錄只有在latest_receipt_info里,is_trial_period字段才是true

(3)消耗型購買記錄有可能不會出現(xiàn)在latest_receipt_info,因此需要檢查in_app來確保校驗(yàn)正確

  • restore的處理

如果應(yīng)用中使用了非消耗型、自動續(xù)訂訂閱型、免費(fèi)訂閱型的IAP,需要提供restore的入口,并調(diào)用restoreCompletedTransactions函數(shù)進(jìn)行恢復(fù)購買。

在恢復(fù)購買的時(shí)候,要注意?要使用originalTransaction的信息來做校驗(yàn),特別是購買時(shí)的id,因?yàn)樵趓estore的時(shí)候生成的transaction的id,與初始購買不相同

??三、IAP測試



IAP測試只要添加沙箱測試賬號就可以進(jìn)行測試了,不過在測試訂閱類型時(shí),要注意測試的時(shí)間長度與實(shí)際的時(shí)間長度的對應(yīng)關(guān)系:

??四、IAP審核



在提交審核時(shí),一定要注意在應(yīng)用描述中添加IAP的具體說明,包括種類、價(jià)格、服務(wù)等,同時(shí)在應(yīng)用描述及應(yīng)用中添加服務(wù)條款。

[1]In-App Purchase Programming Guide
[2]Receipt Validation Programming Guide

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

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

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