美文网首页
swift 应用是否第一次启动

swift 应用是否第一次启动

作者: 冰霜海胆 | 来源:发表于2017-01-20 13:20 被阅读232次

    有些时候我们需要判断一个 App 是否是第一次启动,以此来进行新手指南的展示。

    而且,当用户安装了新版本的 App 时,依然需要判断是不是新版本,而展示新版本的特性。

    AppDelegate.swift
    
    /// 是否第一次启动
    var isFirstLoad: Bool?
    
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
            // Override point for customization after application launch.
            
            // 第一次安装并启动判断
            let version = ZxVersion.shared.verdict()
            if version.isChangedVersion == nil, version.isFirstLaunch! == true {
                isFirstLoad = true
            } else {
                isFirstLoad = false
            }
            
            return true
        }
    
    
    
    import UIKit
    /// 第一次启动与版本判断
    class ZxVersion: NSObject {
        // MARK:- 属性
        static let shared = ZxVersion()
        
        // MARK:- 函数方法
        private override init() {
            super.init()
        }
    
        /// 判断版本相关
        func verdict() -> (isChangedVersion: Bool?, isFirstLaunch: Bool?) {
            var changedVersion: Bool?
            var firstLaunch: Bool?
            
            let nowVersion = handelVersion(string: getAppVersion())
            
            // 先判断是否第一次安装 App
            if let oldAppVersion = UserDefaults.standard.string(forKey: "appVersion") {
                let oldAppVersionNumber = Double(oldAppVersion)
                let newAppVersionNumber = Double(nowVersion)
                
                // 不是第一次安装的话,就判断当前版本与存储的版本号大小
                if newAppVersionNumber! > oldAppVersionNumber! {
                    // "新版"
                    UserDefaults.standard.set(false, forKey: "everLaunched")
                    UserDefaults.standard.set(nowVersion, forKey: "appVersion")
                    changedVersion = true
                } else {
                    // "版本没有变化或安装了旧版"
                    UserDefaults.standard.set(true, forKey: "everLaunched")
                    changedVersion = false
                }
            } else {
                // 是第一次安装的话就保存当前版本号
                UserDefaults.standard.set(nowVersion, forKey: "appVersion")
            }
            
            // 判断是否第一次启动
            if !(UserDefaults.standard.bool(forKey: "everLaunched")) {
                UserDefaults.standard.set(true, forKey: "everLaunched")
                UserDefaults.standard.set(true, forKey: "firstLaunch")
                // "是第一次启动"
                firstLaunch = true
            } else {
                UserDefaults.standard.set(false, forKey: "firstLaunch")
                // "不是第一次启动"
                firstLaunch = false
            }
            
            return (changedVersion, firstLaunch)
        }
        
        /// 删除版本字符串中的"点"
        fileprivate func handelVersion(string: String) -> String {
            let noPointStringArray = string.characters.filter { (character) -> Bool in
                return character != "."
            }
            
            var noPointString = ""
            for character in noPointStringArray {
                noPointString.append(character)
            }
            
            return noPointString
        }
        
        /// 获取 App 版本号
        func getAppVersion() -> String {
            var appVersion = ""
            if let infoDict = Bundle.main.infoDictionary {
                appVersion = infoDict["CFBundleShortVersionString"] as! String
            }
            
            return appVersion
        }
    }
    

    2018-6-19 更新

    extension Version {
        
        private var isFirstInstallKey: String {
            return "isFirstInstall_Key"
        }
        
        private var appVersionKey: String {
            return "appVersion_Key"
        }
        
        /// 是否第一次安装 App
        @discardableResult
        open func isFirstInstall() -> Bool {
            if !UserDefaults.standard.bool(forKey: isFirstInstallKey) {
                UserDefaults.standard.set(true, forKey: isFirstInstallKey)
                UserDefaults.standard.synchronize()
                
                return true
            }
            else {
                return false
            }
        }
        
        /// 是否安装了新版本
        @discardableResult
        open func isChangedVersion() -> Bool {
            let oldVersion = UserDefaults.standard.float(forKey: appVersionKey)
            let currentVersion = Float(filterPoint(in: appVersion()))!
            
            if currentVersion > oldVersion {
                // 安装了新的版本
                UserDefaults.standard.set(currentVersion, forKey: appVersionKey)
                UserDefaults.standard.synchronize()
                
                return true
            }
            else {
                // 没有安装新的版本,或重新使用了旧版。
                return false
            }
        }
        
        /// 去除版本号中的以第一个点
        private func filterPoint(in version: String) -> String {
            var _version = version
            
            if let range = _version.range(of: ".") {
                _version.remove(at: range.lowerBound)
            }
            
            return _version
        }
        
    }
    

    相关文章

      网友评论

          本文标题:swift 应用是否第一次启动

          本文链接:https://www.haomeiwen.com/subject/hobwbttx.html