后台中的 IOS 可达性通知

4

当用户上线时,我希望能够立即执行一些任务,即使他在后台也是如此。我正在使用Reachability类来检查互联网连接。但是当我处于后台时,该类没有通知我。我知道人们之前问过这个问题,但没有得到任何解决方案。如果我使用beginBackgroundTaskWithExpirationHandler,它只给我3到4分钟的时间,之后如果网络发生变化,我将不会收到任何通知。请给我提供一些建议。我认为这是可能的,因为原生邮件应用程序以这种方式工作,并且我的应用仅支持iOS7。

3个回答

3
无法完全满足您的要求。您不能以苹果提供的应用程序为基础来做出假设,因为苹果可以访问您无法访问的进程/API。邮件作为守护进程在设备上运行,您的应用程序永远不会这样做。
阅读关于iOS 7背景功能的内容。它基于您的应用程序在用户想要运行应用程序之前获得处理时间 - 而不是在您选择的任意时间。

2

0

使用 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);
}

支持 iOS 7.0 及以上版本。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接