logo
当前页

实现 VoIP 通知

功能简介

通过 VoIP 通知,您可以在 App 上实现与运营商提供的电话功能一致的语音呼叫体验。

注意

受中国大陆政策限制,此功能仅限于中国大陆以外地区使用。

前提条件

在实现 VoIP 通知之前,请确保:

  • 已集成 ZPNs SDK 2.1.0 或以上版本 并实现离线推送,详情请参考 实现离线推送
  • 已向用户申请通知权限,并且用户同意 App 发送推送通知。
  • Xcode 工程已在 +Capability 中添加 Push Notifications。

实现流程

1
申请用于 VoIP 推送的证书

Apple developer 官网 申请用于 VoIP 推送的证书(后缀名为 .cer 证书文件),详情请参考 Apple 官方文档

2
导出 “.p12”文件

双击该证书文件,系统会把文件安装到钥匙串访问中,在如图所示位置(左侧边栏选择登录,顶部边栏选中证书),找到该证书,并导出 “.p12” 后缀的文件。

3
获取 resourceID

联系 ZEGO 技术支持配置携带 iOS VoIP 策略的 resourceID

4
添加 Background Modes Capabilities

使用 Xcode 打开工程,在 “Signing & capabilities” 页面单击 “+Capability”,并在弹窗中双击 “Background Modes”,您即可在 “Signing & capabilities” 看到 “Background Modes” 配置区域。

在 “Background Modes” 配置区域勾选 “Voice over IP”、“Background fetch” 以及 “Remote notifications”。

5
导入 PushKit 与 CallKit 库

导入 PushKit 与 CallKit 库,并在使用前声明头文件。

6
导入头文件
Untitled
#import "CallKit/CallKit.h"
#import "PushKit/PushKit.h"
1
Copied!
7
申请当前设备的 VoIP token

运行以下代码以申请 VoIP token。

Untitled
dispatch_queue_t mainQueue = dispatch_get_main_queue();
PKPushRegistry *voipRegistry = [[PKPushRegistry alloc] initWithQueue:mainQueue];
[voipRegistry setDelegate:self]; // 可以用想要收到 VoIP 代理方法的对象替换此处的 self
NSMutableSet *desiredPushTypes = [[NSMutableSet alloc] init];
[desiredPushTypes addObject:PKPushTypeVoIP];
voipRegistry.desiredPushTypes = desiredPushTypes;
1
Copied!
8
获取 VoIP token

通过 didUpdatePushCredentials 方法获取 VoIP token,并调用 setVoipToken 接口传入 ZPNs SDK 中。

Untitled
- (void)pushRegistry:(PKPushRegistry *)registry didUpdatePushCredentials: (PKPushCredentials *)credentials forType:(NSString *)type {
    NSData *voIPToken = credentials.token;
    [[ZPNs shared] setVoipToken:voIPToken isProduct:TRUE];
}
1
Copied!
注意

请根据开发环境或生产环境准确填入 isProduct 的值(打包时用 development 证书签名为开发环境,用 distribution 证书签名为生产环境),否则 ZPNs 服务器无法选择合适的推送证书向 APNs 正确发送离线推送请求。APNs 在生产环境下的到达率与延迟均好于开发环境。

9
发送及接收 VoIP 通知
  • 发送 VoIP 通知

    说明

    请联系 ZEGO 技术支持,配置带 VoIP 策略 的 resourceID。

    发起呼叫邀请 或其他需要 VoIP 通知场景中,向 ZIMPushConfig 中传入该 resourceID,即可配置本次推送为 VoIP 类型。

    Untitled
    pushConfig.resourcesID = @"联系 ZEGO 技术支持配置的 resourcesID";
    
    1
    Copied!
  • 接收到 VoIP 通知

    当收到 VoIP 通知时,App 会被唤起并触发 didReceiveIncomingPushWithPayload。请在该回调中调用 CallKit 的 reportNewIncomingCallWithUUID 接口拉起来电界面,并参考 Apple 开发者文档 编写相关逻辑,并在逻辑结束后调用 completion()

    Untitled
    - (void)pushRegistry:(PKPushRegistry *)registry didReceiveIncomingPushWithPayload:(PKPushPayload *)payload forType:(PKPushType)type withCompletionHandler:(void (^)(void))completion{
        // 请参考 https://developer.apple.com/documentation/callkit?language=objc 编写 CallKit 相关逻辑
        // 请在此处使用  reportNewIncomingCallWithUUID 拉起 CallKit 来电页面。
        completion();
    }
    
    1
    Copied!

Previous

跨应用离线推送

Next

实现静默推送