后台的 IOS 可达性通知



我想在用户上线后立即执行一些任务,即使他在后台。我正在使用可达性类来检查互联网。但是当我在后台时,这门课并没有通知我。我知道人们早些时候问过这个问题,但没有任何解决方案。如果我使用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+

最新更新