dnl*_*kng 2 macos objective-c wifi
当机场连接到 ap 时,我需要来自系统的通知。有没有可能用SystemConfiguration框架做到这一点?我在理解系统配置 api 文档时遇到问题。
您正在使用 SystemConfiguration 网络,它提供了SCNetworkReachability功能集。你可以尝试使用
SCNetworkReachabilitySetCallback
Run Code Online (Sandbox Code Playgroud)
设置一个回调,当可达性发生变化时将调用该回调;和
SCNetworkReachabilityScheduleWithRunLoop
Run Code Online (Sandbox Code Playgroud)
在运行循环中安排可达性检查
或者,您可以尝试使用建立在 SystemConfiguration 框架之上的可达性框架(适用于 MacOS 和 iOS)以使事情变得更加简单(更高级别)。
如果您想采用 SystemConfiguration 方式,这就是您检查当前可达性并安装回调以接收更改通知的方式(源):
- (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
}
Run Code Online (Sandbox Code Playgroud)
这是回调的示例:
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();
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3492 次 |
| 最近记录: |