侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

iOS10推送通知开发教程

苹果(mac/ios)  /  管理员 发布于 6年前   327

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

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

开始

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

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

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

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

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

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

发送通知

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

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

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

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

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

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

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

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

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

收到通知

是时候敲代码了。收到通知的设备必须注册到苹果推送通知服务(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,询问用户是否要收到该通知。

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

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

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

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

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部分。

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

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

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}

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

最后

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

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

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

您可能感兴趣的文章:

  • iOS推送之本地通知UILocalNotification
  • iOS消息远程推送通知
  • iOS中的通知机制
  • iOS10通知框架UserNotification理解与应用
  • IOS 远程通知兼容(IOS7,IOS8)实例详解
  • iOS开发系列--通知与消息机制详解
  • ios NSNotificationCenter通知的简单使用
  • IOS11新特性与兼容适配
  • 浅谈iOS11新特性:新增拖拽交互体验
  • iOS12新特性之推送通知详解


  • 上一条:
    iOS自定义提示弹出框实现类似UIAlertView的效果
    下一条:
    使用HMAC-SHA1签名方法详解
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 苹果将在iOS 18中启用“苹果账户”名称,“Apple ID”将成历史(0个评论)
    • 2023年国内最新注册苹果开发者账号之申请邓白氏编码流程步骤(0个评论)
    • 2023年国内最新注册苹果个人开发者账号及支付会员年费流程步骤(0个评论)
    • 2022年3月2号最新免费的苹果美国id账号分享-美区Apple ID共享(0个评论)
    • Objective-C的%s和%@(1个评论)
    • 近期文章
    • 智能合约Solidity学习CryptoZombie第二课:让你的僵尸猎食(0个评论)
    • 智能合约Solidity学习CryptoZombie第一课:生成一只你的僵尸(0个评论)
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2017-11
    • 2018-11
    • 2022-01
    • 2023-02
    • 2024-03
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客