【问题标题】:How to get current computer's IP address in Xcode如何在 Xcode 中获取当前计算机的 IP 地址
【发布时间】:2015-03-28 21:40:50
【问题描述】:

在测试连接到本地计算机服务器的 iPhone 应用程序时,我需要输入计算机的本地 IP 地址而不是 localhost,以便使用模拟器以外的设备进行测试。这对动态 IP 地址和多个开发人员进行测试时很烦人。是否有一个代码 sn-p 可以获得正在编译代码的计算机的 IP 地址,而不是 IP 是运行应用程序的设备的地址(最好是 C 或 Objective-C,而不是 Swift)?

【问题讨论】:

  • @websky 这是获取运行应用程序的设备的 IP 地址,而不是编译应用程序的计算机,对吗?
  • 哪个IP地址? Mac 是多宿主的。
  • @uchuugaka 路由器本地ipv4地址如192.168.1.10
  • 我的观点是,很容易假设存在一个可能的地址。如果代码将在其他地方使用,则条件可能会有所不同。某些网络设备会重新分配地址,例如当连接使用 DHCP 时,它可能看起来恒定但可能会意外更改

标签: objective-c xcode


【解决方案1】:

我通过运行脚本在应用程序的 plist 中设置计算机的 IP 地址,然后在代码中读取 plist 值来完成这项工作。

1) 在您的 Info.plist 文件中,添加一个包含您计算机 IP 地址的键/值对。对于此示例,我们将添加一个“CompanyNameDevServerIP”键,类型为“细绳”。请注意,此键/值对的前缀应唯一,以免与 Apple 的键冲突(请参阅here 了解更多信息)。

2) 在“构建阶段”选项卡中,添加包含以下内容的运行脚本:

if [ "$CONFIGURATION" == "Debug" ]; then
  echo -n ${TARGET_BUILD_DIR}/${INFOPLIST_PATH} | xargs -0 /usr/libexec/PlistBuddy -c "Set :CompanyNameDevServerIP `ipconfig getifaddr en0`"
else
  echo -n ${TARGET_BUILD_DIR}/${INFOPLIST_PATH} | xargs -0 /usr/libexec/PlistBuddy -c "Delete :CompanyNameDevServerIP"
fi

这会在与构建捆绑的 plist 中设置计算机的 IP 地址,但仅限于调试构建。 (它已从发布版本的 plist 文件中删除。)

  • 感谢blog post 提供这项技术。
  • 您可能需要使用除en0 以外的其他界面(有关详细信息,请参阅here)。

3) 在代码中,检索此 plist 值以获取您计算机的 IP 地址:

NSString *serverIP = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CompanyNameDevServerIP"];

【讨论】:

  • 仅供参考...如果您已升级到 Xcode 10,则新的构建系统会破坏此解决方案。 (由于某些原因,PlistBuddy 找不到 Info.plist)。一种解决方法是在文件/工作区设置下保留旧版构建系统。
  • @Billy 我是否必须将整个项目切换到 Legacy Build System 才能使其正常工作?
  • 我还没有尝试在同一个工作区中为不同的项目使用不同的构建系统。我的直觉是:您只需要包含步骤 3) 中代码的项目的遗留构建系统。
  • 不,它不起作用。我正在使用 Xcode 11 和新的构建系统。由于上述原因,这将在第 2 步本身中失败并抛出“info.plist not found”错误。
  • 我不知道你为什么要通过 echo | 调用你的 PlistBuddy 命令。 xargs,您可以简单地将 plist 的路径传递给命令: /usr/libexec/PlistBuddy -c "Add :CompanyNameDevServerIP string ipconfig getifaddr en0" "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}"
【解决方案2】:

1) 在包含以下内容的 Xcode 项目的“构建阶段”选项卡中添加“运行脚本”:

export SERVER_IP=`ipconfig getifaddr en0`

注意:将“en0”更改为与您的机器匹配的任何接口。 en0 是我机器上的 wifi,我的硬线是 en3。在终端中执行“ifconfig -a”以获取所有适配器的列表,并查看哪个适合您的机器

2) 转到您的项目文件。单击左侧菜单中的项目本身,然后单击右侧的构建设置。转到“Apple LLVM 6.0 - 自定义编译器标志”。在“其他 C 标志”->“调试”下定义一个名为 -DSERVER_IP=${SERVER_IP}

的新值

这会将构建脚本的结果映射到项目中的#DEFINE

3) 在您的代码中使用 SERVER_IP,就像您使用任何其他 #DEFINE 一样,它始终具有构建代码的计算机的值。

【讨论】:

  • 这与我正在寻找的非常接近,但我遇到了一个小问题。首先,我必须将“运行脚本”阶段放在“编译源”阶段之前,以便宏在编译时间之前就在那里,但是当我尝试构建时,我收到了这个错误:Script-272AC20F1A7A8F7A00E654B7.sh: line 2: export: =192.168.1.10':不是一个有效的标识符`
  • 对不起!我的错字...我不应该将 $ 放在 SERVER_IP 名称中。我已按原始答案进行编辑以纠正该问题。
  • 别担心!越来越近,但仍然有问题。脚本阶段成功构建,但此代码段 +(NSString*)appServerUrlPrefix {return SERVER_IP;} 导致 Non-void method 'appServerUrlPrefix' should return a value。我在“调试”下有 -DSERVER_IP=${SERVER_IP} 用于“其他 C 标志”。 NSLog(@"SERVER_IP: %@", SERVER_IP); 导致 Expected expression 错误。再次感谢您的帮助!
  • SERVER_IP 在 Xcode 中是否改变颜色?如果是这样,编译器将看到#DEFINE 定义。现在是困难的部分。这不会是一个 NSString,它将是一个 cstring。因此,您需要从该 Cstring 构造一个 NSString。 (查看 +stringFromCString:encoding)或者看看你是否可以将 -DSERVER_IP=`${SERVER_IP}` 更改为 -DSERVER_IP=@`${SERVER_IP}` 或类似的东西。
  • 你们运行的是什么版本的 Xcode?这对我来说根本不起作用。每个运行脚本阶段都在单独的 shell 中执行。为了证明这一点,我创建了两个运行脚本阶段。第一个运行“echo mypid: $$”,下一个运行“echo mypid2: $$; exit 1”。打印输出显示两个单独的 pid,这意味着不能在阶段之间使用环境变量。我正在使用 Xcode 6.3
【解决方案3】:

如果您在编译时需要它,您只需在 Xcode 项目的“构建阶段”选项卡中添加“运行脚本”即可。把它放到源代码中自然会返回代码运行的IP地址,而不是它的构建位置。

此脚本将返回主 IP 地址。您可以修改脚本以从那里编辑 Plist 或您需要的任何内容。 PlistBuddy 非常适合在构建时修改 plist 文件。

ifconfig | grep -Eo 'inet (addr:)?([0-9]*\.){3}[0-9]*' | grep -Eo '([0-9]*\.){3}[0-9]*' | grep -v '127.0.0.1'

【讨论】:

    猜你喜欢
    • 2010-09-12
    • 2019-04-26
    • 1970-01-01
    • 2011-06-14
    • 1970-01-01
    • 1970-01-01
    • 2012-09-01
    • 2012-10-28
    • 2017-02-10
    相关资源
    最近更新 更多