Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xcode/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 如何获取当前计算机&x27;Xcode中的IP地址_Objective C_Xcode - Fatal编程技术网

Objective c 如何获取当前计算机&x27;Xcode中的IP地址

Objective c 如何获取当前计算机&x27;Xcode中的IP地址,objective-c,xcode,Objective C,Xcode,在测试连接到本地计算机服务器的iPhone应用程序时,我需要输入计算机的本地IP地址,而不是localhost,以便使用模拟器以外的设备进行测试。动态IP地址和多个开发人员正在测试时,这会让人恼火。是否有一个代码段可以获取编译代码的计算机的IP地址,而不是运行应用程序的设备的IP地址(最好是C或Objective-C,而不是Swift)?如果您在编译时需要它,您可以在Xcode项目的“构建阶段”选项卡中添加一个“运行脚本”。将其放入源代码中自然会返回代码运行的IP地址,而不是生成代码的IP地址

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

如果您在编译时需要它,您可以在Xcode项目的“构建阶段”选项卡中添加一个“运行脚本”。将其放入源代码中自然会返回代码运行的IP地址,而不是生成代码的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'
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) 在您的代码中,使用服务器IP就像您定义任何其他服务器一样,它将始终具有生成代码的计算机的值。

我通过让运行脚本在应用程序的plist中设置计算机的IP地址,然后在代码中读取plist值来实现这一点

1)在Info.plist文件中,添加一个包含计算机IP地址的密钥/值对。在本例中,我们将添加一个类型为“String”的“CompanyNameDevServerIP”密钥。请注意,此密钥/值对的前缀应唯一,以便它不会与Apple的密钥冲突(有关更多信息,请参阅)

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
NSString *serverIP = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CompanyNameDevServerIP"];
这将在plist中设置计算机的IP地址,该plist与生成绑定,但仅在调试生成中设置。(它已从发布版本中的plist文件中删除。)

  • 为提供这项技术,我们在此提供了一些提示
  • 您可能需要使用除
    en0
    以外的其他界面(有关更多信息,请参阅)
3)在代码中,检索此plist值以获取计算机的IP地址:

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
NSString *serverIP = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CompanyNameDevServerIP"];

look@websky这是获取运行应用程序的设备的IP地址,而不是编译应用程序的计算机的IP地址,对吗?哪个IP地址?Mac是多主的。@Uchiugaka路由器的本地ipv4地址,如
192.168.1.10
对,我的观点是,很容易假设有一个可能的地址。如果代码将在其他地方使用,条件可能会有所不同。一些网络设备会重新分配地址,例如,当连接使用DHCP时,它可能看起来是恒定的,但可能会意外地改变。这与我正在寻找的非常接近,但我遇到了一个小问题。首先,我必须将“运行脚本”阶段放在“编译源代码”阶段之前,这样宏在编译之前就已经存在了,但是当我尝试构建时,我遇到了以下错误:
Script-272AC20F1A7A8F7A00E654B7.sh:第2行:导出:
=192.168.1.10]:不是有效的标识符`抱歉!我的打字错误。。。我不应该把$放在服务器的IP名中。我已经按原始答案修改了,不用担心!越来越近,但仍然有问题。脚本阶段已成功生成,但此代码段
+(NSString*)appServerUrlPrefix{return SERVER_IP;}
将导致
非无效方法“appServerUrlPrefix”应返回值。我在“调试”下为“其他C标志”添加了
-DSERVER_IP=${SERVER_IP}
<代码>NSLog(@“服务器IP:%@”,服务器IP)导致
预期表达式
错误。再次感谢你的帮助!
SERVER\u IP
是否更改Xcode中的颜色?如果是这样,编译器将看到#DEFINE定义。现在是最难的部分。这不是一个NSString,而是一个cstring。因此,您需要从该Cstring构造一个NSString。(查看+stringFromCString:encoding)或者看看是否可以将
-DSERVER\u IP=`${SERVER\u IP}`
更改为
-DSERVER\u IP=@`${SERVER\u IP}`
之类的内容。你们运行的是什么版本的Xcode?这对我根本不起作用。每个运行脚本阶段在单独的shell中执行。为了证明这一点,我创建了两个运行脚本阶段。第一次运行“echo mypid:$$”,下一次运行“echo mypid 2:$$;退出1”。打印输出显示两个单独的PID,这意味着在相位之间不能使用环境变量。我正在使用Xcode 6.3FYI。。。如果您已升级到Xcode 10,则新的构建系统已破坏此解决方案。(由于某些原因,PlistBuddy无法找到Info.plist)。解决方法是在“文件/工作区设置”下保留旧版生成系统。@Billy我是否必须将整个项目切换到旧版生成系统才能使其工作?我没有尝试在同一工作区中为不同的项目使用不同的生成系统。我的直觉是:对于包含步骤3中的代码的项目,您只需要遗留构建系统。不,它不会工作。我正在使用Xcode 11和新的构建系统。由于上述原因,这将在步骤2中失败,抛出“info.plist not found”错误。我不确定您为什么要通过echo | xargs调用PlistBuddy命令,您只需将plist的路径传递给命令:/usr/libexec/PlistBuddy-c“Add:CompanyNameDevServerIP strin