gpt4 book ai didi

ios - UIWindow makeKeyAndVisible 和后台任务

转载 作者:行者123 更新时间:2023-11-29 02:41:46 27 4
gpt4 key购买 nike

我已将后台任务功能添加到我的应用程序中。这是我的应用委托(delegate)

// 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);
}
}];
}

这是我的 Root View Controller

// 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 的 viewDidAppear 仍然会因为这一行而被调用

[self.window makeKeyAndVisible];

通过调用 makeKeyAndVisible,它使 RootViewController 可见,即使它只是为了后台任务而唤醒。要解决此问题,我必须将此行移动到 applicationDidBecomeActive

- (void)applicationDidBecomeActive:(UIApplication *)application {
[self.window makeKeyAndVisible];
}

因此,RootViewController 的 viewDidAppear 现在仅在应用程序处于前台(对用户可见)时才被调用。但是,我担心的是,当应用程序在设备内存中(事件或非事件)时,applicationDidBecomeActive 将被调用多次。

  • 用户启动应用
  • 应用程序从 springboard 再次激活
  • 设备解锁
  • 结束通话

如果我在应用程序生命周期中多次调用 UIWindow's makeKeyAndVisible 会有什么问题吗?

最佳答案

您可以轻松确保 makeKeyAndVisible 只发生一次:包装它。

if (!self.window.keyWindow) {
[self.window makeKeyAndVisible;
} else if (self.window.hidden) {
self.window.hidden = NO;
}

关于ios - UIWindow makeKeyAndVisible 和后台任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25681801/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com