实现原理
服务端推送消息----》苹果ANPs-----》苹果设备
实现逻辑
1 当前应用上传deviceToken 给本地服务器
2 本地服务器 苹果ANPs发送消息 做推送
如果直接用自己的服务器做推送,当客户端没有登录,手机app没有连接服务器情况下,则是没有办法推送的
苹果APNs 推送,手机app 有否登录,或是有否打开app,都可以直接做推送
客户端设置
一 注册当前app推送(告诉苹果老子的app是可以接受推送的)
// 注册远程通知服务(第一次注册服务的时候会弹出提醒框,让用户授权)
[application registerForRemoteNotificationTypes:UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert];
二 获取deviceToken发送给本地服务器
1 DeviceToken内标识了 uuid + appid(bundleId)因为服务器可以根据它准确推送给 某个手机的 某个应用
2 不是每个app 都可以接收推送消息的,需要先在电脑上配置推送证书,这样方法才会调用获取deviceToken
配置推送证书如下 1
1 苹果开发者 生成developer cer证书(平时开发用),distribution cer证书 (上线发布用)
生成证书需要标识到 哪个电脑+哪个个手机+哪个应用 所以需要上传 appid +uuid +电脑证书 来获取推送证书
3 将deviceToken 发送给服务器
调用本地服务器接口,传递当前设备deviceToken,以便服务器保存
服务器需要建立本地数据库,记录所有用户 uid <==> imid <==> deviceToken,以便日后群发推送消息,im消息推消息
三:实操 点击推送跳转制定界面
情况1 当前应用没有打开/进程被杀死时(都尼玛没打开应用啥方法也不会调用的,只能重新打开应用,肯定走didFinishLunch)
1 程序开启,调用didFinishLunch方法,获取字典信息,通过remoteNotificationKey获取字典消息,
2 判断字典消息是否有值,如果有则当前操作为,当进程杀死,点击推送信息界面进入的应用。
3 根据解析的字典userInfo信息,调到相关的制定界面
2 当进程没有退出,而是在后台挂起.
1 则会调用 didReviceRemoteNotification:(NSDictionary)*userInfo
2 解析userInfo信息 跳转到相关指定界面
四 :模拟本地服务器 发消息给苹果APNs
服务器 需要传递苹果
1 deviceToken
2 消息体(推送的啥消息 格式标准 {apns:****})
3 推送证书(前端给的)
苹果规定,后台发送消息的格式
以json方式发送 上面的apns部分json 不能改变 ,下面的userInfo自定义 ,注意budgeVule 为1 app红色下标为1
JPush 介绍
juspush集成步骤
1 注册帐号,创建应用
2 填写iOS App的必要信息
3 iOS开发证书和iOS生产证书必须是p12格式的交换证书
4 JPush会自动记录和管理所有安装过此app的设备deviceToken
关于badge问题 下标红色提示
程序运行在前台
原则上,应用在收到推送消息时,badge的值是由后台来控制的,但是,目前的大多数公司后端都不会实现这一功能。幸运的是,JPush服务器已经帮我们做了。
我们在JPush后台发布消息时,在可选设置中,设置badge的值为:+1,就可以让app端badge的值自动加1,这样,我们在app端用代码修改badge的值的时候,都需要同时用[APService setBadge:badgeNumber]修改Push后台记录的badge值,这样下次app收到推送消息时,显示的badge才是正确的。
如果要求对于程序在前台运行时,收到的通知也做处理,这时,我们可以将收到的远程推送通知,转换为本地推送通知,同时修改badge值,就可以了。