推送通知

#推送通知:

##注意: 在 iOS8之后,需要应用注册用户通知设置, 而在 iOS10过期, 使用UNNotificationRequest 代替

* 本地通知   |    远程通知  :  都长一样的
* 可以让后台 APP 通知用户 APP 内部的事情
* 创建本地通知对象 -> 设置通知属性:启动时间 firedate,音效,内容等,还能设置重新发通知的间隔, 还能设置 APP 的图标数字,最好设置时区为默认的时区, 以防用户改时间后会出现错误, 有个 alertAction 可以设置来在锁屏界面小夏下方显示的提示 -> Application 像通知中心注册通知,即Scheduel(调度通知, 启动任务),scheduleLocalNotification: ,
* 在不需要时可以取消调度通知 cancelAllLocalNotification,
* 还能拿到安排了但是没有发出去的通知, 在调度中, 还没调度上, 即等待发出的通知
* 立即发出通知, 在后台时如果有什么想要用户立即知道的话, 就用 presentLocalNotificationNow: 会立即发送通知

##点击通知后的事件

1. APP 在后台, 并未结束: 打开后是从后台调到前台, 并且调用 APP 代理方法: didRecieveLocal...
2. App 被结束了, 点击后是重新打开 APP ,调用启动结束方法
*  其实每个情况都相当于点击图标
*  如果是后台进前台,  调用那个方法就可以判断出来, 而重新打开的话, 会在 didfinishlaunchApp 方法中传入字典, 直接打开是没有值的, 点击本地通知打开会传入通知信息, 从这里就能部署三种不同的打开状况: 直接打开 | 点击通知启动 | 点击通知进入前台

##点击通知进入应用后的跳转

* 在进入应用后判断情形, 是点击通知进来的就跳转到通知指向的详情界面, 通过设定一个 segue, 在判断时候调用这个 segue 所在控制器来跳转到这个 segue,并将通知传递过去,
* 通知还可以添加额外信息, 设置 userInfo, 用字典传递数据
* 有时候在后台到前台的时候需要看到启动图片的, 可以给通知设置属性: alertLaunchImage: 把启动图片的名字传进去, 只能是启动图片的那里

#bug: 在前台时, 通知发出应用接收到时, 也会跳转到详情页 —- 通知不管怎么样都会发出, 而且没关闭应用的话会调用 APP 代理接收到通知的方法, 这里会直接条过去, 应该加个判断,application.applicationState, 从后台进前台的话调用这个方法时是非激活的, 所以当在激活状态时就直接 return, 不做任何事

#未做

#远程推送

* 在应用在线时, 可能与应用本身的服务器建立了长连接, 这样可以直接通过服务器互发消息, 但是应用一旦关闭, 就不能与服务器进行长连接, 消息就推送不过去,
* 而苹果的 APNs 是只要设备联网就进行了长连接, 这时可以通过苹果的 APNs 对已经关闭的应用的用户推送通知,
* 而要知道推送给哪个设备, 必须知道设备的 DeviceToken, 是非苹果私有的设备唯一标示, 通过 APNs 的推送需告诉其发送的 DeviceToken, 才能正确推送到对应的设备
* 所以在用户安装应用后登录的时候, 要将用户设备的 DeviceToken 上传到服务器与帐号绑定, 在退出时解绑,解绑的具体操作是服务器的事, 不然发送到这个用户的推送有可能推送到这个设备上, 但是这个设备已经不是这个用户在使用, 这样会造成信息泄露
* *
* 生成 DeviceToken: 当我们在应用内申请获取 DeviceToken 的时候, 苹果会自动把 UDID 设备标识结合应用的 BundleID还有其他一些东西传给 APNs, 加密生成 DeviceToken 返回, 到时候我们就保存这个 Token 就可以了

####现在大多数方案才去 JPush:极光推送, 因为每次打开应用都要检查这个用户的 DeviceToken, 如果这个用户的 DeviceToken 变了, 或者每次获取到都发服务器,要服务器判断, 要马上发给服务器更新数据, 所以终端和服务器压力都很大.

##生成和上传 DeviceToken

* 一般来说在应用以打开应用就获取DeviceToken,
* 要获取 DeviceToken 需要在 apple 网站 MemberCenter 生成推送证书,需要提供几个信息: 哪个应用做推送,哪台电脑上调试推送服务,哪个设备调试推送服务
* 下载好推送证书, 下载真机调试证书, 还有电脑真机调试证书, 安装, 才可以完成这些
* 在我们第一次注册的时候会弹出提醒框
* github 上有人开源了一个服务器:PushMeBaby可以给 APNs 推送消息服务, 用它在 Mac 上搭建这个服务器, 就能完成对 APNs 的连接
* 在 losock.h 文件里有个错误, <CoreServices/../Framework...>是作者不小心留下的, 注释掉就可以了
* 推送的格式有要求,参考文档
* 在固定格式之外, 可以自定义传送信息, 只要固定的格式给对了. 额外的信息没有规定, 可以自己定
* 在点击通知进应用的判断和本地推送一样, 只是获取的 key 是 remote 的 key

##极光推送

* 下载 SDK
* 按照它说明的使用
* 将推送的调试证书和生产证书导出成.p12文件上传到极光,
* 在极光网站上可以发送推送信息
*