一个BSD的UDP Socket是否能在iOS的VoIP后台模式下工作?

3

我无法让它工作,但这并不意味着不可能。

我看到其他人说我需要使用 TCP端口,但有没有任何官方文档的指针可以最终确定呢?

5个回答

5
是的,这就是关键。
但是在iOS 4.2.1(例如),您可以在后台接收UDP而不需要任何确认。只需声明一个CFReadStream作为在applicationDidEnterBackground中监听VoIP套接字...从iOS 4.3及以上版本,该方法不再起作用。
此外,Media5使用了一个“技巧”来保持应用程序活动状态,因此还可以使用UDP在后台接收呼入电话。

请您能否详细解释一下,如何在后台接收来电的技巧? - User97693321

1

根据我的测试,使用 iOS >= 4.3 后,UDP 后台运行不再可行。


1

可能不会有来自苹果的明确文档声称“后台UDP不可行”。

但事实是,官方文档指出要使用以下接口执行后台网络: - NSInputStream和NSOutputStream - NSURLRequest - CFReadStreamRef和CFWriteStreamRef

这意味着,我认为流概念无法包装非连接UDP模式套接字。 http://lists.apple.com/archives/cocoa-dev/2010/Jul/msg00091.html

因此,您可以理解为Apple仅允许在后台模式下打开“数据流”,而不是UDP套接字。

我实际上不知道Counterpath的Bria如何执行其UDP后台处理,但假设他们有某种黑客方式在后台执行代码,而不是将特殊套接字标记为“需要保持活动状态”。


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。然后您必须在属性列表中添加应用程序后台模式。


0

这个技巧是不是包括当切换到后台时播放静音声音? 因为我认为它不再起作用了...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接