iOS 15之前的 IAP

戴萌
5 min readApr 24, 2022

去年WWDC針對IAP 用的StoreKit 做了大更新,這個SDK 已經用了快10年,中間雖然也是有做過一些些調整,本次可是整個SDK流程都改變了,不過可惜的事,必需要iOS15之後才可以使用新流程,若App支援iOS 14以下的話,還是需要使用過去的那套流程

有一個無論是新舊流程都可以使用的功能,在過去若要測試IAP 的時候一定要去 App store connect 中設定好商品、沙箱測試人員…等等之後才可以進行測試。

現在可以直接使用Xcode 就可以測試了!! 可以測試的範圍可以到購買完成,當然如果要想得到Receipt 還是要在App store connect 設定好且用實機進行測試

此文章會先介紹StoreKit 的程式寫法,StoreKit 2 會撰寫另一篇文章

在開始之前,簡單說明一下對於App 而言的IAP 流程是怎麼樣的

App 裡要做的事情大致上有四件事

1、取得商品資訊

2、購買商品

3、交易完成後的處理

4、取得收據

一般大多數都是由後端Server 去處理Verify Receipt,且Apple也不希望是由App 端去進行,若有需要相關資訊的可以參考官網說明

終於要開始寫程式了!

可至官網下載 Demo Code

取得商品資訊

要取得商品資訊之後,必需要先知道Product ID ,用Product ID 去向Apple 要取商品資料

取得商品使用 StoreKit 中的 SKProductsRequest,initial 的時候把ProductID 帶入,有一點要留意一下,因為是使用Set 所以取得商品後需要自己去做排序喔

productRequest.start()

呼叫start() 之後就可以從SKProductsRequestDelegate中的productsRequest裡取得商品,invalidProductIdentifiers 裡的Product ID 是在App Store 找不到相對應的商品

購買商品

從App Store上取得的商品物件是 SKProduct ,在購買的時候也要使用SKProduct 進行

購買商品的時候需要建立 SKPayment 物件,並把要購買的SKProduct 放進去,接著就是將它放入 SKPaymentQueue裡就行了

交易狀態

要得知交易的狀態,需要成為 SKPaymentQueue的observer

之後就可以在 func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction])中取得交易狀態

交易狀態共有五種

.purchasing,正在交易中

.purchased,交易成功,記得寫上 finishTransaction 結束交易 ,不然下次開啟App 的時候還會再收到一次

.failed,交易失敗,就看是否有需要處理交易失敗的情況,記得也要寫上 finishTransaction 結束交易

.restored,若有實作Restore 功能,Restored 就是完成後的狀態,一樣記得要finishTransaction

.deferred,交易正在 Queue 正等待被處理,基本上和 .purchasing 差不多是過渡情況

就看是否要針對其狀態進行處理,一般 .purchasing 與 .deferred 不需要做什麼特別處理,不過UI上需要顯示 Indicator 讓使用者知道現在正在處理中

最後就是

取得收據

當收到交易成功的狀態時,就可以在本機上找到收據,一般流程需要就收據丟回給Server 去做後續驗証處理

需要使用 FileManager 去取得收據,再把它轉成Base64的字串,因為若要拿這個收據到Apple 上去驗証的話,就需要把收據轉成加密過的 Base64字串,若想知道如何驗証收據可以參考官方文件

大多數的情況下都是由Server 去進行收據驗証工作,除非是訂閱型商品,不然App 可以利用交易狀態來得知是否購買成功。

以上是就基本的IAP 實作,基本上官方Demo Code 都寫的很清楚,只要了解官方程式實作起來就不會太難。

那最後就祝大家寫Code 愉快!!

--

--