iOS10推送通知开发教程


Posted in PHP onSeptember 19, 2016

虽然通知经常被过度使用,但是通知确实是一种获得用户关注和通知他们需要更新或行动的有效方式。iOS 10有了新的通知,如新消息、商业信息和时间表的变化。在本教程中,我将向你展示如何使用通知在你的iOS应用程序,并且显示iOS 10引入了新特性。开发iOS 10推送通知你需要最新版本的Xcode,Xcode 8测试版,这些目前都是可下载的,在下载页面。

你可以去Github下载本教程的整个工程。

开始

在Xcode中启用推送通知是很容易的,但你需要几个步骤。

创建一个新的工程,给它起一个唯一的Bundle Identifier.

当您已经创建了project,去Project Settings页选择Capabilities栏。打开推送通知,如下所示。

注意: 如果你是苹果的付费开发者成员,你就能看到推送通知功能这一栏。

iOS10推送通知开发教程

去Developer Account这一栏,从左侧的菜单栏中选择证书,IDs,和描述文件,然后选择App IDs在Identifiers栏中。找到已经创建的App的名称,在服务列表中选中。注意,有两个可配置状态的推送通知。

iOS10推送通知开发教程

不要关闭这个网页,你很快就会回来的。

发送通知

在本文中,我将使用Pusher发送推送通知。您还可以使用其他的解决方案如Houston。无论哪种方式,发送一个通知,你都需要一个证书。

去创建一个证书,打开Keychain Access,从证书认证菜单中选择Keychain Access -> Certificate Assistant -> Request a Certificate。

iOS10推送通知开发教程

iOS10推送通知开发教程

填写表单并单击Continue。确保你选择保存到了磁盘。

iOS10推送通知开发教程

返回到开发者账户的网页。你可以为你的App IDs生成开发(调试)证书或发布证书。

之后在选择右侧的申请,在底部,单击编辑。在推送通知部分,单击创建开发(调试)证书。

iOS10推送通知开发教程

在需要时,从Keychain,继续上传生成证书请求。

iOS10推送通知开发教程

现在你已经创建了证书,可以下载它。打开下载的文件安装它。

iOS10推送通知开发教程

下载并运行Pusher。这个程序的顶部需要填入一个推送的证书。为它位于你的钥匙链,OS X将询问是否允许Pusher访问证书。

iOS10推送通知开发教程

第二个字段需要device token,你会在下一步中得打它。

iOS10推送通知开发教程

收到通知

是时候敲代码了。收到通知的设备必须注册到苹果推送通知服务(APNS)。在应用启动的时候你要发送一个唯一的token。

打开AppDelegate.swift然后添加如下方法。

注意:该代码是基于Swift3.0。语法可能看起来不同于你之前使用过的。

func registerPushNotifications() {
 DispatchQueue.main.async {
 let settings = UIUserNotificationSettings(types: [.badge, .sound, .alert], categories: nil)
 UIApplication.shared().registerUserNotificationSettings(settings)
 }
}

我之后会解释,在这个设置中你会收到指定的通知类型。调用这个方法在应用程序启动的的文件里。

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
 registerPushNotifications()
 return true
}

此时,应用程序将自动弹出一个Alert,询问用户是否要收到该通知。

iOS10推送通知开发教程

通知必须被注册,才能发送,而是否接受通知则需要用户批准。UIApplicationDelegate方法处理响应。

func application(_ application: UIApplication, didRegister notificationSettings: UIUserNotificationSettings) {
 if notificationSettings.types != UIUserNotificationType() {
 application.registerForRemoteNotifications()
 }
}

首先检查用户授予权限,然后调用该方法注册远程通知。当请求完成后者将调用另一个代理方法。这个方法响应包含一个device token,你可以打印进行调试。在发送推送通知来识别设备需要这个device token。

iOS10推送通知开发教程

如果出现错误,调用下面的方法。

func application(_ application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: NSError) {
 print("Registration failed!")
}

注意:重要的是在应用程序启动时要调用registerUserNotificationSettings,因为用户可以改变权限的设置。同样registerForRemoteNotifications也是很重要的,因为有些场景device token可以改变那么通知将不再发送。

到目前为止,这足以让你收到一个简单的通知。

通知内容

通过不同的通知内容,有不同的方式来使一个App来收到不同类型的通知,这些通知内容包括应用程序通知用户的信息,或者用户自定义的信息。

给用户发送通知,使用JSON格式,这个格式本身包含一个字典,对应aps的key。在这第二个字典你指定载内容和key。

最常见的是:

向用户显示的通知消息。这是一个简单的字符串,或一个字典key和标题一样,正文等等。
接收到通知的声音。它可以是一个定制的声音,或一个系统的声音。
应用图标右上角的角标个数。将其设置为0,消除角标。
有效的内容。使用值1发送一个无声的通知给用户。它不会播放任何声音,或任何角标设置,但是当通知被唤醒,应用将与服务器进行沟通。

本教程的一个简单的通知内容:

{
 "aps": {
 "alert": {
 "title":"Hello! :)",
 "body":"App closed..."
 },
 "badge":1,
 "sound":"default"
 }
}

应用程序的生命周期

拷贝device token粘贴在Pusher的token部分,拷贝这个JSON对象在Pusherd的payload部分。

iOS10推送通知开发教程

试着发送第一个通知。如果设备的屏幕被锁定,它将看起来如下,但什么都不会发生,当用户点击了这个通知视图。

iOS10推送通知开发教程

接受通知,你需要添加新的方法:

private func getAlert(notification: [NSObject:AnyObject]) -> (String, String) {
 let aps = notification["aps"] as? [String:AnyObject]
 let alert = aps?["alert"] as? [String:AnyObject]
 let title = alert?["title"] as? String
 let body = alert?["body"] as? String
 return (title ?? "-", body ?? "-")
}

这将返回收到的通知标题和正文,如果结构是相同的。

func notificationReceived(notification: [NSObject:AnyObject]) {
 let viewController = window?.rootViewController
 let view = viewController as? ViewController
 view?.addNotification(
 title: getAlert(notification: notification).0,
 body: getAlert(notification: notification).1)
}

这个方法将在应用程序主要视图UITableView内添加一行(参见ViewController的完整项目代码)。

我测试了三个案例的推送通知:

当应用关闭时
如果用户打开应用程序的通知,调用didFinishLaunchingWithOptions方法更新,如下:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
 // Override point for customization after application launch.
 application.applicationIconBadgeNumber = 0; // Clear badge when app launches
 // Check if launched from notification
 if let notification = launchOptions?[UIApplicationLaunchOptionsRemoteNotificationKey] as? [String: AnyObject] {
 window?.rootViewController?.present(ViewController(), animated: true, completion: nil)
 notificationReceived(notification: notification)
 } else {
 registerPushNotifications()
 }
 return true
 }

假设用户已经看过了这个通知,那么角标就被清除了。然后,检查应用程序是从图标打开还是通过通知打开的。在第一种情况下,调用registerPushNotifications()方法然后继续之前的流程。如果应用是通过打开通知的方式运行,则调用自定义notificationReceived方法来添加行。

当应用运行在前台时
如果用户正在使用应用程序,这意味着应用程序在前台,接受通知的方法如下。在这个通知的方法中加入对tableView的处理:

func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject]) {
 notificationReceived(notification: userInfo)
}

注意:在这种情况下,通知将不会发出声音。

当应用运行在后台时
在这种情况下,我添加了一个方法来清除角标数目。通知的处理和应用程序在前台的处理是一样的。

func applicationWillEnterForeground(_ application: UIApplication) {
 application.applicationIconBadgeNumber = 0; // Clear badge when app is or resumed
}

最后,这个列表中有三行来自通知的内容。

iOS10推送通知开发教程

最后

随着iOS 10的通知,开发者有了更多比之前有趣的机会和不曾有的交互权限。我希望本教程中关于如何使用通知能帮助你更好的理解通知是如何工作的。

本文已被整理到了《iOS推送教程》,欢迎大家学习阅读。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
PHP的加密方式及原理
Jun 14 PHP
PHP Class&Object -- PHP 自排序二叉树的深入解析
Jun 25 PHP
PHP中unset,array_splice删除数组中元素的区别
Jul 28 PHP
PHP中shuffle数组值随便排序函数用法
Nov 21 PHP
PHP的Yii框架使用中的一些错误解决方法与建议
Aug 21 PHP
PHP MVC框架路由学习笔记
Mar 02 PHP
thinkPHP实现MemCache分布式缓存功能
Mar 23 PHP
Yii2.0中的COOKIE和SESSION用法
Aug 12 PHP
PHP单文件上传原理及上传函数的封装操作示例
Sep 02 PHP
Windows服务器中PHP如何安装redis扩展
Sep 27 PHP
tp5 sum某个字段相加得到总数的例子
Oct 18 PHP
PHP实现简单注册登录系统
Dec 28 PHP
PHP 中 DOMDocument保存xml时中文出现乱码问题的解决方案
Sep 19 #PHP
手把手编写PHP框架 深入了解MVC运行流程
Sep 19 #PHP
PHP 接入支付宝即时到账功能
Sep 18 #PHP
PHP 等比例缩放图片详解及实例代码
Sep 18 #PHP
php mysql 封装类实例代码
Sep 18 #PHP
thinkphp自带验证码全面解析
Sep 18 #PHP
php操纵mysqli数据库的实现方法
Sep 18 #PHP
You might like
php实现的数字验证码及数字运算验证码
2015/07/30 PHP
深入研究PHP中的preg_replace和代码执行
2018/08/15 PHP
XHTML下,JS浮动代码失效的问题
2009/11/12 Javascript
vs2003 js文件编码问题的解决方法
2010/03/20 Javascript
jQuery动画效果animate和scrollTop结合使用实例
2014/04/02 Javascript
Jquery实现Div上下移动示例
2014/04/23 Javascript
jQuery链使用指南
2015/01/20 Javascript
Node.js Addons翻译(C/C++扩展)
2016/06/12 Javascript
jQuery easyui刷新当前tabs的方法
2016/09/23 Javascript
Javascript中return的使用与闭包详解
2017/01/11 Javascript
基于jQuery实现弹幕APP
2017/02/10 Javascript
Vue-router 切换组件页面时进入进出动画方法
2018/09/01 Javascript
jquery判断滚动条距离顶部的距离方法
2018/09/05 jQuery
vue ssr 实现方式(学习笔记)
2019/01/18 Javascript
js中的reduce()函数讲解
2019/01/18 Javascript
vue柱状进度条图像的完美实现方案
2019/08/26 Javascript
Vue.js组件使用props传递数据的方法
2019/10/19 Javascript
js实现抽奖的两种方法
2020/03/19 Javascript
el-table树形表格表单验证(列表生成序号)
2020/05/31 Javascript
JavaScript实现拖动对话框效果的实现代码
2020/10/12 Javascript
[42:06]2019国际邀请赛全明星赛 8.23
2019/09/05 DOTA
python 实现一个反向单位矩阵示例
2019/11/29 Python
使用pyhon绘图比较两个手机屏幕大小(实例代码)
2020/01/03 Python
Python socket连接中的粘包、精确传输问题实例分析
2020/03/24 Python
Python ArgumentParse的subparser用法说明
2020/04/20 Python
css背景图片的背景裁切、背景透明度、背景变换等效果运用
2012/12/24 HTML / CSS
css3实现可拖动的魔方3d效果
2019/05/07 HTML / CSS
美国最好的钓鱼、狩猎和划船装备商店:Bass Pro Shops
2018/12/02 全球购物
C语言笔试题
2014/09/04 面试题
如何获得EntityManager
2014/02/09 面试题
超市重阳节活动方案
2014/02/10 职场文书
心理健康课教学反思
2014/02/13 职场文书
《大作家的小老师》教学反思
2014/04/16 职场文书
大学毕业生求职自荐书
2014/06/05 职场文书
企业读书活动总结
2014/06/30 职场文书
交通违章检讨书
2014/09/21 职场文书