有些时候我们需要判断一个 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
}
}
网友评论