当用户上线时,我希望能够立即执行一些任务,即使他在后台也是如此。我正在使用Reachability类来检查互联网连接。但是当我处于后台时,该类没有通知我。我知道人们之前问过这个问题,但没有得到任何解决方案。如果我使用beginBackgroundTaskWithExpirationHandler
,它只给我3到4分钟的时间,之后如果网络发生变化,我将不会收到任何通知。请给我提供一些建议。我认为这是可能的,因为原生邮件应用程序以这种方式工作,并且我的应用仅支持iOS7。
当用户上线时,我希望能够立即执行一些任务,即使他在后台也是如此。我正在使用Reachability类来检查互联网连接。但是当我处于后台时,该类没有通知我。我知道人们之前问过这个问题,但没有得到任何解决方案。如果我使用beginBackgroundTaskWithExpirationHandler
,它只给我3到4分钟的时间,之后如果网络发生变化,我将不会收到任何通知。请给我提供一些建议。我认为这是可能的,因为原生邮件应用程序以这种方式工作,并且我的应用仅支持iOS7。
当应用程序在后台运行时,您无法从班级获得通知,您可以利用新的iOS 7后台获取功能。这里有一个教程http://www.objc.io/issue-5/multitasking.html
使用 Capabilities 的后台获取模式。首先需要勾选后台模式复选框:
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);
}