iPhone应用程序中NSHost的替代方案

iPhone应用程序中NSHost的替代方案,iphone,networking,iphone-privateapi,nshost,Iphone,Networking,Iphone Privateapi,Nshost,我目前正在使用此代码 NSHost *host = [NSHost hostWithAddress:hostname]; if (host == nil) { host = [NSHost hostWithName:hostname]; if (host == nil) { [self setMessage:@"Invalid IP address or hostname:"]; return; } } 为我正在使用的网络应用程序

我目前正在使用此代码

    NSHost *host = [NSHost hostWithAddress:hostname];
if (host == nil) {
    host = [NSHost hostWithName:hostname];
    if (host == nil) {
        [self setMessage:@"Invalid IP address or hostname:"];
        return;
    }
}
为我正在使用的网络应用程序检索我的IP地址,但是我知道NSHost是一个将被拒绝的私有API。有谁能帮助我在不使用NSHost的情况下使用此代码生成相同的结果?我真的不知道从哪里开始

编辑:

下面的建议看起来近乎完美,我在我的应用程序中添加了这段代码来代替上面的代码

    Boolean result;
CFHostRef hostRef;
CFArrayRef addresses;
NSString *hostname = @"www.apple.com";
hostRef = CFHostCreateWithName(kCFAllocatorDefault, (CFStringRef)hostname);
if (hostRef) {
    result = CFHostStartInfoResolution(hostRef, kCFHostAddresses, NULL); // pass an error instead of NULL here to find out why it failed
    if (result == TRUE) {
        addresses = CFHostGetAddressing(hostRef, &result);
    }
}
if (result == TRUE) {
    NSLog(@"Resolved");
} else {
    NSLog(@"Not resolved");
}
我已经删除了第4行(因为我已经从其他地方获得了这些信息),但是我得到的错误是基于未声明的CFHostRef。我将如何解决这个问题?这似乎是我唯一的一个大障碍,因为其他错误仅仅是基于在那之后无法看到hostRef。
编辑:请注意,我还未声明KCFHOSTADDRESS。

您可以使用CFHost实现相同的功能。顶部是一本食谱,用于查找

下面的代码执行非常,非常基本的同步分辨率(正如您上面使用NSHost时所做的那样)。请注意,您不想这样做,因为它会使您的应用程序无响应,因为它在解决问题或超时命中之前不会返回

改用异步查找(CFHostSetClient和CFHostScheduleWithRunLoop,如上述CFHost文档所述)。此外,根据您的计划,您可能希望研究使用可达性API。查看iPhone开发者网站上的WWDC网络会话

Boolean result;
CFHostRef hostRef;
CFArrayRef addresses;
NSString *hostname = @"www.apple.com";
hostRef = CFHostCreateWithName(kCFAllocatorDefault, (CFStringRef)hostname);
if (hostRef) {
    result = CFHostStartInfoResolution(hostRef, kCFHostAddresses, NULL); // pass an error instead of NULL here to find out why it failed
    if (result == TRUE) {
        addresses = CFHostGetAddressing(hostRef, &result);
    }
}
if (result == TRUE) {
    NSLog(@"Resolved");
} else {
    NSLog(@"Not resolved");
}

// Don't forget to release hostRef when you're done with it
看看这个:


通过开发人员支持系统得到了一个很好的答案,这非常有效。

您能为具体配方提供更多的指导吗?我不太清楚我在看的是哪一部分(当时没有坐在我的机器前,所以很难看到它是如何与我的代码的其余部分联系在一起的)上面编辑了一个非常简单的同步示例(除非你希望你的UI冻结,否则你绝对不应该使用它)。我发现这对Bonjour广告服务很有帮助。对于手动输入的IP,NSHost无法使其正常工作。@您的代码注释错误。释放
地址
可能会导致应用程序崩溃。您使用get方法检索地址,CoreFoundation准则规定您不得释放get方法检索的值。如果您自己保留了方法返回的值(使用
CFRetain
),那么您只能释放名称中带有create或copy的方法返回的值。返回的数组实际上归
CFHost
所有,它只向您返回数组的一个引用(它不会先保留它-苹果
CFHost.c
是开源的,您可以自己验证)。@Mecki谢谢,修复了这个问题。明天我带着笔记本电脑时,Wollongong会考虑实现这个。现在正在制作我的ipad戒指。请注意,这是为了在您似乎正在寻找解析主机名时获取iPhone自己的IP地址,至少从我对您的问题的理解来看是这样的。实际上,您可能正在使用xtina。我只是在收到苹果的拒绝后才回头看了看我的代码,所以可能需要检查一下。如果我想解析一个主机名,我该怎么做呢?这个评论只是关于Andrew链接的示例。我在上面编辑了我的原始答案,以澄清如何使用Nhost而不是CFHost执行操作。