の最初の起動を検出するにはどうすればよいですか
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
// if very first launch than perform actionA
// else perform actionB
}
方法?
の最初の起動を検出するにはどうすればよいですか
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
// if very first launch than perform actionA
// else perform actionB
}
方法?
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
if (![[NSUserDefaults standardUserDefaults] boolForKey:@"HasLaunchedOnce"])
{
[[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"HasLaunchedOnce"];
[[NSUserDefaults standardUserDefaults] synchronize];
}
return YES;
}
Swift 3、4ではこれを試してください:
func isAppAlreadyLaunchedOnce()->Bool{
let defaults = UserDefaults.standard
if defaults.bool(forKey: "isAppAlreadyLaunchedOnce"){
print("App already launched : \(isAppAlreadyLaunchedOnce)")
return true
}else{
defaults.set(true, forKey: "isAppAlreadyLaunchedOnce")
print("App launched first time")
return false
}
}
Swift 2では、これを試してください。
func isAppAlreadyLaunchedOnce()->Bool{
let defaults = NSUserDefaults.standardUserDefaults()
if defaults.boolForKey("isAppAlreadyLaunchedOnce"){
print("App already launched : \(isAppAlreadyLaunchedOnce)")
return true
}else{
defaults.setBool(true, forKey: "isAppAlreadyLaunchedOnce")
print("App launched first time")
return false
}
}
更新:-OBJ-Cの場合、私はこれを使用します、
+ (BOOL)isAppAlreadyLaunchedOnce {
if ([[NSUserDefaults standardUserDefaults] boolForKey:@"isAppAlreadyLaunchedOnce"])
{
return true;
}
else
{
[[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"isAppAlreadyLaunchedOnce"];
[[NSUserDefaults standardUserDefaults] synchronize];
return false;
}
}
私はまさにこの目的のために小さなライブラリを書きました。これが初めての起動なのか、このバージョンだけの起動なのか、ユーザーがインストールした過去のバージョンを教えてくれます。これは、Apache 2ライセンスの下でcocoapodとしてgithubで利用できます:GBVersionTracking
あなたはこれを呼び出すだけですapplication:didFinishLaunching:withOptions:
[GBVersionTracking track];
そして、これが最初の起動であるかどうかを確認するには、これをどこにでも呼び出します。
[GBVersionTracking isFirstLaunchEver];
そして同様に:
[GBVersionTracking isFirstLaunchForVersion];
[GBVersionTracking currentVersion];
[GBVersionTracking previousVersion];
[GBVersionTracking versionHistory];
Swift3.0の場合-Swift5
拡張機能を追加する
extension UIApplication {
class func isFirstLaunch() -> Bool {
if !UserDefaults.standard.bool(forKey: "hasBeenLaunchedBeforeFlag") {
UserDefaults.standard.set(true, forKey: "hasBeenLaunchedBeforeFlag")
UserDefaults.standard.synchronize()
return true
}
return false
}
}
次に、コードで
UIApplication.isFirstLaunch()
以下の静的メソッドを使用して実装できます。
+ (BOOL)isFirstTime{
static BOOL flag=NO;
static BOOL result;
if(!flag){
if ([[NSUserDefaults standardUserDefaults] boolForKey:@"hasLaunchedOnce"]){
result=NO;
}else{
[[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"hasLaunchedOnce"];
[[NSUserDefaults standardUserDefaults] synchronize];
result=YES;
}
flag=YES;
}
return result;
}
Xcode7およびSwift2.0のもう1つのアイデアは、拡張機能を使用することです。
extension NSUserDefaults {
func isFirstLaunch() -> Bool {
if !NSUserDefaults.standardUserDefaults().boolForKey("HasAtLeastLaunchedOnce") {
NSUserDefaults.standardUserDefaults().setBool(true, forKey: "HasAtLeastLaunchedOnce")
NSUserDefaults.standardUserDefaults().synchronize()
return true
}
return false
}
}
今、あなたはあなたのアプリのどこにでも書くことができます
if NSUserDefaults.standardUserDefaults().isFirstLaunch() {
// do something on first launch
}
私は個人的に次のようなUIApplicationの拡張を好みます。
extension UIApplication {
class func isFirstLaunch() -> Bool {
if !NSUserDefaults.standardUserDefaults().boolForKey("HasAtLeastLaunchedOnce") {
NSUserDefaults.standardUserDefaults().setBool(true, forKey: "HasAtLeastLaunchedOnce")
NSUserDefaults.standardUserDefaults().synchronize()
return true
}
return false
}
}
関数呼び出しはより記述的であるため:
if UIApplication.isFirstLaunch() {
// do something on first launch
}
起動時に何かを保存してから、それが存在するかどうかを確認する必要があります。そうでなければ、それは初めてです。「何か」は、ファイル、データベースエントリ、ユーザーデフォルトの設定などです。
これを行うのは非常に簡単で、6行のコードしか必要としません。
このコードをアプリケーションの起動設定や、アプリケーションが初めて実行されたかどうかをテストする必要があるその他の場所に追加すると便利です。
//These next six lines of code are the only ones required! The rest is just running code when it's the first time.
//Declare an integer and a default.
NSUserDefaults *theDefaults;
int launchCount;
//Set up the properties for the integer and default.
theDefaults = [NSUserDefaults standardUserDefaults];
launchCount = [theDefaults integerForKey:@"hasRun"] + 1;
[theDefaults setInteger:launchCount forKey:@"hasRun"];
[theDefaults synchronize];
//Log the amount of times the application has been run
NSLog(@"This application has been run %d amount of times", launchCount);
//Test if application is the first time running
if(launchCount == 1) {
//Run your first launch code (Bring user to info/setup screen, etc.)
NSLog(@"This is the first time this application has been run";
}
//Test if it has been run before
if(launchCount >= 2) {
//Run new code if they have opened the app before (Bring user to home screen etc.
NSLog(@"This application has been run before);
}
PS設定でboolを使用しないでください整数に固執するだけです。未定義の場合、デフォルトでゼロになります。
また、[theDefaults synchronize];
回線は必須ではありませんが、アプリを数百のデバイスで数百回実行した場合、結果が常に信頼できるとは限らないことに気付きました。さらに、それがより良い方法です。
初めてnoになるときはboolキーをNSUserDefaultsに保存し、yesに変更して、アプリが削除または再インストールするまでその状態を維持します。
すばやく簡単な機能
- (BOOL) isFirstTimeOpening {
NSUserDefaults *theDefaults = [NSUserDefaults standardUserDefaults];
if([theDefaults integerForKey:@"hasRun"] == 0) {
[theDefaults setInteger:1 forKey:@"hasRun"];
[theDefaults synchronize];
return true;
}
return false;
}
Xcode7のSwift2.0の場合:AppDelegate.swiftファイル:
import UIKit
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
func application(application: UIApplication, willFinishLaunchingWithOptions launchOptions: [NSObject : AnyObject]?) -> Bool
{
return true
}
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool
{
didFinishLaunchingOnce()
return true
}
func didFinishLaunchingOnce() -> Bool
{
let defaults = NSUserDefaults.standardUserDefaults()
if let hasBeenLauncherBefore = defaults.stringForKey("hasAppBeenLaunchedBefore")
{
//print(" N-th time app launched ")
return true
}
else
{
//print(" First time app launched ")
defaults.setBool(true, forKey: "hasAppBeenLaunchedBefore")
return false
}
}
}
迅速に、Appデリゲートの上など、スコープ外で非常に簡単に実行できるグローバル定数を使用することをお勧めします。したがって、アプリが終了しない限り、適切な値に設定されます。アプリがバックグラウンドに移行した場合でも、同じ値が返されます。値は、アプリが完全に再起動された場合にのみ変更されます。
let isFirstLaunch: Bool = {
if !UserDefaults.standard.bool(forKey: "hasBeenLaunchedBeforeFlag") {
UserDefaults.standard.set(true, forKey: "hasBeenLaunchedBeforeFlag")
UserDefaults.standard.synchronize()
return true
}
return false
}()
ただし、正直なところ、アプリが少なくとも1回はバックグラウンドに送信されたという事実を追跡することをお勧めします。このような場合、UIApplicationで拡張機能を使用し、applicationDidEnterBackgroundメソッドで次のようにフラグを設定することを好みます。
extension UIApplication {
private static let isFirstLaunchKey = "isFirstLaunchKey"
static var isFirstLaunch: Bool {
return !UserDefaults.standard.bool(forKey: isFirstLaunchKey)
}
static func didEnterBackground() {
if isFirstLaunch {
UserDefaults.standard.set(true, forKey: isFirstLaunchKey)
UserDefaults.standard.synchronize()
}
}
}
次に、アプリデリゲートまたはシーンデリゲートで
func sceneDidEnterBackground(_ scene: UIScene) {
UIApplication.didEnterBackground()
}
XCode 12、Swift5用に更新
extension UIApplication {
func isFirstLaunch() -> Bool {
if !UserDefaults.standard.bool(forKey: "HasLaunched") {
UserDefaults.standard.set(true, forKey: "HasLaunched")
UserDefaults.standard.synchronize()
return true
}
return false
}
}
それからあなたはそれを次のように呼びます
UIApplication.isFirstLaunch()
迅速
struct Pref {
static let keyFirstRun = "PrefFirstRun"
static var isFirstRun: Bool {
get {
return UserDefaults.standard.bool(forKey: keyFirstRun)
}
set {
UserDefaults.standard.set(newValue, forKey: keyFirstRun)
}
}
}
アプリの起動時にデフォルト値を登録します。
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
let prefs: [String:Any] = [
Pref.keyFirstRun: true
...
]
UserDefaults.standard.register(defaults: prefs)
アプリ終了時の明確な値:
func applicationWillTerminate(_ application: UIApplication) {
Pref.isFirstRun = false
チェック値:
if Pref.isFirstRun {
... do whatever
Swift 5iOS13。
私はChrisFremgenによる迅速で簡単なものが好きです。だから私はそれを更新しました。
func isFirstTimeOpening() -> Bool {
let defaults = UserDefaults.standard
if(defaults.integer(forKey: "hasRun") == 0) {
defaults.set(1, forKey: "hasRun")
return true
}
return false
}
最良のアプローチは、変数を使用NSUserDefaults
して保存することです。BOOL
上記のように、次のコードは問題なく機能します。
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
[userDefaults setObject:[NSNumber numberWithBool:true] forKey:@"~applicationHasLaunchedBefore"];
[userDefaults synchronize];
以下のようにマクロを作成して、初回起動かどうかを簡単に確認することもできます。
#define kApplicationHasLaunchedBefore [[NSUserDefaults standardUserDefaults] objectForKey:@"~applicationHasLaunchedBefore"]
次に、それをそのまま使用します。
if (kApplicationHasLaunchedBefore) {
//App has previously launched
} else {
//App has not previously launched
}
これがswift5.0で機能する答えです。@Zaid Pathanの回答と比較した場合の改善点は、隠れた契約がないことです。呼び出す前に一度だけsetFirstAppLaunch()
呼び出さないと、アサーションエラーが発生します(デバッグモードの場合のみ)。isFirstAppLaunch()
fileprivate struct _firstAppLaunchStaticData {
static var alreadyCalled = false
static var isFirstAppLaunch = true
static let appAlreadyLaunchedString = "__private__appAlreadyLaunchedOnce"
}
func setFirstAppLaunch() {
assert(_firstAppLaunchStaticData.alreadyCalled == false, "[Error] You called setFirstAppLaunch more than once")
_firstAppLaunchStaticData.alreadyCalled = true
let defaults = UserDefaults.standard
if defaults.string(forKey: _firstAppLaunchStaticData.appAlreadyLaunchedString) != nil {
_firstAppLaunchStaticData.isFirstAppLaunch = false
}
defaults.set(true, forKey: _firstAppLaunchStaticData.appAlreadyLaunchedString)
}
func isFirstAppLaunch() -> Bool {
assert(_firstAppLaunchStaticData.alreadyCalled == true, "[Error] Function setFirstAppLaunch wasn't called")
return _firstAppLaunchStaticData.isFirstAppLaunch
}
setFirstAppLaunch()
次に、アプリケーションの開始時、およびisFirstAppLaunch()
アプリが呼び出されたかどうかを確認するときはいつでも、関数を呼び出す必要があります。