我想在用户上线后立即执行一些任务,即使他在后台。我正在使用可达性类来检查互联网。但是当我在后台时,这门课并没有通知我。我知道人们早些时候问过这个问题,但没有任何解决方案。如果我使用beginBackgroundTaskWithExpirationHandler
. 它只给我 3 到 4 分钟,之后如果网络更改我没有收到任何通知。请给我一些建议。我认为这是可能的,因为本机邮件应用程序以这种方式工作,并且我的应用程序仅支持 iOS7。
完全按照自己的意愿去做。您不能根据 Apple 提供的应用程序做出假设,因为 Apple 可以访问您无法访问的流程/API。邮件在设备上作为守护进程运行,您的应用程序永远不会这样做。
阅读有关 iOS 7 后台功能的信息。它基于你的应用在用户想要运行应用之前获取处理时间 - 而不是在你选择的任意时间。
当应用程序在后台时,您无法从您的班级获得通知,您可以使用新的iOS 7后台获取可能性。这是一个教程http://www.objc.io/issue-5/multitasking.html
功能"中的"后台获取"模式。首先,您需要选中后台模式的复选框:
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+