[英]Run code for existing users only - SwiftUI/iOS/Swift
我有一個生產就緒的應用程序,我只需要在安裝了以前版本而不是新安裝的用戶上運行一些代碼。 例如,如果1.0
是 AppStore 中的最新版本,而2.0
是新版本,它將引入只需要在1.0
版本的用戶上運行而不需要在新用戶上運行的代碼。
例如
if isExistingUser{
// run code
}
僅為現有用戶運行某些代碼的最佳方式是什么? 如何確定它是新用戶還是現有用戶?
我經常看到這種情況,知道如何做到這一點非常有價值,尤其是在做一些事情時,比如引入一個改變以前用戶體驗的新功能。
您可以根據自己的需要采取幾種方法。
首先,您可以在用戶模型類中創建一個boolean
變量,該變量是在標准用戶注冊流程中的用戶注冊期間設置的,並指示這是一個新創建的用戶 - 並將其命名為isNewOnVersionTwo
之類的名稱,表示該用戶是新用戶在這個新版本上。
代碼示例:
class User: Decodable {
var uid: string!
var username: string!
var isNewOnVersionTwo: Bool = false
}
class RegistrationViewController: UIViewController {
var user: User!
var isNewOnVersionTwo: Bool = false
override func viewDidLoad() {
super.viewDidLoad()
user.isNewOnVersionTwo = true
}
}
class HomeViewController: UIViewController {
var user: User!
override func viewDidLoad() {
super.viewDidLoad()
isNewOnVersionTwo == true ? normalInit() : showOldUserAView()
}
func normalInit() {
// Run normal functions for the 'HomeViewController' or do nothing.
}
func showOldUserAView() {
//Do something specific for only old users.
}
}
您可以選擇是否要永久保留此變量 - 它可能有助於跟蹤您在此版本中獲得的新用戶與之前的版本 - 您可以將其與其他版本一起發送到您的數據庫來自您的用戶模型的數據。
第二種更簡潔的方法......可能是僅在注冊流程的最后一個視圖控制器上設置布爾值,並在您將用戶推送到視圖控制器時將其傳遞給主視圖控制器。
像這樣:
class ViewControllerOne: UIViewController {
var isNewOnVersionTwo: Bool = false
private func pushToNewViewController() {
let vc = HomeViewController()
vc.isNewOnVersionTwo = true
navigationController?.pushViewController(vc, animated: true)
}
}
class HomeViewController: UIViewController {
var isNewOnVersionTwo: Bool = false
override func viewDidLoad() {
super.viewDidLoad()
isNewOnVersionTwo == true ? normalInit() : showOldUserAView()
}
func normalInit() {
// Run normal functions for the 'HomeViewController' or do nothing.
}
func showOldUserAView() {
//Do something specific for only old users.
}
}
由於以下幾個原因,我不會采用使用 UserDefaults 的方法:
1.設備偶爾會隨機擦除它,它不如在源代碼中硬編碼一個標志可靠。
2. UserDefaults 在冷應用啟動/初始啟動時暫時不可用,這可能會使事情復雜化,取決於您何時想向老用戶展示您想向他們展示的任何內容。
您的應用程序是否創建任何數據? 可能是Documents
目錄中的文件,或者可能是UserDefaults
鍵? 如果是這樣,請在發布的早期檢查其中一個東西的存在,這將向您發出信號,這必須是升級,您應該做自己的事情。
很多人在啟動時將應用程序的CFBundleShortVersionString
Info.plist
鍵存儲到UserDefaults
中,這樣可以很容易地了解運行的最后一個版本,並讓您編寫從該版本遷移到新版本所需發生的邏輯。 這是您可能要考慮在未來版本中做的事情。
這是我想出的適用於 95-98% 的用戶的方法。 我所做的基本上是比較Documents
文件夾的創建日期和 version2 的發布日期。 我看到這種方法的唯一問題是用戶在您指定的發布日期和實際 App Store 發布日期之間安裝應用程序。 換句話說,如果您指定June, 5
作為發布日期,但應用程序直到7th
日才真正獲得批准,那么在6th
安裝應用程序的用戶將被錯過。
理想情況下,我將開始做的是@Rudedog
建議的,基本上保存版本以跟蹤用戶擁有的版本。
/// - Returns: Returns true if it's a new user otherwise returns false.
func isExistingUser()->Bool{
var isExistingUser:Bool?
var appInstallationDate:Date?
/// Set the date when the version two is released.
var dateComponents = DateComponents()
dateComponents.year = 2022
dateComponents.month = 06
dateComponents.day = 4
let userCalendar = Calendar.current
let versionsTwoReleaseDate = userCalendar.date(from: dateComponents)
/// Get the date of when the documents folder was created to determine when the app was installed.
let documentsDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first
if let creationDate = (try? documentsDirectory!.resourceValues(forKeys: [.creationDateKey]))?.creationDate{
appInstallationDate = creationDate
}
/// Compare dates
if appInstallationDate! < versionsTwoReleaseDate!{
// print("It's existing user")
isExistingUser = true
}else{
// print("It's NEW user")
isExistingUser = false
}
return isExistingUser!
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.