我正在开发一款应用程序,需要知道用户是首次安装还是从App Store升级的。
如何检测应用程序是首次安装,还是升级或重新安装?
非常感谢您提前的答复。
我正在开发一款应用程序,需要知道用户是首次安装还是从App Store升级的。
如何检测应用程序是首次安装,还是升级或重新安装?
非常感谢您提前的答复。
通过将最新已知版本保存到standardUserDefaults
,您可以轻松区分安装应用程序后的第一次启动、更新后的第一次启动和其他启动。但据我所知,不可能检测到应用程序的重新安装,因为当应用程序从设备中删除时,所有与应用程序相关的数据也会被删除。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
NSString* currentVersion = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleVersion"];
NSString* versionOfLastRun = [[NSUserDefaults standardUserDefaults] objectForKey:@"VersionOfLastRun"];
if (versionOfLastRun == nil) {
// First start after installing the app
} else if (![versionOfLastRun isEqual:currentVersion]) {
// App was updated since last run
} else {
// nothing changed
}
[[NSUserDefaults standardUserDefaults] setObject:currentVersion forKey:@"VersionOfLastRun"];
[[NSUserDefaults standardUserDefaults] synchronize];
}
查看Swift 3.0版本的代码。
注意:使用CFBundleShortVersionString来检查实际应用程序的版本。
func checkAppUpgrade() {
let currentVersion = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") as? String
let versionOfLastRun = UserDefaults.standard.object(forKey: "VersionOfLastRun") as? String
if versionOfLastRun == nil {
// First start after installing the app
} else if versionOfLastRun != currentVersion {
// App was updated since last run
} else {
// nothing changed
}
UserDefaults.standard.set(currentVersion, forKey: "VersionOfLastRun")
UserDefaults.standard.synchronize()
}
针对Swift 3版本
let currentVersion : String = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") as! String
let versionOfLastRun: String? = UserDefaults.standard.object(forKey: "VersionOfLastRun") as? String
if versionOfLastRun == nil {
// First start after installing the app
} else if !(versionOfLastRun?.isEqual(currentVersion))! {
// App is updated
}
UserDefaults.standard.set(currentVersion, forKey: "VersionOfLastRun")
UserDefaults.standard.synchronize()
注意:
要获取任何键的本地化值,您应该使用CFBundleGetValueForInfoDictionaryKey(CFBundleGetMainBundle(), "CFBundleShortVersionString" as CFString)
NSUserDefaults
中存储一个版本(参考@Nero的答案),以便检查可能的新安装和后续更新。version == nil
的情况下),利用iOS 11引入的DeviceCheck API,该API公开了两个设备特定数据位,可以由应用程序设置和检索,但由Apple维护并跨卸载/重新安装持久化。
CFBundleVersion
实际上返回的是Xcode称之为构建号的内容,但还有另一个键CFBundleShortVersionString
,它返回你在项目编辑器中输入的版本号。 - NeroobjectForInfoDictionaryKey
来比较版本号!请参阅https://dev59.com/yWQn5IYBdhLWcg3wW2D3#42552076 - Cœur