我正在尝试在应用程序处于后台时在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>
有人有想法吗?
答案 0 :(得分:0)
来自苹果的文档UDP将无法在最新的iOS中运行。
答案 1 :(得分:0)
在前台,当数据可用时调用 SocketCallBack,但在后台不再调用。
应用在 iOS 的后台运行时通常不会获得 CPU 运行时间。系统是多任务处理,但后台没有可见 UI 的应用会进入睡眠状态。
后台应用只有一点运行时间,当通知到达时,需要应用进行处理,然后才能向用户显示。
如果他们支持“后台获取”,他们还会定期获得一些运行时,这允许他们在后台通过网络预获取应用程序数据,以防用户允许(有一个全局系统首选项设置和此外,它可以为每个应用程序配置)。在这种情况下,系统会告诉他们何时被允许执行此类提取。
从 iOS 13 开始,它们可以实现后台任务,这将允许应用在系统允许时执行一些后台处理(通常具有低优先级,因此它们仅在系统有空闲 CPU 时间时运行) .
应用程序可以注册后台音频,允许他们在后台运行代码以保持音频流播放,但应用程序在那里可以做的事情是有限的。
最后,系统会随意杀死不执行上述任何任务的后台应用程序,例如当它需要释放内存时,在这种情况下,应用程序很快就会获得运行时间来处理终止通知,例如在进程终止之前进行一些清理。