【问题标题】:Alternatives to NSHost in iPhone appiPhone 应用中 NSHost 的替代品
【发布时间】:2010-08-08 11:53:34
【问题描述】:

我目前正在使用此代码

    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。 编辑:从头开始,我也未声明 kCFHostAddresses。

【问题讨论】:

    标签: iphone networking iphone-privateapi nshost


    【解决方案1】:

    您可以使用 CFHost 来实现相同的目的。 CFHost Reference 的顶部是用于查找的食谱。

    下面的代码做了非常、非常基本的同步解析(就像你上面的 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 广告服务很有帮助。不能让它完全适用于 NSHost 所做的手动输入的 IP。
    • @puzzle 您的代码注释错误。释放addresses 可能会导致您的应用程序崩溃。您使用 get 方法检索了地址,CoreFoundation 指南规定您不得释放通过 get 方法检索的值。您只能释放名称中带有 createcopy 的方法返回的值,并且如果您自己保留了它们(使用 CFRetain)。返回的数组实际上归CFHost 所有,它只是将数组的引用返回给您(它不会先保留它 - Apples CFHost.c 是开源的,您可以自己验证)。
    • @Mecki 谢谢,已解决。
    【解决方案2】:

    【讨论】:

    • Wollongong 看看明天我带着笔记本电脑时如何实现这个。现在正在处理我的 ipad 戒指。
    • 请注意,这是为了在您似乎正在寻找解析主机名时获取 iPhone 自己的 IP 地址,至少从我阅读您的问题的方式来看是这样。
    • 其实你可能在 xtina.在收到苹果的拒绝后,我只看了一眼我的代码,所以可能需要检查一下。如果我想解析主机名,我该怎么做?
    • 这条评论只是关于 Andrew 链接的示例。我在上面编辑了我的原始答案,以阐明如何用 CFHost 代替 NSHost。
    【解决方案3】:

    http://developer.apple.com/iphone/library/qa/qa2009/qa1652.html

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-21
      • 2016-07-09
      • 2012-03-26
      • 1970-01-01
      相关资源
      最近更新 更多