在后台检测可达性 [英] Detect the reachability in background
问题描述
我一直在测试不同的方法来实现当应用程序处于后台时知道设备是否恢复互联网的可能性,所以我测试的第一个代码是 Apple 可达性示例代码
那么您需要尽可能多地询问时间间隔,越早越好,所以我建议 application:didFinishLaunchingWithOptions:
并且您需要输入这一行:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {[应用程序集MinimumBackgroundFetchInterval:UIApplicationBackgroundFetchIntervalMinimum];返回是;}
UIApplicationBackgroundFetchIntervalMinimum
尽可能频繁,但不是从文档中提取的确切秒数:
系统支持的最小抓取间隔.
然后当后台获取触发时,您可以使用以下方法签入 AppDelegate
:
-(void)application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler{可达性*可达性=[可达性可达性ForInternetConnection];[可达性 startNotifier];NetworkStatus 状态 = [可达性 currentReachabilityStatus];开关(状态){案例不可达:{NSLog(@"没有网络连接");休息;}案例ReachableViaWiFi:{NSLog(@"wifi");休息;}案例ReachableViaWWAN:{NSLog(@"cellurar");休息;}}完成处理程序(是);}
所有这些都可以在 iOS 7.0 或更高版本中运行.
I have been testing different way to implement the possibility to know if the device get internet back when the app it is in background so the first code I test was the Apple reachability sample code http://developer.apple.com/library/ios/#samplecode/Reachability/Introduction/Intro.html
But this code doesn´t notify internet state when the App it´s in background. So I tried also the folowing code and it work when App is launched from Background state to foreground (same as Apple reachability sample code)
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// check for internet connection
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(checkNetworkStatus:)
name:kReachabilityChangedNotification object:nil];
// Set up Reachability
internetReachable = [[Reachability reachabilityForInternetConnection] retain];
[internetReachable startNotifier];
...
}
- (void)applicationDidEnterBackground:(UIApplication *)application {
// check for internet connection
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(checkNetworkStatus:)
name:kReachabilityChangedNotification object:nil];
// Set up Reachability
internetReachable = [[Reachability reachabilityForInternetConnection] retain];
[internetReachable startNotifier];
}
- (void)checkNetworkStatus:(NSNotification *)notice {
// called after network status changes
NetworkStatus internetStatus = [internetReachable currentReachabilityStatus];
switch (internetStatus)
{
case NotReachable:
{
NSLog(@"The internet is down.");
break;
}
case ReachableViaWiFi:
{
NSLog(@"The internet is working via WIFI");
//Alert sound in Background when App have internet again
UILocalNotification *notification = [[[UILocalNotification alloc] init] autorelease];
if (notification) {
[notification setFireDate:[NSDate date]];
[notification setTimeZone:[NSTimeZone defaultTimeZone]];
[notification setRepeatInterval:0];
[notification setSoundName:@"alarmsound.caf"];
[notification setAlertBody:@"Send notification internet back"];
[[UIApplication sharedApplication] scheduleLocalNotification:notification];
}
break;
}
case ReachableViaWWAN:
{
NSLog(@"The internet is working via WWAN!");
//Alert sound in Background when App have internet again
UILocalNotification *notification = [[[UILocalNotification alloc] init] autorelease];
if (notification) {
[notification setFireDate:[NSDate date]];
[notification setTimeZone:[NSTimeZone defaultTimeZone]];
[notification setRepeatInterval:0];
[notification setSoundName:@"alarmsound.caf"];
[notification setAlertBody:@"Send notification internet back"];
[[UIApplication sharedApplication] scheduleLocalNotification:notification];
}
break;
}
}
}
My question is : What is the way to get notified when internet state changed when the app is in Background ?
Live you cannot change if the network connection changed, the very best you can do to make it work is to use Background Fetch
mode from Capabilities
. Firstable you need to check the checkbox for background mode:
Then you need to ask for time interval as often as you can the sooner the better so i suggest application:didFinishLaunchingWithOptions:
and you need to put this line:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
[application setMinimumBackgroundFetchInterval:UIApplicationBackgroundFetchIntervalMinimum];
return YES;
}
The UIApplicationBackgroundFetchIntervalMinimum
it's as often as possible, but it's not exact number of seconds between fetches from the docs:
The smallest fetch interval supported by the system.
And then when background fetch will fire you can check in AppDelegate
with method:
-(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(@"cellurar");
break;
}
}
completionHandler(YES);
}
All of this will work in iOS 7.0 or higher.
这篇关于在后台检测可达性的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!