5

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

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

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

我在 Analytics 初始化代码处创建了断点,即使我正常启动应用程序,有时它也会进入此块!

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

4

4 回答 4

5

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

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

否则,如果您只想知道您的应用何时为后台应用刷新获取数据,您可以在UIApplicationDelegate方法application:performFetchWithCompletionHandler:中进行。

于 2015-02-10T05:22:14.797 回答
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;
  }
于 2015-02-12T16:56:43.507 回答
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
}
于 2015-02-09T16:09:33.930 回答
0

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

这是一个 appDelegate 方法。

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

于 2017-03-28T18:38:49.007 回答