我想检查我的应用是否已在我的应用委托代理人的didFinishLaunchingWithOptions中启动后台提取。 launchOptions字典中没有任何内容。那么有什么方法可以检查它吗?
我知道我可以检查applicationState
,但由于某种原因,有时它会返回UIApplicationStateBackground,即使我正常启动应用程序也是如此。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
if (application.applicationState != UIApplicationStateBackground) {
// Analytics initialization code
}
}
我已经在Google Analytics初始化代码中创建了断点,即使我正常启动应用,它有时会进入此块!
我知道稍后我会在调用applicationDidBecomeActive
或applicationDidEnterBackground
时检测到状态。如果我将使用这些方法来检测状态,我需要将我的Analytics初始化代码移动到其他地方。如果它保留在application:didFinishLaunchingWithOptions:
,则每次我的应用启动后台提取时都会调用它。那么也许我应该将Analytics初始化代码移到其他方法中,而不要检查applicationState
中的application:didFinishLaunchingWithOptions:
?如果是这样我可以使用哪种方法?
答案 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){ }