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的错误信息
Oct 09 PHP
php in_array 函数使用说明与in_array需要注意的地方说明
Apr 13 PHP
PHP下利用header()函数设置浏览器缓存的代码
Sep 01 PHP
PHP里的中文变量说明
Jul 23 PHP
PHP5.4中json_encode中文转码的变化小结
Jan 30 PHP
PHP接收App端发送文件流的方法
Sep 23 PHP
PHP中empty,isset,is_null用法和区别
Feb 19 PHP
PHP基于自定义类随机生成姓名的方法示例
Aug 05 PHP
php mysql PDO 查询操作的实例详解
Sep 23 PHP
网站被恶意镜像怎么办 php一段代码轻松搞定(全面版)
Oct 23 PHP
php简单计算权重的方法示例【适合抽奖类应用】
Jun 10 PHP
PHP数组基本用法与知识点总结
Jun 02 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
Yii2框架制作RESTful风格的API快速入门教程
2016/11/08 PHP
基于 Swoole 的微信扫码登录功能实现代码
2018/01/15 PHP
Swoole 5将移除自动添加Event::wait()特性详解
2019/07/10 PHP
laravel框架 laravel-admin上传图片到oss的方法
2019/10/13 PHP
关于Yii2框架跑脚本时内存泄漏问题的分析与解决
2019/12/01 PHP
PHP的图像处理实例小结【文字水印、图片水印、压缩图像等】
2019/12/20 PHP
学习从实践开始之jQuery插件开发 菜单插件开发
2012/05/03 Javascript
javascript实现日历控件(年月日关闭按钮)
2012/12/12 Javascript
javascript实现删除前弹出确认框
2015/06/04 Javascript
JavaScript 浏览器兼容性总结及常用浏览器兼容性分析
2016/03/30 Javascript
JavaScript编写页面半透明遮罩效果的简单示例
2016/05/09 Javascript
JS动态给对象添加属性和值的实现方法
2016/10/21 Javascript
老生常谈原生JS执行环境与作用域
2016/11/22 Javascript
Bootstrap源码解读表单(2)
2016/12/22 Javascript
详解plotly.js 绘图库入门使用教程
2018/02/23 Javascript
node.js爬取中关村的在线电瓶车信息
2018/11/13 Javascript
详解Vue基于vue-quill-editor富文本编辑器使用心得
2019/01/03 Javascript
JS实现倒序输出的几种常用方法示例
2019/04/13 Javascript
详解微信小程序图片地扯转base64解决方案
2019/08/18 Javascript
[05:49]2014DOTA2TI4正赛第二日综述 昔日冠军纷纷落马 VG LGD占尽先机
2014/07/20 DOTA
探究数组排序提升Python程序的循环的运行效率的原因
2015/04/01 Python
从Python程序中访问Java类的简单示例
2015/04/20 Python
恢复百度云盘本地误删的文件脚本(简单方法)
2017/10/21 Python
Python实现的用户登录系统功能示例
2018/02/05 Python
Python3 log10()函数简单用法
2019/02/19 Python
Python字典的基本用法实例分析【创建、增加、获取、修改、删除】
2019/03/05 Python
python命令行参数用法实例分析
2019/06/25 Python
Python reversed反转序列并生成可迭代对象
2020/10/22 Python
CSS3中Transition动画属性用法详解
2016/07/04 HTML / CSS
一道SQL面试题
2012/12/31 面试题
实习心得体会
2014/01/02 职场文书
社区文艺活动方案
2014/08/19 职场文书
汇报材料怎么写
2014/12/30 职场文书
业务员岗位职责
2015/02/03 职场文书
《我的伯父鲁迅先生》教学反思
2016/02/16 职场文书
vue代码分块和懒加载非必要资源文件
2022/04/11 Vue.js