我想连接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"应用程序(背景模式设置)