2

空港が ap に接続しているときに、システムからの通知が必要です。フレームワークでそれを行う可能性はありますSystemConfigurationか?systemconfigurations api ドキュメントを理解するのに問題があります。

4

2 に答える 2

5

SCNetworkReachability 機能セットを提供するSystemConfigurationネットワークで正しい軌道に乗っています。あなたは使用してみることができます

SCNetworkReachabilitySetCallback

到達可能性が変化したときに呼び出されるコールバックを設定します。と

SCNetworkReachabilityScheduleWithRunLoop

実行ループ内で到達可能性チェックをスケジュールする

または、SystemConfiguration フレームワークの上に構築された到達可能性フレームワーク(MacOS と iOS の両方) を使用して、物事をさらに簡単 (高レベル) にすることもできます。

SystemConfiguration の方法を使用する場合は、現在の到達可能性を確認し、変更が通知されるようにコールバックをインストールする方法を次に示します ( source )。

- (void)checkReachability {
  NSString *server = [[NSUserDefaults standardUserDefaults] stringForKey:@"NCIDServer"];

  if (server == nil) {
    ncid_message_callback(self, [NSLocalizedString(@"No caller ID server was specified.", nil) UTF8String]);
    return;
  }

  const char *serverName = [[[server componentsSeparatedByString:@":"] objectAtIndex:0] UTF8String];
  SCNetworkReachabilityContext context = {0, (void *)self, NULL, NULL, NULL};
  networkReachability = SCNetworkReachabilityCreateWithName(NULL, serverName);

  if (networkReachability == NULL)
    goto fail;

  // If reachability information is available now, we don't get a callback later
  SCNetworkConnectionFlags flags;

  if (SCNetworkReachabilityGetFlags(networkReachability, &flags))
    networkReachabilityCallback(networkReachability, flags, self);

  if (!SCNetworkReachabilitySetCallback(networkReachability, networkReachabilityCallback, &context))
    goto fail;

  if (!SCNetworkReachabilityScheduleWithRunLoop(networkReachability, [[NSRunLoop currentRunLoop] getCFRunLoop], kCFRunLoopCommonModes))
     goto fail;
  return;

fail:
  if (networkReachability != NULL)
    CFRelease(networkReachability);

  networkReachability = NULL; //-- ivar representing current reachability

}

そして、これはコールバックのサンプルです:

static void networkReachabilityCallback(SCNetworkReachabilityRef target,
                SCNetworkConnectionFlags flags,
                void *object) {
  // Observed flags:
  // - nearly gone: kSCNetworkFlagsReachable alone (ignored)
  // - gone: kSCNetworkFlagsTransientConnection | kSCNetworkFlagsReachable | kSCNetworkFlagsConnectionRequired
  // - connected: kSCNetworkFlagsIsDirect | kSCNetworkFlagsReachable

  if (networkReachability == NULL)
    return;

  if ((flags & kSCNetworkFlagsReachable) && !(flags & kSCNetworkFlagsConnectionRequired))    {

    if (isReachable) // typically receive a reachable message ~20ms before the unreachable one
    return;

    isReachable = YES;
    ncid_network_kill();
    [NSThread detachNewThreadSelector:@selector(runThread:) toTarget:object withObject:nil];

  } else {
    isReachable = NO;
    ncid_network_kill();
  }
}
于 2012-06-28T07:49:19.977 に答える
0

これには Apple の Reachability クラスを使用する必要があります。http://developer.apple.com/library/ios/#samplecode/Reachability/Listings/Classes_Reachability_m.html#//apple_ref/doc/uid/DTS40007324-Classes_Reachability_m-DontLinkElementID_6

このクラスの使用方法については、このスレッドを確認できます-

接続の種類 (3G、Edge、Wifi、GPRS) が変更されたという通知を受け取る方法

于 2012-06-28T07:51:10.630 に答える