前言
在做即时通讯实现音视频通话的时候,对方呼入,响起铃声和震动,提醒用户,对方挂断之后,铃声震动停止,普通的APNS通知,是达不到我们想要的效果,所以需要一种可以用通知就唤醒我们APP的技术,然后使用我们自己的代码进行本地通知,控制通知的出现和消失,苹果的解决方案就是VOIP,PushKit推送。
1、VOIP 配置
PushKit区别与普通APNs的地方是,它不会弹出通知,而是直接唤醒你的APP,进入回调,也就是说,可以在没点击APP启动的情况下,就运行我们自己写的代码,当然,推送证书和注册、回调的方法也和APNs不同。
首先配置VOIP证书:
和注册普通的证书方法相同,我们只要类型选择VoIP Services Certificate注册就好,VoIP的证书只用配置一个即可,不需要与APNs一样配置两个,所以不必纠结。
和APNs一样,需要在Project-> Capabilities里打开推送开关和设置后台,但是需要注意的是,xcode9以上Background Modes里面取消了勾选voip的选项,结果导致pushkit注册不成功,xcode8才会有专门的VoIP选项也需要打开,这里xcode8就不多说了。
所以我需要手动在info.plist 文件加上 : App provides Voice over IP services
2、注册PushKit
导入 #import <PushKit/PushKit.h>
然后在 application: didFinishLaunchingWithOptions 方法里注册 PushKit 如下:
- (void)setupPushKit
{
PKPushRegistry *registry = [[PKPushRegistry alloc] initWithQueue:dispatch_get_main_queue()];
registry.delegate = self;
NSSet *set = [NSSet setWithObject:PKPushTypeVoIP];
registry.desiredPushTypes = set;
}
#pragma mark - PKPushRegistryDelegate
- (void)pushRegistry:(PKPushRegistry *)registry didUpdatePushCredentials:(PKPushCredentials *)pushCredentials forType:(PKPushType)type
{
/// 申请token更新后回调
if (pushCredentials.token.length > 0) {
NSData *token = pushCredentials.token;
DeLog(@"注册成功:%@", token);
}
}
- (void)pushRegistry:(PKPushRegistry *)registry didReceiveIncomingPushWithPayload:(PKPushPayload *)payload forType:(PKPushType)type NS_DEPRECATED_IOS(8_0, 11_0)
{
/// 收到推送后执行的回调
}
- (void)pushRegistry:(PKPushRegistry *)registry didReceiveIncomingPushWithPayload:(PKPushPayload *)payload forType:(PKPushType)type withCompletionHandler:(void(^)(void))completion NS_AVAILABLE_IOS(11_0)
{
/// 收到推送后执行的回调, 最后的block需要在逻辑处理完成后主动回调
}
- (void)pushRegistry:(PKPushRegistry *)registry didInvalidatePushTokenForType:(PKPushType)type
{
/// token 失效回调
}