2

到達可能性コードをアプリに組み込み、数か月間正常に機能しましたが、これまではiOS5デバイスでのみ使用していました。ただし、iOS4デバイスでは機能しません。

通知は次のように登録されます。

 - (id) init
{
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(reachabilityChange:)
                                                 name:kReachabilityChangedNotification
                                               object:nil];

...


- (void) appBecameActive
{
...
self.reachability = [Reachability reachabilityWithHostName:[url host]];
...
[self.reachability startNotifier];

stopNotifierはdeallocでのみ呼び出されます

問題は、到達可能性が変更されたときにReachabilityCallbackがコールバックされないことですが、iOS4ではなくiOS5で問題がない理由がわかりません。

コードのこの部分は、Appleのサンプルソースコードから変更されていません。

static void ReachabilityCallback(SCNetworkReachabilityRef target, SCNetworkReachabilityFlags flags, void *info) {
#pragma unused (target, flags)
  NSCAssert(info != NULL, @"info was NULL in ReachabilityCallback");
  NSCAssert([(__bridge id)info isKindOfClass:[Reachability class]], @"info was wrong class in ReachabilityCallback");

  Reachability *noteObject = (__bridge Reachability *)info;
  // Post a notification to notify the client that the network reachability changed.
  [[NSNotificationCenter defaultCenter] postNotificationName:kReachabilityChangedNotification object:noteObject];
}

前述のように、iOS5デバイスで実行している場合、すべてが長い間正常に機能していますが、過去にiOS4に到達可能性コードを組み込んだ同様の問題に遭遇した人はいますか?

4

3 に答える 3

4

通知を投稿する到達可能性のコードを編集してメインスレッドに投稿し、それによって表示されている動作が変わるかどうかを確認します。

dispatch_async(dispatch_get_main_queue(), ^{ 
    [[NSNotificationCenter defaultCenter] postNotificationName:kReachabilityChangedNotification object:noteObject];
});

(メインスレッドでそれらをリッスンしていると仮定します)

于 2012-06-13T09:27:56.253 に答える
0

kReachabilityChangedNotificationシステムフレームワークによって生成される通知ではありません。Reachabilityサンプルコードによって生成されます。サンプルコードは、単にコピーしてアプリケーションにそのまま貼り付けるのではなく、概念を示すことを目的としています。通知をリッスンする場所ではなく、問題の原因の到達可能性コードを確認することをお勧めします。

于 2012-06-09T17:19:00.053 に答える
0

initメソッドにブレークポイントを設定して、登録が呼び出されていることを確認します。そうでない場合は、viewDidLoadに移動するか、initメソッドが別の場所で呼び出されていることを確認してください。

appBecameActiveについても同じことをします。このためのブレークポイントを設定し、それが開始されていることを確認します。ここから呼び出す必要があります:applicationDidBecomeActive:UIApplicationDelegateクラス。

于 2012-06-12T17:10:01.550 に答える