親愛なる、
「自動更新サブスクリプション」に固有の、アプリ購入の iOS に関する質問があります。無料機能と有料機能を含むアプリを開発しています。「月額サブスクリプションとユーザーには 1 週間の無料トライアル」に基づく有料機能
そして、すべてのプロセスは問題ありません。製品をフェッチし、ユーザーが購入でき、レシートを検証します (レシピには「is_trial..」と「Purchase_date」のフラグが含まれていることは知っています…)…..
親切に注意してください:購入直後または復元後に「レシピの検証」を呼び出します
しかし、私は以下の問題を抱えています:どうすれば以下を知ることができますか:
1- ユーザーがアプリを 2 回目に開いた場合、ユーザーがまだ試用期間中かどうかを知るにはどうすればよいですか?
2- ユーザーが 1 か月後にアプリを開いた場合: サブスクリプションの有効期限が切れているかどうかを知るにはどうすればよいでしょうか … (つまり、サブスクリプションの期限が切れた場合は、もう一度購入の電話をかけます …)
、ユーザーがアプリを開くたびに「レシピの検証」と呼ぶソリューションです。これにより、ユーザーが支払い済みか支払い済み期間後 (期限切れ) かを知ることができます…</p>
または、購入日をローカルに保存します(例:ユーザーのデフォルト)。ユーザーがアプリを開いたときに、現在の日付と購入日を比較します。ユーザーがデバイスの日付を変更する可能性があるため、これは本当の答えではありません….
アドバイスをお願いします…</p>
以下のコード:
だから今、アプリを開いたとき:私は製品をリクエストします:
SKPaymentQueue.default().add(self)
if(SKPaymentQueue.canMakePayments()) {
print("IAP is enabled, loading")
let productID: NSSet = NSSet(objects: "test.test1.test2.11")
let request: SKProductsRequest = SKProductsRequest(productIdentifiers: productID as! Set<String>)
request.delegate = self
request.start()
} else {
print("please enable IAPS")
}
製品を受け取るとき:
func productsRequest(_ request: SKProductsRequest, didReceive response: SKProductsResponse) {
print("product request")
let myProduct = response.products
for product in myProduct {
list.append(product)
}
}
ユーザーがボタンを押すと:
for product in self.list {
let prodID = product.productIdentifier
if(prodID == "test.test1.test2.11") {
self.p = product
self.buyProduct()
}
}
以下のメソッドが呼び出されます
func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {
print("add payment")
for transaction: AnyObject in transactions {
let trans = transaction as! SKPaymentTransaction
switch trans.transactionState {
case .purchased:
receiptValidation()
queue.finishTransaction(trans)
break
case .failed:
print("buy error")
queue.finishTransaction(trans)
break
default:
print("Default")
break
}
}
}
&私は領収書を検証します:
func receiptValidation() {
if let appStoreReceiptURL = Bundle.main.appStoreReceiptURL,
FileManager.default.fileExists(atPath: appStoreReceiptURL.path) {
do {
let receiptData = try Data(contentsOf: appStoreReceiptURL, options: .alwaysMapped)
let receiptString = receiptData.base64EncodedString(options: [])
let dict = ["receipt-data" : receiptString, "password" : "xxxxxxxxxxx"] as [String : Any]
do {
let jsonData = try JSONSerialization.data(withJSONObject: dict, options: .prettyPrinted)
if let sandboxURL = Foundation.URL(string:"https://sandbox.itunes.apple.com/verifyReceipt") {
var request = URLRequest(url: sandboxURL)
request.httpMethod = "POST"
request.httpBody = jsonData
let session = URLSession(configuration: URLSessionConfiguration.default)
let task = session.dataTask(with: request) { data, response, error in
if let receivedData = data,
let httpResponse = response as? HTTPURLResponse,
error == nil,
httpResponse.statusCode == 200 {
do {
if let jsonResponse = try JSONSerialization.jsonObject(with: receivedData, options: JSONSerialization.ReadingOptions.mutableContainers) as? Dictionary<String, AnyObject> {
} else { print("Failed to cast serialized JSON to Dictionary<String, AnyObject>") }
}
catch { print("Couldn't serialize JSON with error: " + error.localizedDescription) }
}
}
task.resume()
} else { print("Couldn't convert string into URL. Check for special characters.") }
}
catch { print("Couldn't create JSON with error: " + error.localizedDescription) }
}
catch { print("Couldn't read receipt data with error: " + error.localizedDescription) }
}
}