一、准备工作
1.1 添加依赖库
libz.tbd
libiconv.tbd
libsqlite3.tbd
libc++.tbd
libstdc++.6.tbd
libresolv.tbd
AudioToolbox.framework
UIKit.framework
QuartzCore.framework
OpenGLES.framework
MessageUI.framework
MediaPlayer.framework
CoreGraphics.framework
MobileCoreServices.framework
AddressBookUI.framework
AddressBook.framework
SystemConfiguration.framework
CFNetwork.framework
AssetsLibrary.framework
AVFoundation.framework
CoreAudio.framework
CoreMedia.framework
CoreTelephony.framework
CoreVideo.framework
Foundation.framework
CoreLocation.framework
新增:VideoToolBox.framework
新增: libxml2.2.tbd
1.2、Other Linker Flags 中增加 -ObjC
Other Linker Flags 中增加 -lxml2
1.2、将Framework Search Paths 设置为 /usr/lib/libxml2.tbd
1.2、GTMBase64.m设置为arc环境: -fro-objc-arc
1.2、Header Search Paths设置
$(SDKROOT)/usr/include/libxml2
$(SRCROOT)/liblinphone-sdk/apple-darwin/include
1.2、Library Search Paths设置
$(inherited)
$(PROJECT_DIR)/liblinphone-sdk/apple-darwin/lib
$(PROJECT_DIR)/liblinphone-sdk/apple-darwin/lib/mediastreamer/plugins
1.2、User Header Search Paths设置
$(SDKROOT)/usr/include/libxml2
1.2、Enable Bitcode 设置 NO
1.3、新建PrefixHeader.pch文件,加入#import
->Prefix Header设置为 LinphoneDemo/PrefixHeader.pch
#ifdef __OBJC__#import
#import "LinphoneManager.h"
//#import "XMPPStream+Secure.h"
#import "Utils.h"
#endif
1.4、权限设置
NSAppleMusicUsageDescriptionApp 需要您的同意,才能访问媒体资料库
NSBluetoothPeripheralUsageDescriptionApp 需要您的同意,才能访问蓝牙
NSCalendarsUsageDescriptionApp 需要您的同意,才能访问日历
NSCameraUsageDescriptionApp 需要您的同意,才能访问相机
NSContactsUsageDescriptionApp 需要您的同意,才能读取通讯录
NSHealthShareUsageDescriptionApp 需要您的同意,才能访问健康分享
NSHealthUpdateUsageDescriptionApp 需要您的同意,才能访问健康更新
NSLocationAlwaysUsageDescriptionApp 需要您的同意,才能始终访问位置
NSLocationUsageDescriptionApp 需要您的同意,才能访问位置
NSLocationWhenInUseUsageDescriptionApp 需要您的同意,才能在使用期间访问位置
NSMicrophoneUsageDescriptionApp 需要您的同意,才能访问麦克风
NSMotionUsageDescriptionApp 需要您的同意,才能访问运动与健身
NSPhotoLibraryUsageDescriptionApp 需要您的同意,才能访问相册
NSRemindersUsageDescriptionApp 需要您的同意,才能访问提醒事项
1.5、http请求设置NSAppTransportSecurityNSAllowsArbitraryLoads
1.6、后台运行 /* 打电话 下载网络数据 远程通知 接电话 */
一般的iOS程序进入后台后会被系统挂起,就会停止执行,不能执行任何操作。
•从iOS4开始,苹果增加了特性,很好的支持了语音通话功能:
•苹果支持应用可以在后台播放和录制声音;
•苹果支持网络托管,保证应用在后台时,还能保持网络连接,能接收到来电;
•应用可以设置一个超时处理,程序在后台运行时,周期性地唤醒应用,保证客户端和服务器有长连接,使网络不断开
•SDK封装了这些特性,保证了在iOS平台上,有很好的语音通话体验。开发者需要修改配置文件,这样iOS工程才能支持这些特性UIBackgroundModesaudiofetchremote-notificationvoip
二、导入Linphone SDK
2.1 将下面两个文件中的.a文件全部在Linked Frameworks and Libraries 中添加进去/Users/Admin/Desktop/GitLab/WiseUC/liblinphone-sdk/apple-darwin/lib/Users/Admin/Desktop/GitLab/WiseUC/liblinphone-sdk/apple-darwin/lib/mediastreamer/plugins
2.2查看项目是否有如下配置,有即正确,没有则自己添加上Header Search Patchs
$(SRCROOT)/liblinphone-sdk/apple-darwin/includeLibrary
Search Patchs$(inherited)$(PROJECT_DIR)/liblinphone-sdk/apple-darwin/lib$(PROJECT_DIR)/liblinphone-sdk/apple-darwin/lib/mediastreamer/plugins
/* 通知 */
NSString *const kLinphoneCoreUpdate = @"LinphoneCoreUpdate";
//显示状态
NSString *const kLinphoneDisplayStatusUpdate = @"LinphoneDisplayStatusUpdate";
//接收到信息
NSString *const kLinphoneMessageReceived = @"LinphoneMessageReceived";
//开始编辑文字
NSString *const kLinphoneTextComposeEvent = @"LinphoneTextComposeStarted";
//通话更新
NSString *const kLinphoneCallUpdate = @"LinphoneCallUpdate";
//注册更新
NSString *const kLinphoneRegistrationUpdate = @"LinphoneRegistrationUpdate";
//通讯录更新
NSString *const kLinphoneAddressBookUpdate = @"LinphoneAddressBookUpdate";
//主视图更新
NSString *const kLinphoneMainViewChange = @"LinphoneMainViewChange";
//日志更新
NSString *const kLinphoneLogsUpdate = @"LinphoneLogsUpdate";
//设置更新
NSString *const kLinphoneSettingsUpdate = @"LinphoneSettingsUpdate";
//蓝牙可用性更新
NSString *const kLinphoneBluetoothAvailabilityUpdate = @"LinphoneBluetoothAvailabilityUpdate";
//配置状态更新
NSString *const kLinphoneConfiguringStateUpdate = @"LinphoneConfiguringStateUpdate";
//全局状态更新
NSString *const kLinphoneGlobalStateUpdate = @"LinphoneGlobalStateUpdate";
//接收到通知
NSString *const kLinphoneNotifyReceived = @"LinphoneNotifyReceived";
NSString *const kLinphoneNotifyPresenceReceivedForUriOrTel = @"LinphoneNotifyPresenceReceivedForUriOrTel";
//通话加密状态改变
NSString *const kLinphoneCallEncryptionChanged = @"LinphoneCallEncryptionChanged";
//文件传输发送更新
NSString *const kLinphoneFileTransferSendUpdate = @"LinphoneFileTransferSendUpdate";
//文件传输接受更新
NSString *const kLinphoneFileTransferRecvUpdate = @"LinphoneFileTransferRecvUpdate";
/* 通话状态Enum*/
typedef enum _LinphoneCallState
{
LinphoneCallIdle, /**<通话初始化 */
LinphoneCallIncomingReceived, /**<收到来电 */
LinphoneCallOutgoingInit, /**<呼出电话初始化 */
LinphoneCallOutgoingProgress, /**<呼出电话拨号中 */
LinphoneCallOutgoingRinging, /**<呼出电话正在响铃 */
LinphoneCallOutgoingEarlyMedia, /**<早期媒体提出呼叫*/
LinphoneCallConnected, /**<通话连接成功*/
LinphoneCallStreamsRunning, /**媒体流已建立*/
LinphoneCallPausing, /**<通话暂停中 */
LinphoneCallPaused, /**< 通话暂停成功*/
LinphoneCallResuming, /**<通话被恢复*/
LinphoneCallRefered, /**通话转移*/
LinphoneCallError, /**<通话错误*/
LinphoneCallEnd, /**<通话正常结束*/
LinphoneCallPausedByRemote, /**<通话被对方暂停*/
LinphoneCallUpdatedByRemote, /**<对方请求更新通话参数 */
LinphoneCallIncomingEarlyMedia,
@required
- (void)pushRegistry:(PKPushRegistry *)registry didUpdatePushCredentials:(PKPushCredentials *)credentials forType:(PKPushType)type;更新证书
- (void)pushRegistry:(PKPushRegistry *)registry didReceiveIncomingPushWithPayload:(PKPushPayload *)payload forType:(PKPushType)type;收到推送来电
@optional
- (void)pushRegistry:(PKPushRegistry *)registry didInvalidatePushTokenForType:(PKPushType)type;推送证书无效
(LinphoneCall)
/*******************************************************************************
*call通话相关方法
******************************************************************************/
linphone_call_state_to_string(LinphoneCallState cs); 通话状态-》string
linphone_call_get_user_data(const LinphoneCall *call); 获取,检索与呼叫关联的用户指针。
linphone_call_set_user_data(LinphoneCall *call, void *ud); 设置用户数据,将一个用户指针分配给该呼叫。
linphone_call_get_core(const LinphoneCall *call);
linphone_call_get_state(const LinphoneCall *call); 获取通话状态
linphone_core_get_current_call_remote_address(LinphoneCore *lc); 获取当前调用的远程地址,如果没有当前调用,则为NULL。
(LinphoneCallLog)
/*******************************************************************************
*通话记录相关方法(在这个里边可以获取到电话的相关信息)
******************************************************************************/
linphone_call_log_get_call_id(const LinphoneCallLog *cl); 呼叫ID
linphone_call_log_get_dir(LinphoneCallLog *cl);
linphone_call_log_get_duration(LinphoneCallLog *cl); 呼叫持续时间在几秒钟内
linphone_call_log_get_from_address(LinphoneCallLog *cl); 来电地址(即来自)呼叫。
linphone_call_log_get_local_stats(const LinphoneCallLog *cl); 本地为本次计算的RTP统计信息。
linphone_call_log_get_quality(LinphoneCallLog *cl); 呼叫的整体质量指示。
linphone_call_log_get_ref_key(const LinphoneCallLog *cl); 与呼叫记录相关联的引用键字符串,如果没有关联,则返回NULL。
linphone_call_log_get_remote_address(LinphoneCallLog *cl); 呼叫的远程地址。
linphone_call_log_get_remote_stats(const LinphoneCallLog *cl); 由远程端计算的RTP统计信息
linphone_call_log_get_start_date(LinphoneCallLog *cl); 通话开始的日期
linphone_call_log_get_status(LinphoneCallLog *cl); 通话状态
linphone_call_log_get_to_address(LinphoneCallLog *cl); 呼叫的目的地址(即到)。
linphone_call_log_set_ref_key(LinphoneCallLog *cl, const char *refkey); PARAM:refkey与呼叫记录关联的参考键字符串。
linphone_call_log_video_enabled(LinphoneCallLog *cl); 表示视频是否在通话结束时启用。
linphone_call_log_to_str(LinphoneCallLog *cl); 获取描述呼叫的可读字符串。
linphone_call_log_was_conference(LinphoneCallLog *cl); 获取呼叫类型,如果是会议的呼叫,则为TRUE
/*******************************************************************************
* 参考和用户数据处理功能
******************************************************************************/
linphone_call_log_get_user_data(const LinphoneCallLog *cl); 与通话记录相关联的用户数据。
linphone_call_log_set_user_data(LinphoneCallLog *cl, void *ud); 将用户数据分配给通话记录。
linphone_call_log_ref(LinphoneCallLog *cl); 相同的LinphoneCallLog对象
linphone_call_log_unref(LinphoneCallLog *cl); 释放对通话记录的引用。
(LinphoneAddress)
/*******************************************************************************
* 地址相关方法,在打电话时会用到这个。
******************************************************************************/
LINPHONE_PUBLIC LinphoneAddress * linphone_address_new(const char *addr);
LINPHONE_PUBLIC LinphoneAddress * linphone_address_clone(const LinphoneAddress *addr);
LINPHONE_PUBLIC LinphoneAddress * linphone_address_ref(LinphoneAddress *addr);
LINPHONE_PUBLIC void linphone_address_unref(LinphoneAddress *addr);
LINPHONE_PUBLIC const char *linphone_address_get_scheme(const LinphoneAddress *u);
LINPHONE_PUBLIC const char *linphone_address_get_display_name(const LinphoneAddress* u);
LINPHONE_PUBLIC const char *linphone_address_get_username(const LinphoneAddress *u);
LINPHONE_PUBLIC const char *linphone_address_get_domain(const LinphoneAddress *u);
LINPHONE_PUBLIC int linphone_address_get_port(const LinphoneAddress *u);
LINPHONE_PUBLIC int linphone_address_set_display_name(LinphoneAddress *u, const char *display_name);
LINPHONE_PUBLIC int linphone_address_set_username(LinphoneAddress *uri, const char *username);
LINPHONE_PUBLIC int linphone_address_set_domain(LinphoneAddress *uri, const char *host);
LINPHONE_PUBLIC int linphone_address_set_port(LinphoneAddress *uri, int port);
LINPHONE_PUBLIC int linphone_address_set_transport(LinphoneAddress *uri,LinphoneTransportType type);
LINPHONE_PUBLIC void linphone_address_clean(LinphoneAddress *uri);