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的异常处理类Exception的使用及说明
Jun 13 PHP
php Ubb代码编辑器函数代码
Jul 05 PHP
ThinkPHP中ajax使用实例教程
Aug 22 PHP
php实现把url转换迅雷thunder资源下载地址的方法
Nov 07 PHP
php实现图片缩略图的方法
Mar 29 PHP
在Thinkphp中使用ajax实现无刷新分页的方法
Oct 25 PHP
Yii2实现多域名跨域同步登录退出
Feb 04 PHP
PHP实现字符串翻转功能的方法【递归与循环算法】
Nov 03 PHP
PHP读取并输出XML文件数据的简单实现方法
Dec 22 PHP
解决laravel id非自增 模型取回为0 的问题
Oct 11 PHP
PHP框架实现WebSocket在线聊天通讯系统
Nov 21 PHP
ThinkPHP5分页paginate代码实例解析
Nov 10 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
一个可查询所有表的“通用”查询分页类
2006/10/09 PHP
利用php下载xls文件(自己动手写的)
2014/04/18 PHP
php检索或者复制远程文件的方法
2015/03/13 PHP
php简单图像创建入门实例
2015/06/10 PHP
PHP设计模式概论【概念、分类、原则等】
2020/05/01 PHP
jQuery 操作下拉列表框实现代码
2010/02/22 Javascript
jQueryPad 实用的jQuery测试工具(支持IE,chrome,FF)
2010/05/22 Javascript
使用百度地图api实现根据地址查询经纬度
2014/12/11 Javascript
Jqgrid之强大的表格插件应用
2015/12/02 Javascript
jquery悬浮提示框完整实例
2016/01/13 Javascript
js实现简单的省市县三级联动效果实例
2016/02/18 Javascript
微信小程序 textarea 组件详解及简单实例
2017/01/10 Javascript
jQuery插件echarts去掉垂直网格线用法示例
2017/03/03 Javascript
webpack+vuex+axios 跨域请求数据的示例代码
2018/03/06 Javascript
vue 强制组件重新渲染(重置)的两种方案
2019/10/29 Javascript
[03:34]2014DOTA2西雅图国际邀请赛 淘汰赛7月15日TOPPLAY
2014/07/15 DOTA
[00:35]DOTA2上海特级锦标赛 MVP.Phx战队宣传片
2016/03/04 DOTA
python处理json数据中的中文
2014/03/06 Python
Python3实现将文件归档到zip文件及从zip文件中读取数据的方法
2015/05/22 Python
Python基于回溯法子集树模板解决最佳作业调度问题示例
2017/09/08 Python
用python制作游戏外挂
2018/01/04 Python
浅谈python之新式类
2018/08/12 Python
Python实现爬取马云的微博功能示例
2019/02/16 Python
Python+pyplot绘制带文本标注的柱状图方法
2019/07/08 Python
PyPDF2读取PDF文件内容保存到本地TXT实例
2020/05/12 Python
浅谈Python程序的错误:变量未定义
2020/06/02 Python
解决keras,val_categorical_accuracy:,0.0000e+00问题
2020/07/02 Python
Python matplotlib图例放在外侧保存时显示不完整问题解决
2020/07/28 Python
CSS3字体效果的设置方法小结
2016/06/13 HTML / CSS
西班牙拥有最佳品牌的动物商店:Animalear.com
2018/01/05 全球购物
中文系师范生自荐信
2013/10/01 职场文书
材料工程专业毕业生求职信
2014/03/04 职场文书
《陈毅探母》教学反思
2014/05/01 职场文书
党员对照检查材料思想汇报
2014/09/16 职场文书
计划生育工作汇报
2014/10/28 职场文书
idea 在springboot中使用lombok插件的方法
2021/08/02 Java/Android