检测后台的可达性 [英] Detect the reachability in background
问题描述
我一直在测试不同的方法来实现在应用程序处于后台时设备是否能够恢复互联网的可能性,因此我测试的第一个代码是Apple可访问性示例代码
然后你需要询问时间间隔尽可能多地越快越好,所以我建议应用程序:didFinishLaunchingWithOptions:
,你需要把这一行:
- (BOOL)应用程序:(UIApplication *)应用程序didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
[application setMinimumBackgroundFetchInterval:UIApplicationBackgroundFetchIntervalMinimum];
返回YES;
}
UIApplicationBackgroundFetchIntervalMinimum
它是尽可能频繁,但它不是文档提取之间的确切秒数:
系统支持的最小提取间隔。 / p>
然后当背景提取开始时你可以用方法检查 AppDelegate
:
- (void)application:(UIApplication *)application performFetchWithCompletionHandler:(void(^)(UIBackgroundFetchResult))completionHandler {
可达性*可达性= [可达性reachabilityForInternetConnection];
[可达性startNotifier];
NetworkStatus status = [reachability currentReachabilityStatus];
switch(status){
case NotReachable:{
NSLog(@no internet connection);
休息;
}
案例ReachableViaWiFi:{
NSLog(@wifi);
休息;
}
案例ReachableViaWWAN:{
NSLog(@cellurar);
休息;
}
}
completionHandler(YES);
}
所有这些都适用于 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屋!