繁体   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