【发布时间】:2016-09-30 13:02:53
【问题描述】:
我阅读了大量有关自动续订订阅的内容,但我对如何检查用户是否有有效订阅有疑问。
这就是我获得收据的方式
func validateRecipt(callback:(receipt:NSDictionary?)->()){
let recuptUrl = NSBundle.mainBundle().appStoreReceiptURL
if let receipt: NSData = NSData(contentsOfURL:recuptUrl!) {
//https://sandbox.itunes.apple.com/verifyReceipt //TEST ENVIRONMENT
//https://buy.itunes.apple.com/verifyReceipt //PRODUCTION ENVIRONMENT
let request = NSMutableURLRequest(URL: NSURL(string: "https://sandbox.itunes.apple.com/verifyReceipt")!, cachePolicy: NSURLRequestCachePolicy.UseProtocolCachePolicy, timeoutInterval: 10)
let session = NSURLSession.sharedSession()
request.HTTPMethod = "POST"
let receiptdata:NSString = receipt.base64EncodedStringWithOptions(NSDataBase64EncodingOptions(rawValue: 0))
let payload:NSDictionary = {["receipt-data" : receiptdata, "password" : "mySharedKey"]}()
//, password\" : \"" + EGConstants.sharedSecret + "\" }"
do {
let payloadData:NSData = try(NSJSONSerialization.dataWithJSONObject(payload, options: NSJSONWritingOptions(rawValue: 0)))
request.HTTPBody = payloadData
let task = session.dataTaskWithRequest(request) { (data, response, err) in
do {
let json = try(NSJSONSerialization.JSONObjectWithData(data!, options: .MutableLeaves) as? NSDictionary)
if(err != nil) {
print(err!.localizedDescription)
let jsonStr = NSString(data: data!, encoding: NSUTF8StringEncoding)
print("Error could not parse JSON: '\(jsonStr)'")
callback(receipt: nil)
}
else {
if let parseJSON = json {
callback(receipt: parseJSON)
}
else {
let jsonStr = NSString(data: data!, encoding: NSUTF8StringEncoding)
print("Recipt Error: \(jsonStr)")
callback(receipt: nil)
}
}
} catch {
}
}
task.resume()
} catch {}
}
}
我的问题是:
1.如何使用Receipt查看用户是否有活跃订阅? (我是否需要解析收据并获取product subscription的最后一笔交易的最后expires_date?)
2. 每次启动应用都刷新收据可以吗?(这样我可以检查用户是否取消了他的订阅)如果没有,我什么时候需要刷新收据?
ps。如果我有错误的概念或问题,请引导我走向正确的道路。提前致谢
【问题讨论】:
-
虽然这并不能回答您的问题,但我想提一下,您不能通过将请求发送到 iTunes 来进行本地收据验证。此验证应由服务器作为您控制的唯一一侧执行。见Validating Receipts With the App Store
-
@EugeneDubinin 服务器意味着在我的应用程序之外?像网络服务器?
-
是的。您可以提交
Base64收据数据的服务器,并从该服务器接收由 iTunes 完成的验证结果。 -
@EugeneDubinin 有没有可能不做任何其他的东西,比如服务器的东西?
-
为了找出本地验证程序,请再次阅读Validating Receipts Locally,BUT,我不确定是否需要验证来解决您的问题。我没有订阅经验。
标签: ios objective-c swift in-app-purchase