web-dev-qa-db-ja.com

Wi-FiネットワークをドロップするときにiOSのバックグラウンドで到達可能性通知を取得する方法

Reachabilityを正常に使用して、ネットワークのステータスを判別し、変更の通知を受け取ります(例: iOS 4の到達可能性ガイド )。

私の質問は、到達可能性を設定して実行する方法ではなく、次のことです。

私のAppDelegateは到達可能性を扱います。アプリの実行中、およびアプリがバックグラウンドで実行されているときに、アプリは通知(kReachabilityChangedNotification)を受け取ります(applicationDidEnterBackground:)。

アプリは、Wi-Fi接続が失われたことに気付いたときに、再生中のオーディオストリームをリロードするように設計されています。テストのために、設定でWi-Fiのオンとオフを切り替えたところ、すべてが完全に機能しました。実際のテストでは、アクセスポイントの範囲から出るとWi-Fi接続が失われることがよくあります。この場合、到達可能性はあまり役に立たないことがわかりました。画面がロックされているときに到達可能性の通知が届かないためか、到達可能性がWi-Fiアクセスポイントからの信号のゆっくりとした減少に対応していないのかはわかりませんが、理解できません実際のテストが理想的なケースと一致しない理由を説明します。

これは私のコードがどのように見えるかです。最初に通知を受信するように設定し、到達可能性を聞き始めます。

- (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;            
        }
    }    
}

アプリがバックグラウンドにある場合でも通知は届きますが、上記の実際のテストでは通知されません。

助けてくれてありがとう。

24
Tim Camber

デフォルトでは、バックグラウンド状態のアプリは短時間だけとどまりますが、ほとんどのアプリはその後すぐに一時停止状態に移行します。つまり、アプリはバックグラウンドにありますが、コードを実行していません。したがって、カスタム実装された通知は機能しません。アプリデリゲートメソッドのウェイクアップ時にNetworkReachabilityを再クエリする必要があります。

applicationWillEnterForeground:
applicationDidBecomeActive 
5
Arvis

IPhoneの起動時にバックグラウンドで起動されるVoIPアプリに取り組んでいましたが、その時点ではネットワークに到達できない可能性があります(たとえば、電話にパスコードとPINコード)ただし、アプリはバックグラウンドで直接起動されるため、デリゲートメソッドapplicationDidEnterBackground:は呼び出されません。代わりに、@ Hurdenのアイデアを直接application:didFinishLaunchingWithOptionsapplicationStateをチェックして、アプリが実際にバックグラウンドで起動しているかどうかを確認します。これにより、電話のロックが解除された後、アプリがkReachabilityChangedNotification通知を取得できるようになりました(保存されているパスワードを使用してWiFiが接続できるようにします)。

1
newenglander