我无法让它发挥作用,但这并不意味着它是不可能的。
我见过其他人说我需要使用TCP Port
,但有没有人对任何有最终决定权的官方文档有任何指示?
答案 0 :(得分:5)
是的,这就是重点。
但是在iOS 4.2.1(例如)中,你可以在后台接收UDP而不用任何确认。 只需将CFReadStream声明为在applicationDidEnterBackground中监听的VoIP套接字......从iOS 4.3及更高版本开始,该方法不再起作用。
此外,Media5使用“技巧”来保持应用程序的活动,从而在后台接收来电也接收UDP。
答案 1 :(得分:1)
苹果可能没有这样明确的文件,听起来像“背景上的UDP是不可能的”。
但事实是,官方文档声明使用其中一个界面来执行后台网络: - NSInputStream和NSOutputStream - NSURLRequest - CFReadStreamRef和CFWriteStreamRef
这就是说,我相信流概念不能包装非连接的UDP模式套接字。 http://lists.apple.com/archives/cocoa-dev/2010/Jul/msg00091.html
所以你可以理解它像苹果只允许在后台模式下打开数据“流”,而不是UDP套接字。
我实际上不知道Counterpath的Bria如何设法执行他们的UDP后台处理,但是假设他们有一些黑客在后台执行代码而不是将特殊套接字标记为“维持生存”
答案 2 :(得分:1)
从我的测试来看,iOS> = 4.3。
不可能实现UDP后台处理答案 3 :(得分:0)
这个技巧是否包括在切换到背景时播放静音?因为我认为它不再起作用了......
答案 4 :(得分:0)
对于当前版本iOS,仅允许在后台模式下具有VOIP属性的TCP套接字。
readStream = NULL; writeStream = NULL;
CFStreamCreatePairWithSocketToHost(NULL, (__bridge CFStringRef)serverIP, Port, &readStream, &writeStream);
CFReadStreamSetProperty(readStream, kCFStreamNetworkServiceType, kCFStreamNetworkServiceTypeVoIP); //VOIP property for input stream
CFWriteStreamSetProperty(writeStream, kCFStreamNetworkServiceType, kCFStreamNetworkServiceTypeVoIP);
inputStream = (__bridge NSInputStream *)readStream;
outputStream = (__bridge NSOutputStream *)writeStream;
[inputStream setDelegate:self];
[outputStream setDelegate:self];
[inputStream setProperty:NSStreamNetworkServiceTypeVoIP forKey:NSStreamNetworkServiceType] ;
[outputStream setProperty:NSStreamNetworkServiceTypeVoIP forKey:NSStreamNetworkServiceType] ;
[inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[inputStream open];
[outputStream open];
这将创建与服务器的简单tcp连接,并且套接字类型是VOIP。然后,您必须在属性列表中添加应用程序后台模式。