2

当机场连接到 ap 时,我需要来自系统的通知。有没有可能用SystemConfiguration框架做到这一点?我在理解系统配置 api 文档时遇到问题。

4

2 回答 2

5

您在 SystemConfiguration 网络的正确轨道上,它提供了SCNetworkReachability功能集。你可以尝试使用

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 回答