即使他在后台,我也想在用户上线后立即完成一些任务。我正在使用Reachability类来检查互联网。但是当我在后台时,这堂课并没有通知我。我知道人们早些时候会问这个问题,但那里没有任何解决方案。如果我使用beginBackgroundTaskWithExpirationHandler
。
它只给我3到4分钟,之后如果网络改变我没有得到任何通知。请建议我。我认为这是可能的,因为本机邮件应用程序以这种方式工作,我的应用程序仅支持iOS7。
答案 0 :(得分:3)
不可能完全按照自己的意愿行事。您不能将您的假设基于Apple提供的应用程序,因为Apple可以访问您不能访问的流程/ API。 Mail在设备上作为守护程序进程运行,您的应用程序永远不会这样做。
了解iOS 7 background capabilities。它基于您的应用程序在用户想要运行应用程序之前获得处理时间 - 而不是在您选择的任意时间。
答案 1 :(得分:2)
当应用在后台时,您无法获得通知,您可以利用新的iOS 7后台提取功能。这是一个教程 http://www.objc.io/issue-5/multitasking.html
答案 2 :(得分:0)
使用Capabilities中的Background Fetch模式。 Firstable你需要选中背景模式的复选框:
Project settings -> Capabilities -> BackgroundMode -> Background Fetch
然后你需要尽可能多地询问时间间隔越快越好,所以我建议application:didFinishLaunchingWithOptions:
你需要把这一行:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
[application setMinimumBackgroundFetchInterval:UIApplicationBackgroundFetchIntervalMinimum];
return YES;
}
UIApplicationBackgroundFetchIntervalMinimum
- 最小的提取 系统支持的间隔。
然后,当背景提取触发时,您可以使用方法
检入AppDelegate
-(void)application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler{
Reachability *reachability = [Reachability reachabilityForInternetConnection];
[reachability startNotifier];
NetworkStatus status = [reachability currentReachabilityStatus];
switch (status) {
case NotReachable: {
NSLog(@"no internet connection");
break;
}
case ReachableViaWiFi: {
NSLog(@"WiFi");
break;
}
case ReachableViaWWAN: {
NSLog(@"cellular");
break;
}
}
completionHandler(YES);
}
支持 iOS 7.0 +