maxmikko 2013-12-11 06:08
浏览 2767

Voip后台实现过程中的问题,底层用sip的库,求支援求帮助求分析解决

公司目前在做一个voip网络电话的项目,底层的库是用的sip。我是负责写上层app的,底层的库都是封装在.a的静态库里面。我看不到底层的实现内容。
我以前有实现过在后台一直运行,但是这个项目怎么弄都弄不出来,有各种问题。由于公司的帐号是个人帐号,需要上架审核。我有以下问题,希望大家有会的能帮忙回答一下。谢谢大家。我现在是用xcode5,然后是用ios7的4s来写程序测试。
1、这个类似网络电话的app,如果需要上架的话,能实现怎么样的后台?通过在info.plist里的UIBackgroundModes那边设置voip,是可以实现无限后台(就是程序内的任何操作都不会停止)还是间歇性会挂起然后有消息(比如来电消息)时才唤醒程序?哪种方式才可以通过app的审核?

2、无限后台有可以在后台通过一直放静音文件实现,也可以通过设置地理信息在后台实现。这两种方式因为要审核的话不会通过,因为不是音乐应用和定位应用。所以只考虑voip。
voip能实现吗?
我试过这两种方法:
都在info.plist里设置了voip项的。
第一种是在applicationDidEnterBackground:里面写了以下代码。
UIApplication *app = [UIApplication sharedApplication];
        __block    UIBackgroundTaskIdentifier bgTask;
        bgTask = [app beginBackgroundTaskWithExpirationHandler:^{
            dispatch_async(dispatch_get_main_queue(), ^{
                if (bgTask != UIBackgroundTaskInvalid)
                {
                    bgTask = UIBackgroundTaskInvalid;
                }
            });
        }];
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
            dispatch_async(dispatch_get_main_queue(), ^{
                if (bgTask != UIBackgroundTaskInvalid)
                {
                    bgTask = UIBackgroundTaskInvalid;
                }
            });
        });
这种情况下,如果手机连着电脑来运行程序,程序退到后台后程序会一直运行,丝毫不停止,控制台的信息会一直打印输出。但是,当不连着电脑时,单独在手机上点开运行,程序就会在后台过了一会就挂起,当重新点开程序时和第一次打开程序一样,从头开始运行,就是没有在后台一直跑。

第二种是在applicationDidEnterBackground:里面写了以下代码。
BOOL backgroundAccpeted = [[UIApplication sharedApplication] setKeepAliveTimeout:600 handler:^{
        UIApplication *app = [UIApplication sharedApplication];
    __block    UIBackgroundTaskIdentifier bgTask;
    bgTask = [appbeginBackgroundTaskWithExpirationHandler:
              ^{
        [app endBackgroundTask:bgTask];
        bgTask = UIBackgroundTaskInvalid;
    }];
    }];

UIApplication *app = [UIApplication sharedApplication];
    __block    UIBackgroundTaskIdentifier bgTask;
    bgTask = [app beginBackgroundTaskWithExpirationHandler:
              ^{
        [app endBackgroundTask:bgTask];
        bgTask = UIBackgroundTaskInvalid;
    }];
    
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        while (1)
        {
            NSLog(@"%d",temptest);
            sleep(1);
            temptest++;
        }
    });

这种情况下,不管是手机连着电脑运行还是手机单独运行都是相同的情况。当进入后台后,前三分钟都是一直在运行的,但一旦到了三分钟之后,程序会被暂停,暂停时间大概7-10分钟,过了暂停时间程序会又自己在后台运行起来,就是接着刚刚暂停的位置继续跑,就是比如前三分钟一个int值跑到了175这样,继续在后台运行时会接着跑176.177...。然后这时候能跑1分钟,接着又暂停,7-10分钟之后又在底层自己跑起来。依次循环。不管过多久,只要点开程序就会从暂停的地方继续运行,不会像第一种情况一样整个程序从头开始运行。当程序在后台处于暂停状态时,点开后会继续跑。就是间断性,那7-10分钟暂停的话,有来电信息我是接受不到的,但是如果在那跑起来的1分钟内是可以接收到的。

以上两种方式有什么问题吗?

3、我网上查了挺多资料的了,当然可能有些重要的我没查到。
用voip后台,是需要配合TCP/IP socket来实现的。但是说实在的我看不大懂要怎么去实现这样的后台运行,因为处理tcp连接信息是在底层控制的。我看到资料说需要设置NSURL,NSStream,CFStream中的一样,所以我该怎么设置,需要在底层那边修改还是我在程序内就能自己编写?
我查了资料,是这么写的
CFReadStreamRef readStream;
CFWriteStreamRef writeStream;

//用CFStreamCreatePairWithSocket 在已有的socket 上创建输入输出流
CFStreamCreatePairWithSocket(NULL, m_socket, &readStream, &writeStream);

//设置属性kCFStreamNetworkServiceTypeVoIP
CFReadStreamSetProperty(readStream, kCFStreamNetworkServiceType, kCFStreamNetworkServiceTypeVoIP);
CFWriteStreamSetProperty(writeStream, kCFStreamNetworkServiceType, kCFStreamNetworkServiceTypeVoIP);

CFReadStreamOpen(readStream);
CFWriteStreamOpen(writeStream);
这些代码应该写在哪个地方?是底层吗?还是在程序内就可以写?

资料上说系统接管一个socket流,然后这个流上有信息过来会唤醒程序10秒。?是需要这样实现的吗?具体应该怎么实现?

底层是sip,我这边上层可以切换是udp还是tcp/ip协议,当使用udp的时候底层会在控制台有这样的输出
ortp-message-keep alive: 0
ortp-message-eXosip: Keep Alive sent on UDP!
ortp-message-eXosip: Reseting timer to 10s before waking up!
当使用tcp的时候会有这样的输出
ortp-message-keep alive: 0
ortp-message-tcp_tl_keepalive socket node:61.142.220.193:5060 , socket 21 [pos=0], connected
ortp-message-eXosip: Reseting timer to 10s before waking up!
是不是底层已经设置好了可以voip后台运行?这些信息大概会10s打印输出一次。

4、还有ios7在设置-通用-后台应用程序刷新里面有显示就是在后台可以运行的一些程序,我用上面问题2中提到的两种情况去运行后,程序不会在这里面显示出来。而一些类似于印象笔记,line,linphone这样的程序就会在这里面显示,这些程序是不是也设置了voip程序,我要如何做才能在这里面显示出来?

5、如果我用APNS可以和VOIP scoket后台一起使用吗?

其实我最想让程序能一直无限后台运行,不会暂停,又担心这样不能通过审核。
哪位知道的朋友请帮助我一下。我找了很多帖子,很多问答区,很多这样的问题都是没有人回答的,我不知道是不是知道的人太少了。当然我这个问答贴可能也没有人回答。
如果你看完了这么一大串问题,不回答也没关系,谢谢你把问题看完。
但是我还是好希望有人能给我处理的办法啊。谢谢啊。

  • 写回答

0条回答

    报告相同问题?

    悬赏问题

    • ¥15 (希望可以解决问题)ma和mb文件无法正常打开,打开后是空白,但是有正常内存占用,但可以在打开Maya应用程序后打开场景ma和mb格式。
    • ¥20 ML307A在使用AT命令连接EMQX平台的MQTT时被拒绝
    • ¥20 腾讯企业邮箱邮件可以恢复么
    • ¥15 有人知道怎么将自己的迁移策略布到edgecloudsim上使用吗?
    • ¥15 错误 LNK2001 无法解析的外部符号
    • ¥50 安装pyaudiokits失败
    • ¥15 计组这些题应该咋做呀
    • ¥60 更换迈创SOL6M4AE卡的时候,驱动要重新装才能使用,怎么解决?
    • ¥15 让node服务器有自动加载文件的功能
    • ¥15 jmeter脚本回放有的是对的有的是错的