iOS手机开启热点,要获取连接自己热点设备的ip

背景:

项目需求:手机开启热点,要获取连接自己热点的设备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一致)

步骤

这是一个链接 代码的具体实现

  1. 通过NSNetService发布socket
  2. 使用NSNetService框架中的NSNetServiceBrowser类去发现本地服务

Tip

通过上述实现,能够获取到连接AP的ip是多少。但是仅限iOS14以下,如果版本大于iOS14,则无法获取。

原因:因为大于iOS14的版本,需要在infoPlist中添加配置。相关问题解决链接

NSLocalNetworkUsageDescription
Reason for using Bonjour that the user can understand
NSBonjourServices

    _my-service._tcp
    _my-service._udp

refrence:

  • https://github.com/shaojiankui/iOS-Bonjour-And-Android-NSD
  • https://www.jianshu.com/p/d034bb334043

你可能感兴趣的:(iOS手机开启热点,要获取连接自己热点设备的ip)