5

私のiphoneアプリは非常にシンプルで、すべてを処理する1つのビューがあります。viewDidLoadで、インターネットに接続されているかどうかを確認します。インターネットに接続されているかどうかを確認します。接続されている場合はWebからロードし、そうでない場合はローカルリソースからロードします。そして、これはうまくいきます。

//in viewDidOnload    
[[NSNotificationCenter defaultCenter] addObserver:self 
                                          selector:@selector(handleNetworkChange:) 
                                          name:kReachabilityChangedNotification object:nil];
reachability = [Reachability reachabilityForInternetConnection];
[reachability startNotifier];
NetworkStatus status = [reachability currentReachabilityStatus];

if (status == NotReachable) {
    //Do something offline
} else {
    //Do sometihng on line
}

- (void)handleNetworkChange:(NSNotification *)notice{
 NetworkStatus status = [reachability currentReachabilityStatus];
 if (status == NotReachable) {
  //Change to offline Message
 } else {
  //Relaunch online application
 }

}

handleNetworkChangeイベントをテストするために、すべてのセルラーデータをオフにしましたが、wifiはオンのままにしました。Wi-Fiの範囲内でアプリを起動しましたが、すべてが完璧に機能します。次に、wifiの範囲外を歩きますが、handleNetworkChangeが起動しません(uiAlertViewを使用してテスト済み)。Wi-Fiの範囲外に立つと、アプリはオフラインメッセージを正常に起動します。

私の疑惑は、これがViewControllerのライフサイクルの問題であるということですが、このコードをAppDelegate関数に配置する必要がありますか?おそらく、それは最初からより良い設計です。

4

4 に答える 4

18

到達可能性変数を保持していなかったため、メモリ管理の問題であることが判明しました。スコープ外になるとすぐに、deallocが呼び出され、stopNotifierメソッドが呼び出されました。したがって、範囲外に出るため、更新はありません。

したがって、代わりに:

reachability = [Reachability reachabilityForInternetConnection];

そうです

reachability = [[Reachability reachabilityForInternetConnection] retain];

そしてすべてが機能します!

これらすべてを通して私が学んだクールなことの1つは、空港をオフにするだけで、シミュレーターで失われた接続をシミュレートできることです。外を歩き回る必要はもうありません。:)

于 2010-12-21T19:30:27.183 に答える
0

Appleの到達可能性の例を見てください。AppDelegateで通知を開始すると思います。私のアプリの1つで、AppDelegate接続更新メソッドによって常に更新されるブール変数を作成したので、他のView Controllerでは、デリゲートを呼び出してIsConnectedboolの値を確認するだけです。

ここで別の考えをします...到達可能性をチェックするときにアプリがフリーズする可能性がある到達可能性クラスの問題に気づきました。新しいアプリでは、到達可能性クラスを完全にスキップし、NSUrlConnectionとUIWebViewのDidFailデリゲートメソッドを中継して、真の接続性があるかどうかを判断します。到達可能性クラスがそれを理解するのを待つ必要がなくなり、次に何をすべきかを決定するのに失敗します。単にWeb呼び出しを続行し、ローカルをフォールバックとして使用します。

お役に立てれば!!

于 2010-12-21T17:18:24.803 に答える
-1

プロジェクトにsystemconfiguration.frameworkを含める必要があります。

于 2014-04-12T18:13:21.993 に答える
-2

アプリケーションがバックグラウンドで実行されていません。

このメソッドをデリゲートクラスに追加してください

- (void)applicationDidEnterBackground:(UIApplication *)application
{ UIApplication* app = [UIApplication sharedApplication];

    UIBackgroundTaskIdentifier __block bgTask = [app beginBackgroundTaskWithExpirationHandler: ^{
        dispatch_async(dispatch_get_main_queue(), ^{
            [app endBackgroundTask:bgTask];
            bgTask = UIBackgroundTaskInvalid;
        });
    }];

}

ありがとう

于 2013-11-25T12:02:27.473 に答える