Как получить уведомления о достижении в iOS в фоновом режиме при отключении Wi-Fi-сети?
Я успешно использую Reachability, чтобы определить статус сети и получать уведомления об изменениях (например, Руководство по повышению производительности для iOS 4).
Мой вопрос заключается не в том, как запустить Reachability, а скорее в следующем.
My AppDelegate
обрабатывает материал Reachability. Приложение получает уведомления (kReachabilityChangedNotification
), когда приложение запущено, и когда приложение находится в фоновом режиме (applicationDidEnterBackground:
).
Приложение предназначено для перезагрузки воспроизводимого аудиопотока, когда он замечает, что он потерял соединение Wi-Fi, например. Чтобы проверить, я включил и отключил Wi-Fi в настройках, и все сработало отлично. В реальном тестировании я часто теряю связь Wi-Fi, когда я выхожу из диапазона точки доступа. Я обнаружил, что в этом случае Reachability не слишком сильно помогает мне. Я не уверен, что это связано с тем, что уведомления о достижимости недоступны, когда экран заблокирован, или если Reachability не справляется с медленным уменьшением сигнала с более далекой точки доступа Wi-Fi, но независимо от того, почему реальное тестирование не соответствует идеализированному случаю.
Вот как выглядит мой код. Я сначала настроился на получение уведомлений и начал слушать Reachability:
- (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];
....
return YES;
}
а затем это функция, которая реагирует на изменения в связности:
- (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");
break;
}
case ReachableViaWWAN:
{
NSLog(@"The internet is working via WWAN!");
break;
}
}
}
Уведомления появляются даже тогда, когда приложение находится в фоновом режиме, но они не находятся в реальном тестировании, описанном выше.
Спасибо за любую помощь.
Ответы
Ответ 1
По умолчанию в фоновом состоянии приложение остается на короткое время, большинство приложений вскоре переходят в приостановленное состояние. Это означает, что приложение находится в фоновом режиме, но не выполняет код. Таким образом, ваше пользовательское внедренное уведомление не работает.
Должен требовать NetworkReachability во время пробуждения в методах делегатов приложения:
applicationWillEnterForeground:
applicationDidBecomeActive
Ответ 2
Я работал над VoIP-приложением, которое запускается в фоновом режиме при загрузке iPhone, после чего не может быть недоступна сеть (например, если в телефоне есть как код доступа, так и/или SIM-карта с PIN-кодом код). Но поскольку приложение запускается непосредственно в фоновом режиме, метод делегата applicationDidEnterBackground:
не вызывается. Вместо этого я использовал идею @Hurden прямо в application:didFinishLaunchingWithOptions
, проверив applicationState
, чтобы увидеть, действительно ли приложение запускалось в фоновом режиме. Это позволило моему приложению получить уведомление kReachabilityChangedNotification
после разблокировки телефона (включение Wi-Fi для подключения с использованием сохраненного пароля).