我应该使用哪种高级API来pipe理iOS上的UDP套接字?

苹果公司在“ networking编程主题概念指南 ”的“ 使用套接字和stream ”一章中说:

注意: POSIXnetworking不会在iOS上激活蜂窝无线电。 出于这个原因,在iOS中通常不鼓励POSIXnetworkingAPI。

另外在“ networking概述指南 ”的“ networking技巧和陷阱 ”一章中,苹果说:

在iOS中,使用直接使用POSIX函数或CFSocket的套接字不会自动激活设备的移动调制解调器或按需VPN。

好吧,所以在iOS上,不应该使用POSIX套接字,也不应该使用CFSocket,它只是通过RunLoops支持asynchronousnetworking的POSIX套接字的薄包装。 没问题。 但是,如果你需要一个UDP套接字 ,你应该使用什么API?

进一步的苹果在“ networking概述指南 ”的“ networking技巧和陷阱 ”一章中说:

连接到主机之前,请避免parsingDNS名称

所以理想情况下,应该有一个用于pipe理UDP套接字的API,除POSIX API和CFSocket之外,它接受DNS名称而不是目标地址的IP地址。

也许我是盲目的,但我无法find任何这样的API。 有任何想法吗?

使用任何第三方API(不是来自Apple)都没有意义,因为这样的API必须基于Apple API,在这种情况下,我可以直接使用这个Apple API。 用POSIX套接字编写我自己的包装API是小菜一碟,以前我写了这么多的套接字包装器,我已经知道所有令人讨厌的陷阱。 然而,我不会使用POSIX API,这是最初的问题。

我问了苹果完全相同的问题,他们的答复或多或less是没有任何UDP套接字的高级接口。 不pipe苹果在他们的指南中如何说,在使用UDP时,要么直接使用POSIX套接字,要么使用poll()select()这样的asynchronouspipe理器,要么创build一个POSIX套接字(也许使用bind()和/或connect()根据需要),然后使用CFSocketCreateWithNative()将其包装到CFSocket对象中以获得RunLoop集成。 这是存在的最佳API。 所有更高级别的API都只能用于TCP。

苹果有一个示例代码描述如何使用UDP。 自己没有尝试过,但这应该给你一些好的指针:

https://developer.apple.com/library/mac/#samplecode/UDPEcho/Introduction/Intro.html

正在尝试同样的事情,虽然文档说低级别的API不会激活蜂窝无线电和按需VPN,但是对于TCP连接并不完全正确。

在UDP的情况下,这是成立的,你的UDP数据包大部分时间都不会被发送。 为了解决这个问题,只需使用底层API打开一个TCP监听套接字,这将启动蜂窝无线电或按需VPN,并在完成后closures套接字。

对于TCP,您可以在iOS设备上使用底层的API作为服务器端代码,这样可以激活蜂窝无线电或按需VPN,但是对于iOS设备上的客户端代码,最好使用更高级别的API提供。 无论哪种方式,收音机是活跃的,你不必担心没有发送数据包。

顺便说一句,这是我目前正在做的。