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
使用Xdebug调试和优化PHP程序之[1]
Apr 17 PHP
php 无限极分类
Mar 27 PHP
PHP与MySQL开发的8个技巧小结
Dec 17 PHP
php入门学习知识点一 PHP与MYSql连接与查询
Jul 14 PHP
关于php操作mysql执行数据库查询的一些常用操作汇总
Jun 24 PHP
php实现图片缩放功能类
Dec 18 PHP
PHP中foreach()用法汇总
Jul 02 PHP
Android AsyncTack 异步任务实例详解
Nov 02 PHP
Centos 6.5系统下编译安装PHP 7.0.13的方法
Dec 19 PHP
详解php用curl调用接口方法,get和post两种方式
Jan 13 PHP
ThinkPHP 5.x远程命令执行漏洞复现
Sep 23 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使用str_replace实现输入框回车替换br的方法
2014/11/24 PHP
php mongodb操作类 带几个简单的例子
2016/08/25 PHP
读jQuery之九 一些瑕疵说明
2011/06/21 Javascript
深入理解JavaScript系列(1) 编写高质量JavaScript代码的基本要点
2012/01/15 Javascript
js获取TreeView控件选中节点的Text和Value值的方法
2012/11/24 Javascript
js中创建对象的几种方式示例介绍
2014/01/26 Javascript
三种动态加载js的jquery实例代码另附去除js方法
2014/04/30 Javascript
js实现兼容IE和FF的上下层的移动
2015/05/04 Javascript
JSON字符串和对象之间的转换详解
2015/05/26 Javascript
介绍JavaScript的一个微型模版
2015/06/24 Javascript
JS数组合并push与concat区别分析
2015/12/17 Javascript
使用ionic在首页新闻中应用到的跑马灯效果的实现方法
2017/02/13 Javascript
vue2 自定义动态组件所遇到的问题
2017/06/08 Javascript
使用JS编写的随机抽取号码的小程序
2017/08/11 Javascript
Node.JS循环删除非空文件夹及子目录下的所有文件
2018/03/12 Javascript
vue中倒计时组件的实例代码
2018/07/06 Javascript
微信小程序实践之动态控制组件的显示/隐藏功能
2018/07/18 Javascript
详解key在Vue列表渲染时究竟起到了什么作用
2019/04/20 Javascript
详解VScode编辑器vue环境搭建所遇问题解决方案
2019/04/26 Javascript
基于Vue中使用节流Lodash throttle详解
2019/10/30 Javascript
Vue 解决多级动态面包屑导航的问题
2019/11/04 Javascript
vue element-ui实现动态面包屑导航
2019/12/23 Javascript
[02:02]2018DOTA2亚洲邀请赛Mineski赛前采访
2018/04/04 DOTA
[01:04:14]VP vs TNC 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/20 DOTA
Django基础知识 URL路由系统详解
2019/07/18 Python
浅谈Pytorch torch.optim优化器个性化的使用
2020/02/20 Python
Python如何把十进制数转换成ip地址
2020/05/25 Python
html5教程调用绘图api画简单的圆形代码分享
2013/12/04 HTML / CSS
中学教师实习自我鉴定
2013/09/28 职场文书
房地产项目建议书
2014/03/12 职场文书
公司门卫岗位职责
2014/03/15 职场文书
2014年音乐教师工作总结
2014/12/03 职场文书
2015年护士医德医风自我评价
2015/03/03 职场文书
女方家长婚礼致辞
2015/07/27 职场文书
为什么MySQL分页用limit会越来越慢
2021/07/25 MySQL
mysql的Buffer Pool存储及原理
2022/04/02 MySQL