swift 应用是否第一次启动

2017-01-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
    }
    
}
上一篇下一篇

猜你喜欢

热点阅读