Определить достижимость в фоновом режиме
Я тестировал другой способ реализовать возможность узнать, будет ли устройство возвращаться к Интернету, когда приложение находится в фоновом режиме, поэтому первым тестом, который я тестировал, был пример кода доступности Apple http://developer.apple.com/library/ios/#samplecode/Reachability/Introduction/Intro.html
Но этот код не уведомляет интернет-состояние, когда приложение находится в фоновом режиме. Поэтому я попробовал и следующий код, и он работает, когда приложение запускается из состояния "Состояние" на передний план (то же, что и образец кода достижимости Apple).
- (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;
}
}
}
Мой вопрос:. Как получить уведомление, когда состояние Интернета изменилось, когда приложение находится в фоновом режиме?
Ответы
Ответ 1
Live вы не можете изменить, если сетевое подключение изменилось, самый лучший, который вы можете сделать, чтобы заставить его работать, - использовать Background Fetch
режим от Capabilities
. Сначала вы должны установить флажок для фонового режима:
![введите описание изображения здесь]()
Затем вам нужно запросить временной интервал так часто, как только вы можете, тем лучше, поэтому я предлагаю 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(@"cellurar");
break;
}
}
completionHandler(YES);
}
Все это будет работать в iOS 7.0 или выше.
Ответ 2
Я не верю, что есть способ получить уведомления о доступности, пока вы находитесь в фоновом режиме. Правильный способ справиться с этим - проверить доступность в приложении AppDelegate - (void) applicationWillEnterForeground: (UIApplication *).
Единственное фоновое событие, на которое реагируют фоновые приложения, это получение push-уведомлений, и это связано с тем, что ОС пробуждает их для этого, а затем только тогда, когда пользователь запрашивает его.
Ответ 3
Приложение должно быть многозадачным (VoIP, LOCATION или Audio). И таким образом вы можете поймать сеть, меняя ее, когда приложение находится в фоновом режиме.