如何检测我的应用程序是否已在didFinishLaunchingWithOptions方法中进行后台提取?

时间:2015-02-04 11:17:05

标签: ios objective-c background-fetch

我想检查我的应用是否已在我的应用委托代理人的didFinishLaunchingWithOptions中启动后台提取。 launchOptions字典中没有任何内容。那么有什么方法可以检查它吗?

我知道我可以检查applicationState,但由于某种原因,有时它会返回UIApplicationStateBackground,即使我正常启动应用程序也是如此。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    if (application.applicationState != UIApplicationStateBackground) {
    // Analytics initialization code
    }
}

我已经在Google Analytics初始化代码中创建了断点,即使我正常启动应用,它有时会进入此块!

我知道稍后我会在调用applicationDidBecomeActiveapplicationDidEnterBackground时检测到状态。如果我将使用这些方法来检测状态,我需要将我的Analytics初始化代码移动到其他地方。如果它保留在application:didFinishLaunchingWithOptions:,则每次我的应用启动后台提取时都会调用它。那么也许我应该将Analytics初始化代码移到其他方法中,而不要检查applicationState中的application:didFinishLaunchingWithOptions:?如果是这样我可以使用哪种方法?

4 个答案:

答案 0 :(得分:3)

查看此演示文稿的幻灯片19-21:http://www.slideshare.net/moliver816/background-fetch

发布后,您可以立即检查applicationState是否等于UIApplicationStateBackground,以确定您的应用是否已在后台启动。

否则,如果您只是想知道您的应用何时为后台应用刷新获取数据,您可以在UIApplicationDelegate方法application:performFetchWithCompletionHandler:内完成此操作。

答案 1 :(得分:1)

您可以使用GCD调度一次将分析初始化代码包装在一个单例中。这样你知道它每次应用程序加载只运行一次。从后台或任何其他状态恢复将无关紧要,因为生命周期仍然是连续的。

+ (Analytics*)sharedInstance
  {
     static dispatch_once_t onceToken;
     static Analytics* sharedInstance;
     dispatch_once(& onceToken, ^{
         sharedInstance = [[self alloc] init];
         //Do analytics initialization code here
      });
     return sharedInstance;
  }

答案 2 :(得分:0)

试试这个

[[NSNotificationCenter defaultCenter] addObserver:self
                                                 selector:@selector(AppIsInBackground:)
                                                     name:UIApplicationDidEnterBackgroundNotification
                                                   object:nil];

        [[NSNotificationCenter defaultCenter] addObserver:self
                                                 selector:@selector(AppIsActive:)
                                                     name:UIApplicationDidBecomeActiveNotification
                                                 object:nil];

你必须调用选择器:NSNotificationCenter正在调用AppIsInBackground选择器(后台应用程序)

- (void) AppIsInBackground:(NSNotification *) notification {
 //Shut down the memory/processor intensive things and save any states for when the app is reinitialized
}

答案 3 :(得分:0)

以下是iOS为我们的应用程序执行后台提取时调用的委托方法。

这是一个appDelegate方法。

func application(_ application:UIApplication,performFetchWithCompletionHandler completionHandler:@escaping(UIBackgroundFetchResult) - > Void){ }