簡體   English   中英

僅為現有用戶運行代碼 - SwiftUI/iOS/Swift

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM