如何在iOS系统下连接SIP服务器进行VoIP呼叫



我想连接SIP服务器进行SIP握手。有人能告诉我如何在iOS中实现相同的功能吗?我们应该怎么做呢?是通过TCP协议还是通过NSURLSession协议?如果你能在这方面提供一些指导,那就太有帮助了。

如何向SIP服务器发送请求或传递参数?是通过header还是XML?有什么帮助吗?

我建议您在网上可以找到的SIP SDK上构建应用程序。更喜欢使用TCP作为SIP信令消息的传输协议,因为苹果喜欢面向连接的协议。当你开始深入学习时,它会帮助你更好地理解为什么它是有意义的。

NSURLSession是执行URL请求的机制。SIP信令是一种包含会话创建和维护信息的协议报文。所以我没有看到它在SIP中有任何特殊的用途。

正如Rajesh在他的回答中提到的,TCP(或TLS)在iOS上是强制性的,允许在后台接收数据:当你的应用程序进入后台时,它将被暂停,但系统会密切关注TCP连接,并在套接字上发生某事时唤醒你的应用程序,让你处理事件(通常是一个传入呼叫):

为了让系统唤醒你的应用程序,你必须为这样的VoIP使用配置套接字:

对于C代码,你可以这样做:
//include required
#include <CoreFoundation/CFStream.h>
#include <CFNetwork/CFSocketStream.h>
//additionnal declaration
CFReadStreamRef readStream;
CFWriteStreamRef writeStream;

//TODO: open your socket as usual
...
//Configure the socket 
CFStreamCreatePairWithSocket (kCFAllocatorDefault, socket, &readStream, &writeStream);
if (readStream != NULL)
        CFReadStreamSetProperty (readStream, kCFStreamNetworkServiceType, kCFStreamNetworkServiceTypeVoIP);
if (writeStream != NULL)
        CFWriteStreamSetProperty (writeStream, kCFStreamNetworkServiceType, kCFStreamNetworkServiceTypeVoIP);
if (CFReadStreamOpen (readStream)) {
        //CFReadStreamOpen Succeeded
}
if (CFWriteStreamOpen (writeStream)) {
        //CFWriteStreamOpen Succeeded
}
//Now, if you go to background, your app will be woken up
...

//When you close the socket
if (readStream != NULL) {
  CFReadStreamClose (readStream);
  CFRelease (readStream);
}
if (writeStream != NULL) {
  CFWriteStreamClose (writeStream);
  CFRelease (writeStream);
}

注意:你的应用程序当然必须是一个"Voice Over IP"应用程序(背景模式设置)

最新更新