美文网首页iOS即时通讯
IOS 后台执行代码(voip socket)

IOS 后台执行代码(voip socket)

作者: Levan_li | 来源:发表于2015-11-16 17:36 被阅读1659次

    如何使应用被切到后台,应用中的网络连接仍然接收数据并维持存活(像QQ iphone 一样);

    其实按 IOS官方文档一步一步做就可以实现上述功能;

    这里主要说一下我按文档遇到的问题,以及将原来的C/C++程序(主要是网络层)简单的修改一下就可以支持 IOS后台运行的方法.

    1.在 xxxx Info.plist 添加 以支持 后台运行

    UIBackgroundModes

    voip

    2.在 applicationDidEnterBackground 中设置存活回调(系统保证在600内会调用一次 //todo send keep live

    [[UIApplication sharedApplication] setKeepAliveTimeout:600 handler:^{ //todo send keep live }];

    *注:这里最少600秒否则失败

    3. 在 applicationWillEnterForeground 中取消存活回调

    [[UIApplication sharedApplication] clearKeepAliveTimeout];

    4. 创建 网络连接 ,这一步 可以按官方文档提供的三种方法全创建,并设置属性(如NSStreamNetworkServiceTypeVoIP.....)

    但这里 说一下移植原有 c/c++网络层的代码的会有两个问题:

    a>IOS并没有提到直接把一个存在的socket设置后台接收属性

    b>一般原有c/c++网络层的程序 很多会使用一个线程阻塞接收数据,而 ios里的流(NSStream) 如果阻塞read 过75秒后就超时,还不能更改这个值,而用IOS推荐的方式(Run-Loop)使用NSstream 又会改变程序结构(收到事件方式);

    下面是解决方案,关键在用CFStreamCreatePairWithSocket 在已有的socket 上创建输入输出流

    CFReadStreamRef readStream;

    CFWriteStreamRef writeStream;

    CFStreamCreatePairWithSocket(NULL, m_socket,  &readStream, &writeStream);

    miStream = (NSInputStream *)readStream;

    moStream = (NSOutputStream *)writeStream;

    if(miStream == nil)

    return gloox::ConnStreamError;

    [miStream setProperty:NSStreamNetworkServiceTypeVoIP forKey:NSStreamNetworkServiceType];

    [moStream setProperty:NSStreamNetworkServiceTypeVoIP forKey:NSStreamNetworkServiceType];

    // [miStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];

    //  [moStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];

    [miStream open];//这两句不写可能都能正常工作,我没试

    [moStream open];//这两句不写可能都能正常工作,我没试

    其实 上面的代码只做一件事,就是告诉IOS 在当前应用不在前台的时候 接管这个socket,

    其他的(原c/c++代码)都不动,该用socket recv就recv  该send就send,不用管

    miStream和mStream ,只是别忘了关闭连接的时候释放它们;

    *必须是真机 socket才会在后台运行时接收数据

    相关文章

      网友评论

      • macfai:你好,楼主,同楼上问,谢谢
      • JornyQi:后台模式使用voip,socket具体实现求指教?

      本文标题:IOS 后台执行代码(voip socket)

      本文链接:https://www.haomeiwen.com/subject/iskkhttx.html