iOS:在后台接收UDP数据时出现问题

时间:2011-06-28 06:41:29

标签: ios sockets background udp

我正在尝试在应用程序处于后台时在UDP上收到一些内容,而我不知道我在做错了什么,或者当UDP数据可用时调用了什么回调(如果有的话)。

我正在使用BSD套接字并使用以下代码设置voip标志:

CFSocketContext socketCtxt = {0, self, NULL, NULL, NULL};
CFSocketNativeHandle ffsocket = (CFSocketNativeHandle)_socket;
//CFSocketRef socket = CFSocketCreateWithNative(kCFAllocatorDefault, ffsocket, kCFSocketDataCallBack, (CFSocketCallBack)SocketCallBack, &socketCtxt);
CFSocketRef socket = CFSocketCreateWithNative(kCFAllocatorDefault, ffsocket, kCFSocketReadCallBack, (CFSocketCallBack)SocketCallBack, &socketCtxt);

CFRunLoopSourceRef source = CFSocketCreateRunLoopSource(NULL, socket, 0);
//CFRunLoopRef loop = CFRunLoopGetMain();
CFRunLoopRef loop = CFRunLoopGetCurrent();
CFRunLoopAddSource(loop, source, kCFRunLoopDefaultMode);

CFReadStreamRef readStream = NULL;

CFStreamCreatePairWithSocket(kCFAllocatorDefault, ffsocket,
                             &readStream, nil);

Boolean ret = CFReadStreamSetProperty(readStream, kCFStreamNetworkServiceType, kCFStreamNetworkServiceTypeVoIP);
NSInputStream *inputStream = (NSInputStream*)readStream;   
[inputStream setProperty:NSStreamNetworkServiceType forKey:NSStreamNetworkServiceTypeVoIP];
//[inputStream setProperty:NSStreamNetworkServiceTypeVoIP forKey:NSStreamNetworkServiceType];

[inputStream setDelegate:self];
//[inputStream scheduleInRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];
[inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];

[inputStream open];

CFReadStreamOpen(readStream);

_socket是先前创建的BSD套接字。

在前景中,当数据可用时调用SocketCallBack,但在后台不再调用。{/ p>

有人有想法吗?

2 个答案:

答案 0 :(得分:0)

来自苹果的文档UDP将无法在最新的iOS中运行。

答案 1 :(得分:0)

<块引用>

在前台,当数据可用时调用 SocketCallBack,但在后台不再调用。

应用在 iOS 的后台运行时通常不会获得 CPU 运行时间。系统是多任务处理,但后台没有可见 UI 的应用会进入睡眠状态。

后台应用只有一点运行时间,当通知到达时,需要应用进行处理,然后才能向用户显示。

如果他们支持“后台获取”,他们还会定期获得一些运行时,这允许他们在后台通过网络预获取应用程序数据,以防用户允许(有一个全局系统首选项设置和此外,它可以为每个应用程序配置)。在这种情况下,系统会告诉他们何时被允许执行此类提取。

从 iOS 13 开始,它们可以实现后台任务,这将允许应用在系统允许时执行一些后台处理(通常具有低优先级,因此它们仅在系统有空闲 CPU 时间时运行) .

应用程序可以注册后台音频,允许他们在后台运行代码以保持音频流播放,但应用程序在那里可以做的事情是有限的。

最后,系统会随意杀死不执行上述任何任务的后台应用程序,例如当它需要释放内存时,在这种情况下,应用程序很快就会获得运行时间来处理终止通知,例如在进程终止之前进行一些清理。