背景:
项目需求:手机开启热点,要获取连接自己热点的设备ip。
技术方案:
NSNetService和NSNetServiceBrowser(Bonjour网络编程),采用Bonjour网络编程获取ip.
Cocoa 网络框架
Cocoa 网络框架有三层,最底层的是基于 BSD socket库,然后是 Cocoa 中基于 C 的 CFNetwork,最上面一层是 Cocoa 中 Bonjour。通常我们无需与 socket 打交道,我们会使用经 Cocoa 封装的 CFNetwork 和 Bonjour 来完成大多数工作。注:cocoa 很多组件都有两种实现,一种是基于 C 的以 CF 开头的类(CF=Core Foundation),这是比较底层的;另一种是基于 Obj-C 的以 NS 开头的类(NS=Next Step),这种类抽象层次更高,易于使用。对于网络框架也一样。Bonjour 中 NSNetService 也有对应的 CFNetService,NSInputStream 有对应的 CFInputStream。
Bonjour 简介
Bonjour(法语中的你好)是一种能够自动查询接入网络中的设备或应用程序的协议。Bonjour 抽象掉 ip 和 port 的概念,让我们聚焦于更容易为人类思维理解的 service。通过 Bonjour,一个应用程序 publish 一个网络服务 service,然后网络中的其他程序就能自动发现这个 service,从而可以向这个 service 查询其 ip 和 port,然后通过获得的 ip 和 port 建立 socket 链接进行通信。通常我们是通过 NSNetService 和 NSNetServiceBrowser 来使用 Bonjour 的,前者用于建立与发布 service,后者用于监听查询网络上的 service。
实战
需要协定的参数
- Domain:“local.”
- type: (协定和server一致)
- name: (协定和server一致)
步骤
这是一个链接 代码的具体实现
- 通过NSNetService发布socket
- 使用NSNetService框架中的NSNetServiceBrowser类去发现本地服务
Tip
通过上述实现,能够获取到连接AP的ip是多少。但是仅限iOS14以下,如果版本大于iOS14,则无法获取。
原因:因为大于iOS14的版本,需要在infoPlist中添加配置。相关问题解决链接
<key>NSLocalNetworkUsageDescription</key>
<string>Reason for using Bonjour that the user can understand</string>
<key>NSBonjourServices</key>
<array>
<string>_my-service._tcp</string>
<string>_my-service._udp</string>
</array>
refrence:
网友评论