如何在钥匙串中保存应用程序购买状态
How to Save In App Purchase state in Keychain
在我的应用程序中,用户可以购买 non-consumable product
。我现在的问题是,无论用户是否购买了产品,我都不太清楚如何正确存储信息。我读到 User Defaults
不是最安全的方法,所以我用 Keychain
试了一下。为此,我正在使用 this 帮助程序库。
现在这就是我尝试实现它的方式:
keychain["isPremium"] = "true" // set the state
let token = try? keychain.get("isPremium") // get the state to check if it worked
print(token as Any)
这是打印“真”。但是,如果我注销用户,并使用另一个帐户登录,我只调用这个:
let token = try? keychain.get("isPremium")
即使第二个用户没有购买该商品,它仍然打印出“true”。那么如何在我的应用程序中存储 IAP 的状态?
这完全取决于您的应用程序逻辑,钥匙串按预期工作:您向其中保存一些内容,然后再次读取(不变)。 Keychain 无法知道您的应用程序中正在发生哪些其他类型的逻辑。
也就是说,您可以做一些简单的事情,比如根据某种用户标识符,将每个用户的解锁状态用不同的密钥存储在钥匙串中。
// holds the current logged in user ID
// this needs to be persisted across the user's session,
// so store this somewhere like UserDefaults or the Keychain
// (depending on your app's security model)
//
// I just use a simple variable for this example
var currentUserID = ""
// user 1 logs in, set:
currentUserID = "user1_"
keychain[currentUserID + "isPremium"] = "true"
let token = try? keychain.get(currentUserID + "isPremium")
print(token as Any)
// user 2 logs in, set:
currentUserID = "user2_"
keychain[currentUserID + "isPremium"] = "true"
let token = try? keychain.get(currentUserID + "isPremium")
print(token as Any)
在我的应用程序中,用户可以购买 non-consumable product
。我现在的问题是,无论用户是否购买了产品,我都不太清楚如何正确存储信息。我读到 User Defaults
不是最安全的方法,所以我用 Keychain
试了一下。为此,我正在使用 this 帮助程序库。
现在这就是我尝试实现它的方式:
keychain["isPremium"] = "true" // set the state
let token = try? keychain.get("isPremium") // get the state to check if it worked
print(token as Any)
这是打印“真”。但是,如果我注销用户,并使用另一个帐户登录,我只调用这个:
let token = try? keychain.get("isPremium")
即使第二个用户没有购买该商品,它仍然打印出“true”。那么如何在我的应用程序中存储 IAP 的状态?
这完全取决于您的应用程序逻辑,钥匙串按预期工作:您向其中保存一些内容,然后再次读取(不变)。 Keychain 无法知道您的应用程序中正在发生哪些其他类型的逻辑。
也就是说,您可以做一些简单的事情,比如根据某种用户标识符,将每个用户的解锁状态用不同的密钥存储在钥匙串中。
// holds the current logged in user ID
// this needs to be persisted across the user's session,
// so store this somewhere like UserDefaults or the Keychain
// (depending on your app's security model)
//
// I just use a simple variable for this example
var currentUserID = ""
// user 1 logs in, set:
currentUserID = "user1_"
keychain[currentUserID + "isPremium"] = "true"
let token = try? keychain.get(currentUserID + "isPremium")
print(token as Any)
// user 2 logs in, set:
currentUserID = "user2_"
keychain[currentUserID + "isPremium"] = "true"
let token = try? keychain.get(currentUserID + "isPremium")
print(token as Any)