【发布时间】:2014-09-05 08:39:14
【问题描述】:
我已将后台任务功能添加到我的应用程序中。这是我的应用委托
// AppDelegate.m
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
[self setWindow:[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]];
[self.window setBackgroundColor:[UIColor blackColor]];
if (application.applicationState != UIApplicationStateBackground) {
// Application is launch in because user tap the app icon or from springboard
if ([application respondsToSelector:@selector(setMinimumBackgroundFetchInterval:)]) {
[application setMinimumBackgroundFetchInterval:UIApplicationBackgroundFetchIntervalMinimum];
}
} else {
// Application is launch in background mode
}
RootViewController *rootViewController = [[RootViewController alloc] initByDevice];
[self.window setRootViewController:rootViewController];
[self.window makeKeyAndVisible];
return YES;
}
- (void)application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
[[DataManager instance] updateDataWithMaxAttempt:5 block:^(BOOL success, NSArray *newData) {
if (success) {
if ([newData count] > 0) {
completionHandler(UIBackgroundFetchResultNewData);
} else {
completionHandler(UIBackgroundFetchResultNoData);
}
} else {
completionHandler(UIBackgroundFetchResultNoData);
}
}];
}
这是我的根视图控制器
// RootViewController.m
- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
NSLog(@"Did appear");
// Do something that I want it to happen only when the application is visible to user
}
当用户点击应用程序图标时,应用程序会按照我的预期运行。我在控制台中看到“确实出现了”,之后发生的事情就像我预期的那样。
但是当应用程序唤醒执行后台任务(用户不可见)时,RootViewController's viewDidAppear 仍然因为这条线而被调用
[self.window makeKeyAndVisible];
通过调用 makeKeyAndVisible,它使RootViewController 可见,即使它只是在后台任务中唤醒。要解决这个问题,我必须将此行移至applicationDidBecomeActive
- (void)applicationDidBecomeActive:(UIApplication *)application {
[self.window makeKeyAndVisible];
}
因此,RootViewController's viewDidAppear 现在仅在应用程序处于前台(用户可见)时被调用。但是,我担心的是,当应用程序在设备内存中(活动或非活动)applicationDidBecomeActive 将被调用多次。
- 用户启动应用程序
- 应用程序从跳板再次激活
- 设备解锁
- 结束通话
如果我在应用程序生命周期内多次调用UIWindow's makeKeyAndVisible 有什么问题吗?
【问题讨论】:
-
我认为
UIAlertView或UIActionSheet会调用此方法,因为它们在显示时会更改键窗口。我认为在applicationDidBecomeActive中调用[self.window makeKeyAndVisible]不是一个好方法,因为那时可能会有UIAlertView显示。 -
@KudoCC 感谢您的信息,我以前从不知道这个!你知道如果我显示警报视图 --> 锁定设备 --> 解锁它 --> 调用 [self.window makeKeyAndVisible] 会发生什么吗?
-
不好说,是个未定义的动作,你可以试一试。