前言
在iOS:為 App 添加內(nèi)購買項目一文里向抢,我們介紹了為 App 添加內(nèi)購買項目的方法。對于一般的情況区拳,文中的方法已經(jīng)夠用浅蚪。但是如果想在不上傳新 App 版本的前提下,添加或刪除 App 中的內(nèi)購買項目烫罩,就需要做一些額外的工作惜傲。
思路
實現(xiàn)動態(tài)管理 App 內(nèi)購買項目的整體思路如下:
- 搭建后臺服務(wù)器,為 App 提供內(nèi)購買產(chǎn)品 ID贝攒;
- 在 iTunes Connect 中添加或刪除內(nèi)購買項目盗誊,并在服務(wù)器數(shù)據(jù)庫中同步。
- 在 App 中添加從服務(wù)器獲取數(shù)據(jù)的代碼隘弊。
1哈踱、后臺服務(wù)器
后臺服務(wù)器能夠根據(jù) http 請求,返回相應(yīng)的數(shù)據(jù)梨熙。關(guān)于搭建后臺服務(wù)器的方法开镣,請看這篇文章:PHP:構(gòu)建 JSON 數(shù)據(jù)接口的 Web 服務(wù)器。
假定服務(wù)器返回的是 JSON 格式的數(shù)據(jù)咽扇,如下:
{"status":true,"IDSuffix":[{"id":"purchase1"},{"id":"purchase2"}]}
其中的 purchase1 和 purchase2 就是內(nèi)購買項目的產(chǎn)品 ID 后綴邪财。
從服務(wù)器獲取到產(chǎn)品 ID 后綴后,然后在 App 程序中與 App Bundle ID 拼接得到:com.appname.self.purchase1 和 com.appname.self.purchase2质欲。這兩個 ID 就是產(chǎn)品 ID树埠,必須和 iTunes Connect 上添加的內(nèi)購買產(chǎn)品 ID 一致。這樣就能通過服務(wù)器獲取到當(dāng)前的產(chǎn)品嘶伟,用于更新內(nèi)購買項目怎憋。
2、添加或刪除內(nèi)購買項目
由于 Apple 并沒有提供官方的接口,用于從 iTunes Connect 上獲取內(nèi)購買項目列表绊袋,因此我們應(yīng)該手動在 iTunes Connect 上添加或刪除內(nèi)購買項目毕匀,并同時在服務(wù)器的數(shù)據(jù)庫中更新當(dāng)前可用的內(nèi)購買產(chǎn)品 ID 后綴。
這樣我們從自己的服務(wù)器獲取數(shù)據(jù)時愤炸,就能得到最新的內(nèi)購買項目列表期揪。
3、獲取內(nèi)購買數(shù)據(jù)
在 App 程序內(nèi)部规个,我們需要讓 App 發(fā)出 http 請求凤薛,從服務(wù)器獲取內(nèi)購買項目的數(shù)據(jù)。如果服務(wù)器支持 https诞仓,則可以直接用 https 請求缤苫。
下面的代碼使用單例模式,實現(xiàn)了從服務(wù)器獲取并返回內(nèi)購產(chǎn)品 ID 后綴的功能墅拭。
import Foundation
import Alamofire
import SwiftyJSON
internal class WebServerManager {
private let serverAPIAddress = "http://YourServerDataAPIAddress"
static let shared = WebServerManager()
private init(){
}
internal func getDataFromServer(_ completion: @escaping (Bool,[String]?)->Void){
let url = URL(string:serverAPIAddress)!
Alamofire.request(url).responseJSON{ response in
if let anyValue = response.result.value{
let json = JSON(anyValue)
if json["status"].boolValue == true , let idSuffix = json["IDSuffix"].array {
var suffixs = [String]()
for item in idSuffix{
if let suffix = item["id"].string{
suffixs.append(suffix)
}else{
print("data from server invalid")
}
}
completion(true,suffixs)
}else{
completion(false,nil)
print("json data format invalid")
}
}else{
DispatchQueue.main.async {
completion(false,nil)
print("fail to fetch data")
}
}
}
}
}
可以通過調(diào)用 getDataFromServer 方法活玲,獲取產(chǎn)品 ID 后綴,之后拼接得到產(chǎn)品 ID 后谍婉,使用 StoreKit 的 API 從 Apple 服務(wù)器獲取內(nèi)購買項目的數(shù)據(jù)舒憾。
這就實現(xiàn)了從服務(wù)器獲取當(dāng)前可用的內(nèi)購買產(chǎn)品 ID(后綴),動態(tài)更新應(yīng)用內(nèi)購買項目穗熬。為 App 添加內(nèi)購買項目的方法請看這里镀迂。
有任何疑問的話,歡迎在下方評論區(qū)討論唤蔗。