使用iOS推送通知–杰出发明–中

推送通知,也称为远程通知,是移动应用程序的一项非常有用的功能。 它们可用于向用户发送市场营销报价,通过提供个性化内容,实现聊天甚至触发一些在后台执行的操作来提高用户参与度。 真正有用的是,用户不必保持打开状态。

听起来不错,不是吗? 是的,但是有必要了解推送通知的工作原理,并学习如何正确设置推送通知以避免不必要的麻烦。

iOS 10新颖性

iOS 10除了提供短信,播放通知声音并在应用程序图标上设置徽章编号之外,还扩展了iOS推送通知功能,其中包括:

  • 媒体附件 (图像,GIF,音频,视频),
  • 使用3D Touch扩展细节视图,
  • 通知操作,允许用户立即采取措施。

在下面的示例中,有一个带有图像的iOS 10推送通知和“赞”操作按钮。

这使开发人员可以提高推送通知的质量,并从此多功能功能中获得更多收益。

服务器

推送通知以Apple Push Notification service (APN)的名义发送,定向到已注册到APN的一个或多个特定设备。 为此,我们需要设置一个服务器来收集移动设备令牌,并使用它们通过APN发送推送通知。 听起来可能很复杂,但是不用担心,有很多现成的解决方案都可以使用,甚至可以免费使用。

让我们看一下同时支持iOS和Android的最受欢迎的服务:

  • Google的Firebase云消息传递
  • 推杆
  • 混合面板

这些服务中的每一个都还提供其他功能,例如分析,A / B测试,崩溃报告,实时数据库甚至身份验证,但您不必使用其中的任何功能。

请注意,使用第三方服务有其缺点 ,例如:

  • 如果您决定切换到自己的服务器 ,则需要与您使用的服务进行通信,而不是直接与APN通信,否则您将不得不重新配置您的移动应用程序。
  • 您必须知道,数据是通过不受控制的服务器发送的,因此它可能与您有关数据保护策略有关。
  • 在达到一定限制之前 ,某些服务是免费的 ,例如,Mixpanel仅允许您免费创建最多1000个用户配置文件。 如果您的应用程序流行起来,可能会很昂贵。
  • 关闭服务后,您将有有限的时间迁移到另一个提供程序。 这种情况已经由Facebook维护的非常受欢迎的移动开发者平台Parse发生了 ,该平台已于2017年1月关闭。该项目现已开放源代码,您可以在自己的计算机上进行设置,但不能开箱即用。

火力基地

出于本文的目的,我们将使用Firebase Cloud Messaging (FCM)。 这是一个有趣的解决方案,尤其是在I / O 2016上,Google将Firebase变成了统一的移动平台,该平台已取代Google Cloud Platform成为在Android上处理推送通知的默认解决方案。 这意味着我们可以在两个平台上使用相同的服务来发送推送通知,而在Android上使用默认实现。

FCM继承了GCM的核心基础架构,但简化了客户开发。 仍支持GCM,但所有新的客户端功能仅在FCM上可用。 Firebase Cloud Messaging使用Apple Push Notification service将消息发送到您的iOS应用。

证明书

首先,我们需要生成APNs SSL CertificateAPNs Authentication Key以允许我们的通知服务器(Firebase)连接到APNs。

建议使用auth键进行配置,因为它们是将通知发送到iOS的最新方法,但是由于它们较大,因此可能会出现问题。 当我想使用Cloud Formation配置将Base64编码的身份验证密钥上载到AWS时,这发生在我身上。

要在应用程序标识符中启用推送通知服务:

  1. 登录到Apple开发人员中心。
  2. 打开证书,ID和配置文件
  3. 在左侧窗格中打开应用程序标识符: 标识符 -> 应用程序ID
  4. 查找您的应用程序标识符并编辑其服务。
  5. 启用推送通知

要在Apple Developer Center上生成APNs SSL Certificate ,请执行以下操作:

  1. 选择创建证书…以进行开发或/和生产。
  1. 注意:如果您希望推送通知在通过TestFlight分发的应用程序中起作用,则需要使用Production SSL Certificate
  2. 阅读说明, 继续 ,然后上传从钥匙串导出的证书签名请求 (CSR文件)。
  3. 下载证书并使用“完成”按钮完成该过程。

要在Apple Developer Center上生成APNs Authentication Key

  1. 在左侧窗格中,打开“ -> 全部 ”。
  2. 通过点击(+)符号来创建新密钥。
  3. 填写密钥说明 ,选择APNs密钥服务,然后继续
  4. 下载密钥,确保安全保存密钥,然后单击“完成”按钮完成该过程。

现在,我们需要将生成的密钥或证书上载到Firebase

  1. 登录到Firebase控制台,然后选择您的项目。 如果还没有,请创建一个新项目。
  2. 从左窗格中打开您的项目设置
  1. 打开云消息选项卡。
  2. iOS应用配置下,上传您的密钥或证书。
  1. 请注意,您不能同时使用APNs auth keyAPNs certificate

项目配置

设置证书后,我们可以配置Xcode项目:

  1. 打开项目设置。
  2. 打开功能选项卡。
  3. 启用推送通知
  1. 权利文件将自动创建或更新。 如果您在上一章中跳过了将推送通知服务添加到应用程序标识符的操作,则会遇到错误。

完成Xcode配置后,请确保该项目的构建没有错误。 如果遇到任何签名问题,则可能需要刷新供应配置文件,甚至重新启动Xcode。 但是,我建议使用Fastlane Match共享代码签名身份,或使用Fastlane Sigh下载或修复配置文件。 自动代码签名将为您节省很多时间。

无需重复说明如何将Firebase SDK与iOS项目集成在一起,因此只需遵循本教程即可。 您需要安装Firebase/CoreFirebase/Messaging库。

如果您有更多的构建配置来处理多个环境,则可能会发现使用存储在不同GoogleService-Info.plist文件中的不同Firebase配置有问题,因为您无法在其中使用用户定义的构建设置。 但是不用担心,您可以按照这篇出色的StackOverflow帖子来解决此问题,方法是在构建时复制适当的配置文件。

权限

请记住,您可以要求用户接收一次通知。 因此,永远不要在应用启动后立即执行此操作(尽管许多应用都这样做)。 首先在单独的屏幕上介绍用户并解释为什么要发送任何通知也是一个好主意。 您还应该让用户选择退出而不征求权限,以确保以后有机会成功完成该过程。

如果用户禁止了通知,那么您唯一可以做的就是让他知道为什么值得启用它们并指示如何进行操作(这只能从设备设置中进行)。

请注意,自iOS 10起,您应该使用UNUserNotificationCenter对象:

 if #available(iOS 10.0, *) { 
UNUserNotificationCenter.current().delegate = self

let authOptions: UNAuthorizationOptions = [.alert, .badge, .sound]
UNUserNotificationCenter.current().requestAuthorization(options: authOptions, completionHandler: { _, _ in })
} else {
let settings: UIUserNotificationSettings = UIUserNotificationSettings(types: [.alert, .badge, .sound], categories: nil)
application.registerUserNotificationSettings(settings)
}

设备令牌

APNs设备令牌使您可以将通知消息定位到应用程序的特定实例。 它很少改变,但是您不能假设它不会发生。 在以下情况下,令牌可能会更改:

  • 用户重新安装该应用
  • 用户在新设备上还原应用程序
  • 用户清除应用程序数据。

如果您手动处理推送通知,则需要自己上传和刷新设备令牌,因此您必须实现服务器逻辑来存储令牌并确定发送的令牌是否为新令牌。 如果您使用的是Firebase SDK,但尚未禁用方法切换(更改现有选择器的实现的过程),则不必这样做-Firebase会为您处理。

在手动处理设备令牌时,您需要记住设备令牌不是字符串。 需要解码的是32个字节的不透明数据。 您可以通过以下方式进行操作:

 func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) { 
let token = deviceToken.map { String(format: "%02.2hhx", $0) }.joined()
print(token)
}

测试中

测试推送通知可能会很麻烦,因为您无法在iOS模拟器上进行此操作,并且需要确保它在每个构建配置上都能正常工作。 您可以从Firebase控制台向自己发送推送通知(在左侧窗格中,依次选择GROW-> Notifications-> NEW MESSAGE),但除非已定义某些细分或主题,否则您必须定位所有用户。 FIRMessaging通知的另一种方法是提供您可以在FIRMessaging委托的FIRMessaging messaging:didReceiveRegistrationToken FIRMessaging回调中收集的FCM注册令牌。 每次刷新令牌后和每次启动应用程序时都会调用此函数。

还有一个非常有用的命令行工具,称为Houston,可让您使用单个命令将推送通知直接发送到APN:

 apn push "device-token" -c /path/to/cert.pem -m "Hello from the command line! " 

PEM (隐私增强邮件)是一种容器格式,可以包含公共证书或整个证书链,其中包括公共密钥,私有密钥和根证书。 您可以从Apple Developer Center下载.cer文件,以将这种格式转换为.pem

  1. 在“钥匙串”中打开证书(只需打开一个文件)。
  2. 右键单击证书(不是下面的密钥),然后选择“ 导出”选项。
  3. 将证书保存为.p12格式。
  4. 运行以下命令以将.p12格式转换为.pem
 openssl pkcs12 -in cert.p12 -out cert.pem -nodes -clcerts 

静默通知

iOS 7中引入了后台更新通知(通常称为静默通知),以提供一种唤醒应用程序的方法,以便它可以在后台刷新其数据。 改善用户体验并防止在用户启动应用程序时显示过时的信息非常有用。

由于静默通知旨在在后台刷新数据,因此APN将它们视为低优先级,并且如果通知总数过多,则可能会限制其传递。 限制是动态的,可以根据条件而变化,但是您每小时发送的通知不应超过几个。

为了支持后台更新通知,请确保有效负载的aps词典包含值为1content-available键。 您还需要在项目设置中启用“ 远程通知”后台模式(“功能”->“背景模式”):

iOS 11问题

iOS 11带来了许多新功能,但同时也存在一些问题。 其中之一是, 静默通知在iOS 11.0–11.0.3上不起作用,并且仅在iOS 11.1中得到修复。 由于iOS 11的高度采用,它已成为许多应用程序的主要问题。

天空才是极限

推送通知是一项非常有用的功能,它是许多应用程序的基础。 我们可以在应用程序中与通知一起使用的一系列功能会随着时间的增长而增长,因此值得与该主题保持最新。 推送通知可以以多种方式使用,因此您需要考虑如何在应用程序中使用它们,而不必进行简单的消息传递。

最初发布于 brightinventions.pl

Mateusz Klimczak着,推动事物前进@ Bright发明

电子邮件Twitter Github Stackoverflow