【发布时间】:2015-10-08 11:59:01
【问题描述】:
我想连接 SIP 服务器进行 SIP 握手。任何人都可以帮助我如何在 iOS 中实现相同的功能。我们应该怎么做。应该通过TCP协议完成还是可以通过NSURLSession完成?
提供一些相同的指导真的很有帮助。
我们如何向 SIP 服务器发布请求或传递参数? 是通过标头还是 XML? 有什么帮助吗?
【问题讨论】:
我想连接 SIP 服务器进行 SIP 握手。任何人都可以帮助我如何在 iOS 中实现相同的功能。我们应该怎么做。应该通过TCP协议完成还是可以通过NSURLSession完成?
提供一些相同的指导真的很有帮助。
我们如何向 SIP 服务器发布请求或传递参数? 是通过标头还是 XML? 有什么帮助吗?
【问题讨论】:
我建议您在可以在网上找到的 SIP SDK 上构建您的应用程序。更喜欢使用 TCP 作为 SIP 信令消息的传输协议,因为 - Apple 喜欢面向连接的协议。随着您开始深入,它应该可以帮助您更好地理解它为什么有意义。
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);
}
注意:您的应用当然必须是“IP 语音”应用(后台模式设置)
【讨论】: