APNS与VoIP

简介: APNS与VoIP

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第28天,点击查看活动详情

APNS

一、简述APNS

APNS全称是Apple Push Notification service(苹果推送通知服务) 。是苹果工程师们的杰作。早期iOS设备CPU和内存资源有限,为节约资源,系统不允许app进程常驻后台,但是开发商需要有一个稳定的网络通道能每隔一段时间推送新的内容到用户设备,就是这个矛盾催促了apns的诞生。

二、APNS机制

apns的机制,官网上一张图,已经说明了一切~

\


apns推送机制

三、APNS的限制

能够有效收到apns推送,首先必须要确保设备处于online的状态。其次苹果只会存储发送给用户一条最新的推送,之前发送的推送会被舍弃。而且每条离线推送是有过期时间的。苹果apns服务器每天要处理至少几十亿设置上百亿条推送消息,所以偶然的一次推送不成功,就不要纠结了~

四、申请APNS推送证书


apns推送证书

如上图所示,apns推送有生产证书和发布证书两种,一般生产证书比较少会使用(前期与后台调试使用,只能直推,可真机测试)。发布证书是上线使用的,根据发布证书生成p12文件,与配置文件一起发给后台即可。

这里提一下,有使用推送功能的小伙伴,别忘了勾选上appid设置里的Push Notifications。

五、代码设置

  • 在didFinishLaunchingWithOptions方法里注册apns推送。

**

UIApplication *application = [UIApplication sharedApplication];
application.applicationIconBadgeNumber = 0;
if (IOS10) { //iOS10+
        UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
        center.delegate = self;
        [center requestAuthorizationWithOptions:(UNAuthorizationOptionBadge | UNAuthorizationOptionSound | UNAuthorizationOptionAlert) completionHandler:^(BOOL granted, NSError * _Nullable error) {
            if (!error) {
                NSLog(@"succeeded!");
            }
        }];
        [application registerForRemoteNotifications];
    } else if (IOS8_10){ //iOS8-iOS10
        UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeBadge | UIUserNotificationTypeAlert | UIUserNotificationTypeSound) categories:nil];
        [application registerUserNotificationSettings:settings];
        [application registerForRemoteNotifications];
    } else { //iOS8以下
        [application registerForRemoteNotificationTypes: UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound];
    }
  • 在didRegisterForRemoteNotificationsWithDeviceToken方法里获取apns的deviceToken。

**

// 1.获取deviceToken,并去除非法字符
    NSString *deviceTokenStr = [[deviceToken description] stringByReplacingOccurrencesOfString:@" " withString:@""];
    deviceTokenStr = [deviceTokenStr stringByReplacingOccurrencesOfString:@"<" withString:@""];
    deviceTokenStr = [deviceTokenStr stringByReplacingOccurrencesOfString:@">" withString:@""];
// 2.保存deviceToken
    NSUserDefaults *groupDefault = [[NSUserDefaults alloc] initWithSuiteName:EUCGroupDefaultsName];
    [groupDefault setValue:checkValue(deviceTokenStr) forKey:EUCDeviceTokenKey];
    [groupDefault synchronize];
  • 在didFailToRegisterForRemoteNotificationsWithError方法里清空问题deviceToken。

**

    NSUserDefaults *groupDefault = [[NSUserDefaults alloc] initWithSuiteName:EUCGroupDefaultsName];
    [groupDefault setValue:checkValue(@"") forKey:EUCDeviceTokenKey];
    [groupDefault synchronize];
  • iOS8在didRegisterUserNotificationSettings方法里注册推送。

**

[application registerForRemoteNotifications];
  • 在didReceiveRemoteNotification方法里做跳转处理,本地推送也会执行此方法。

VoIP

一、简述VoIP

VOIP全称voice-over-ip,是iOS8新引入的一种推送方式类型。它可以使用户收到一个来电时唤醒App。有了这种新推送,麻麻再也不用担心App长时间在后台被系统杀死的问题了,因为这种推送消息可以在后台唤醒App。

二、申请VoIP推送证书


voip推送证书

VoIP推送证书只有发布证书,所以调试起来是个问题。小伙伴在处理这个问题上一定要有耐心

三、xcode配置

  • xcode9之前配置主target下capabilities的Background Modes\

    VoIP配置2
  • xcode9+ 配置plist文件\

    VoIP配置1
  • Link Binary With Libraries里引入PushKit系统动态库
    \

    引入系统库

四、代码设置

  • 在didFinishLaunchingWithOptions方法里注册VoIP推送

**

    if ([UIDevice currentDevice].systemVersion.floatValue >= 8.0)
    {
        PKPushRegistry *pushRegistry = [[PKPushRegistry alloc] initWithQueue:dispatch_get_main_queue()];
        pushRegistry.delegate = self;
        pushRegistry.desiredPushTypes = [NSSet setWithObject:PKPushTypeVoIP];
    }
  • 在pushKit回调方法didUpdatePushCredentials里获取VoIP的deviceToken

**

// 1.获取deviceToken,并去除非法字符
NSString *deviceTokenStr = [[credentials.token description] stringByReplacingOccurrencesOfString:@" " withString:@""];
deviceTokenStr = [deviceTokenStr stringByReplacingOccurrencesOfString:@"<" withString:@""];
deviceTokenStr = [deviceTokenStr stringByReplacingOccurrencesOfString:@">" withString:@""];
// 2.本地保存deviceToken
NSUserDefaults *groupDefault = [[NSUserDefaults alloc] initWithSuiteName:EUCGroupDefaultsName];
[groupDefault setValue:checkValue(deviceTokenStr) forKey:EUCDeviceTokenKey];
[groupDefault synchronize];
  • 在pushKit回调方法didInvalidatePushTokenForType里清除问题deviceToken

**

NSUserDefaults *groupDefault = [[NSUserDefaults alloc] initWithSuiteName:EUCGroupDefaultsName];
[groupDefault setValue:checkValue(@"") forKey:EUCDeviceTokenKey];
    [groupDefault synchronize];
  • 在pushKit回调方法didReceiveIncomingPushWithPayload处理VoIP推送。一般做本地推送处理或者结合callKit弹出电话页面。
相关文章
|
安全 JavaScript Java
iOS使用PushKit实现VoIP
iOS使用PushKit实现VoIP
1333 0
|
Linux 测试技术 网络安全
VoIP网络电话(一):服务器搭建
前段时间有朋友按照教程搭建服务器,登录时报错“Operation is unauthorized because missing credential”,最近一直没空出来时间解决一下。
1954 0
|
SQL 关系型数据库 MySQL
IDEA自带的数据库插件,真香
最近阿粉的一个读者问阿粉,说进了一个公司,但是是外包身份进入的,而且甲方公司要求不能在电脑上装一些破解的,盗版的软件,只要发现就能扫描到并且被删除。而且还没有提供正版的软件的激活码,就问阿粉,说有没有什么类似Navicat 一样的工具,又强大,又好用的。
3778 0
IDEA自带的数据库插件,真香
java如何跳出for循环?
java跳出for循环的方法 break continue return break语句 break用于完全结束一个循环,跳出循环体。不管是哪种循环,一旦在循环体中遇到break,系统将完全结束循环,开始执行循环之后的代码。
14234 0
|
JSON Java 开发工具
Java服务端集成Google FCM推送的注意事项和实际经验
本文分享了作者在公司APP海外发布过程中,选择Google FCM进行消息推送的集成经验。文章详细解析了Java集成FCM推送的多种实现方式,包括HTTP请求和SDK集成,并指出了通知栏消息和透传消息的区别与应用场景。同时,作者还探讨了Firebase项目的创建、配置和服务端集成的注意事项,帮助读者解决文档混乱和选择困难的问题。
765 1
|
网络协议 Java Go
【Go语言专栏】Go语言中的WebSocket实时通信应用
【4月更文挑战第30天】Go语言(Golang)是Google开发的编程语言,适用于云计算、微服务等领域。本文介绍了WebSocket,一种实现浏览器与服务器全双工通信的协议,其特点是实时性、全双工和轻量级。在Go中实现WebSocket,可以使用gorilla/websocket库。示例展示了如何创建服务器端和客户端,实现消息的收发。WebSocket广泛应用于聊天、游戏、通知推送和实时数据同步等场景。学习Go语言中的WebSocket对于开发实时通信应用至关重要。
550 0
|
监控 DataX
DataX教程(09)- DataX是如何做到限速的?
DataX教程(09)- DataX是如何做到限速的?
1050 0
DataX教程(09)- DataX是如何做到限速的?
|
网络协议 安全 物联网
网络安全涨知识:基础网络攻防之DDoS攻击
网络安全涨知识:基础网络攻防之DDoS攻击
887 0
|
SQL 人工智能 DataWorks
【云栖实录】DataWorks:新一代智能湖仓一体数据开发与治理平台
在9月21日的云栖大会上,DataWorks发布了新一代智能湖仓一体数据开发与治理平台。DataWorks历经Kubernetes改造与云原生调度系统的优化,实现了资源组全面Serverless化,降低了使用成本,最高可节省40%。新推出的DataWorks Data Studio,支持多种计算引擎,提供更开放的云原生WebIDE,提升开发效率。DataWorks Copilot智能助手也得到升级,支持多种SQL方言和Python代码生成,平均提升数据开发效率35%。此外,DataWorks还推出了全方位的数据资产治理体系,涵盖业务和技术视角,助力企业实现数据智能化管理和转型。
【云栖实录】DataWorks:新一代智能湖仓一体数据开发与治理平台
|
算法 安全 数据安全/隐私保护
TLS 1.3 相比 TLS 1.2 在性能上有哪些具体的提升?
【10月更文挑战第4天】TLS 1.3 相比 TLS 1.2 在性能上有哪些具体的提升