我准备小申请.当我重新启动iPhone 3G(使用3G互联网连接)并安装此应用程序时,getaddrinfo始终返回EAI_NONAME(8).我关闭应用程序并运行Safari然后运行我的应用程序 - 所有工作.什么问题?
- (void)viewDidLoad { [super viewDidLoad]; const char* hostname = "google.com"; struct addrinfo hints, *res; int retval; memset (&hints, 0, sizeof (struct addrinfo)); hints.ai_family = PF_UNSPEC; hints.ai_socktype = SOCK_STREAM; hints.ai_protocol = IPPROTO_TCP; retval = getaddrinfo (hostname, NULL, &hints, &res); if (retval == 0) { freeaddrinfo (res); }else if(retval == EAI_NONAME) { //noname } }
来自Apple的回答:
你好帕维尔,
我正在回应你的发现,尝试使用BSD getaddrinfo功能在尝试获得只能进行无线广域网(WWAN)连接的连接(EDGE,3G)时会出现问题.您遇到的问题是,出于节省电池的原因,WWAN将在不需要网络服务时关闭.接下来的问题是,当需要网络服务时,如何激活WWAN.
官方支持的建立WWAN连接的机制是使用CFSocketStream API(或依赖API - NSSocket,以及CFHTTPStream,CFFTPStream,NSURLRequest和NSURLConnection API).这意味着正式,只支持TCP.此限制会影响所有基于UDP和BSD套接字的应用程序.使用BSD Connect呼叫不会触发iPhone启用WWAN.该限制也适用于在WiFi连接下将导致分组传输的所有其他BSD功能.
但是,在当前的iPhone OS下,一旦建立了WWAN连接,使用BSD套接字和CFSocket功能将使WWAN连接保持活动状态.这使得基于UDP或BSD套接字的应用程序可以通过使用CFSocketStream API与TCP服务器(包括HTTP Web服务器)建立连接来建立WWAN连接.一旦连接处于活动状态,程序就可以像过去一样运行.这就是访问网络服务的Safari,Mail和其他Apple应用程序用于建立连接的方式.因此,当您启动Safari时,启动您的应用程序网络访问工作.使用Safari会导致iPhone建立WWAN连接.当您退出Safari时,WWAN不会自动关闭 - 它会在短时间内保持活动状态.如果启动应用程序,则WWAN服务处于活动状态,只要存在网络活动,您的应用程序将使WWAN保持活动状态.
如果您的应用程序要使用TCP,那么您可以修改代码以使用CFSocketStream或依赖API进行网络连接.当然,如果你有一个完整的BSD套接字功能库,对于想要尽快将应用程序推送到App Store的人来说,这可能不是一个合理的解决方案.
....