최초 출시를 어떻게 감지 할 수 있습니까?
- (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;
}
NSUserDefaults
일반적인 장소가 아닙니까? 다른 응용 프로그램에서 사용중인 것과 동일한 "키"를 사용하면 어떻게됩니까?
에서 스위프트 3, 4는 이 시도 :
func isAppAlreadyLaunchedOnce()->Bool{
let defaults = UserDefaults.standard
if let isAppAlreadyLaunchedOnce = defaults.string(forKey: "isAppAlreadyLaunchedOnce"){
print("App already launched : \(isAppAlreadyLaunchedOnce)")
return true
}else{
defaults.set(true, forKey: "isAppAlreadyLaunchedOnce")
print("App launched first time")
return false
}
}
에서 스위프트 2 , 이것을 시도
func isAppAlreadyLaunchedOnce()->Bool{
let defaults = NSUserDefaults.standardUserDefaults()
if let isAppAlreadyLaunchedOnce = defaults.stringForKey("isAppAlreadyLaunchedOnce"){
print("App already launched : \(isAppAlreadyLaunchedOnce)")
return true
}else{
defaults.setBool(true, forKey: "isAppAlreadyLaunchedOnce")
print("App launched first time")
return false
}
}
UPDATE : - 들어 OBJ-C I이를 사용,
+ (BOOL)isAppAlreadyLaunchedOnce {
if ([[NSUserDefaults standardUserDefaults] boolForKey:@"isAppAlreadyLaunchedOnce"])
{
return true;
}
else
{
[[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"isAppAlreadyLaunchedOnce"];
[[NSUserDefaults standardUserDefaults] synchronize];
return false;
}
}
OBJ-C에 대한 참조 : https://stackoverflow.com/a/9964400/3411787
이 목적을 위해 작은 라이브러리를 작성했습니다. 최초 출시인지 아니면이 버전인지, 사용자가 설치 한 이전 버전인지 알려줍니다. github에서 Apache 2 라이센스에 따라 cocoapod로 제공됩니다 : GBVersionTracking
당신은 단지 이것을 호출 application:didFinishLaunching:withOptions:
[GBVersionTracking track];
그리고 이것이 첫 번째 발사인지 확인하려면 어디서나 이것을 호출하십시오.
[GBVersionTracking isFirstLaunchEver];
그리고 비슷하게 :
[GBVersionTracking isFirstLaunchForVersion];
[GBVersionTracking currentVersion];
[GBVersionTracking previousVersion];
[GBVersionTracking versionHistory];
스위프트 3.0-스위프트 5
확장 기능 추가
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()
Xcode 7 및 Swift 2.0의 또 다른 아이디어는 확장을 사용하는 것입니다.
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
}
아래 정적 메소드로 구현할 수 있습니다.
+ (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;
}
이 작업은 매우 간단하며 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);
}
추신 환경 설정에서 부울을 사용하지 마십시오 정수만 사용하십시오. 정의되지 않은 경우 기본값은 0입니다.
또한 [theDefaults synchronize];
라인이 필요하지는 않지만 앱이 수백 개의 장치에서 수백 번 실행되면 결과가 항상 신뢰할 수있는 것은 아니라는 것이 아니라 더 나은 방법이라는 것을 알았습니다.
Xcode 7의 Swift 2.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
}
}
}
빠른
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
신속하게 나는 App delegate 위와 같은 범위 밖에서 매우 쉽게 수행 할 수있는 전역 상수를 사용하는 것이 좋습니다. 따라서 앱이 종료되지 않는 한 올바른 값으로 설정됩니다. 앱이 백그라운드로 이동하면 여전히 동일한 값을 반환합니다. 앱이 완전히 다시 시작된 경우에만 값이 변경됩니다.
let isFirstLaunch: Bool = {
if !UserDefaults.standard.bool(forKey: "hasBeenLaunchedBeforeFlag") {
UserDefaults.standard.set(true, forKey: "hasBeenLaunchedBeforeFlag")
UserDefaults.standard.synchronize()
return true
}
return false
}()
그러나 솔직히 앱이 적어도 한 번 백그라운드로 전송되었다는 사실을 추적하는 것이 좋습니다. 이 경우 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()
}
스위프트 5 iOS 13.
나는 Chris Fremgen의 빠르고 쉬운 것을 좋아 합니다. 그래서 나는 그것을 업데이트했다.
func isFirstTimeOpening() -> Bool {
let defaults = UserDefaults.standard
if(defaults.integer(forKey: "hasRun") == 0) {
defaults.set(1, forKey: "hasRun")
return true
}
return false
}
XCode 11 , Swift 5 용으로 업데이트
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()
가장 좋은 방법은 변수 를 사용 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
}
다음은 swift 5.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()
때 와 앱이 호출되었는지 확인할 때마다 함수를 호출하면됩니다 .