1. 简单说明
项目使用到了CocoaAsyncSocket
,建立TCP之前,使用了UDP广播获取IP地址,但是系统升级到iOS 14之后,发现有台iPad间歇性可以收到广播,iPhone一直没有收到广播。
2. 解决办法
-
Info.plist添加NSLocalNetworkUsageDescription
-
到这个页面申请APP接受组播或广播的权限Multicast Networking Entitlement Request
如果打开报502,可以尝试复制链接到Safari打开重试。
打开后页面会有下面说明,主要是填写App信息并解释一下用到UDP组播或广播的目的。
// 说明 Multicast Networking Entitlement Request This entitlement allows advanced networking apps to interact with their local network by sending multicast and broadcast IP packets and browsing for arbitrary Bonjour service types. Your app may need to access this level of networking in order to communicate with custom or non-standard devices or to act as a network utility. If your app needs this entitlement to function properly on iOS 14 or later, provide the following information. // 开发账号信息 Developer information // App 信息 App information ...... Explain why your app needs to send multicast or broadcast traffic, or browse for all Bonjour service types.
-
如果你的APP需要发送UDP广播,需要先发送一个伪包来触发弹框(本地网络访问),让用户确定后,再开始发送UDP广播。如果只是接受广播,不用处理。
-
填写完点击发送。
Thank you for your submission. We will review your request and will get back to you.
3. 参考原文内容
First things first, make sure you populate NSLocalNetworkUsageDescription in your Info.plist.
Next, make sure to apply for and, once it’s granted, enable the com.apple.developer.networking.multicast. iOS 14 will eventually require this for anyone doing multicasts and broadcasts (currently this requirement is not enforced for BSD Sockets clients).
Finally, be aware that the local network privacy alert is only triggered when you send traffic, so if your UDP socket only receives and never sends then you won’t see the alert. The current workaround is to send a dummy packet to trigger the alert.
看下官方说明
// A Boolean value that indicates whether an app can send or receive IP multicast traffic.
com.apple.developer.networking.multicast
/* discussion
Your app must have this entitlement to send or receive IP multicast or broadcast on iOS. It also allows your app to browse and advertise arbitrary Bonjour service types.
This entitlement requires permission from Apple before you can use it in your app. Request permission from the Multicast Networking Entitlement Request page.
*/