所以，你可能已经知道
Firebase Cloud Messaging不仅可以将邮件 发送到Android设备
还可以通过APNS (Apple推送通知服务)
将通知发送给iOS设备
它是如何做到的呢
值得解释一下
部分原因是因为它很有趣 但更重要的是
它可以让你了解出现问题后
该查找什么
让我们进一步探讨这一集的“Firecast”
因此，任何与APNS通信有关的服务
都需要两种东西
首先
需要一个证书
允许你与APNS服务器进行通信
现今，我知道你也可以使用一些
被称为APNS认证钥匙的东西，
如果你在编写自己的通信代码
这将会更方便你的工作
但是现在我将专注于证书
因为这是Firebase Cloud Messaging目前使用的
其次，你需要告诉APNS
要发送通知的设备
为此，你需要一个设备令牌
它本质上是一种仅适用于
你的应用程序的标识符
以独特的方法标识该用户的设备
所以这个设备令牌
通常是由设备从APNS请求的
然后发送到你的服务器
由于Firebase Cloud Messaging
在这里扮演服务器的角色
因此它需要证书
和设备令牌这两种东西
因此，在设置Firebase Cloud Messaging时
您首先要做的一件事就是
以p12文件的形式上传AP​​NS证书 到Firebase控制台
这样可以让FCM服务器与APNS通话
当启动应用程序时
用户的设备将从APNS请求设备令牌
然后它会将该令牌发送
到Firebase Cloud Messaging
接着Firebase Cloud Messaging
将创建并发回自己的设备令牌的副本
作为交换
因此，这时候使用APNS
FCM已拥有了设备通信所需的一切
现在你可以通过Firebase Cloud Messaging
发送请求了
就像APNS一样，需要两个东西
通过FCM发送一个通知请求 -
这是与服务进行通信的一种方法
还可以确定目标设备
首先，你需要用一个API密钥
而不是证书
可以将其视为代表你的应用程序
与FCM服务器通信所需的密码
可以从Firebase控制台获取此信息
接下来，假设你想要与单个设备通话
这将需要FCM令牌，
可以从客户端获取该令牌
然后将这两个信息
打包成你要发送到
Firebase Cloud Messaging的通知
现在Firebase将使用匹配的FCM设备令牌
查看设备的任何条目
并且会确保它与APNS令牌相符
它意识到 我可能需要
通过APNS路由这个消息来跟这个设备通话
那么Firebase会做的是 使用它所存储的证书和令牌
创建这个通知的一个新的APNS版本
然后，新通知
将被发送到APNS
而APNS将通知iOS设备
并且通知将被显示出来
太棒了
我知道 这需要很多步骤对吧
但是，如果有两件事
我想让你从这个解说中明白 便是这两件
首先，大部分的工作
都是在幕后为你做的
大多时候，你不需要知道
或关注任何一件
其次是当你开发到这儿时
这只是一个常规的APNS通知
就你的应用而言
此通知类似于
任何从Apple可能收到的通知
所以让我们停下来想想
我们的设备在这个过程中必须做的工作
1.我们必须向APNS要一个设备令牌
2. 将APNS令牌发送到FCM
3. 收回FCM设备令牌
那么得到一个APNS设备令牌
就是通过如你往常一般拨打
registerForRemoteNotifications来实现的
对于其他步骤
你不需要做任何事情来实现这一点
只要你的应用程序启用了Firebase
对于一些花哨的混写方法
我们已经替你做了大部分的工作
如果你刚刚开始使用混写方法
基本上，它是一个可以通过调用 该方法的自定义版本，
让开发人员将功能添加到
iOS中预先存在的方法的一个方式
通常是在完成后调用原始方法
现在，开发人员通常会使用这些方法
来定制作为标准iOS库的一部分
但是在我们的例子中，我们将它们用在
你可能写过的任何委托函数之上
所以在我们的混写 didRegisterForRemoteNotifications的调用中
会收到APNS令牌
并将其发送到Firebase Cloud Messaging，
以换取一个FCM设备令牌
顺便说一下 我实际上已经对你说了点谎
这个令牌实际被称为InstanceID令牌
而理论上它可以用来识别
你的设备上其他的服务
而不仅仅是Firebase Cloud Messaging
这就是为什么你会看到 它在我们的代码中由InstanceID库创建
为什么它有时在文档中
被称为注册令牌
但是为了理解FCM
我认为你最好只是把这个称为FCM设备令牌
因为它基本上就是FCM设备令牌
我也应该指出
我们也开辟了一些接收通知的方法
在这里，我们主要做的是
确保记录
有关这些通知的分析信息
这就是我们提供给你的
在“通知”面板中能看到的报告
这些通知中有30％已被打开
如果你对别人开启你的东西
感到不舒服
你可以把它关掉
你只需手动添加代码
即可完成我们正在进行的工作
而我们有文档说明
最后一个是关于混写方法的注意事项
我们不会自动调用任何引发
询问用户是否可以显示通知的
标准iOS对话框
我们知道，你可能不想调用
直到你确定你的用户
确确实实会答应
所以这个方法仍然由你来调用
这对你的应用来说是最有意义的
当然，既然现在我已经告诉你，
这只是一个不起眼的APNS通知，
而且你不需要做任何特别的事情 来使用Firebase Cloud Messaging
你可能会注意到我们文档中
要求你明确连接
Firebase Cloud Messaging
为什么要这样做呢？
因为除了能够
通过APNS与你的设备进行通信
你还可以通过Firebase Cloud Messaging进行连接
以便可以直接通过该服务接收通知
但这里有一些限制
首先
只有应用处于前台时才起作用
其次，这只适用于数据消息 -
警报消息 标记 声音 任何类似的消息都将无效
它也不适用于内容可用消息
这些都会使用APNS
事实上，在APNS空间里
我不认为你可以发送
不包含内容的静态通知
据我所知 这种类型的消息只能
通过Firebase Cloud Messaging发送才可以
所以如果你发送这种类型的通知
但你的应用程序不在前台
而且没有明确连接到FCM上
在重新连接之前 你不会收到此消息
那么你可能会问
你为什么会那么做呢？
直接通过Firebase Cloud Messaging
进行沟通确实有一些优势
确实
在将数据消息传送到目标设备方面
FCM往往更有效
另一方面 你的消息只能减少几个跳跃
这总是一件好事
而且，你的设备实际上可以
通过FCM发回上游消息
例如，让你知道该消息已被收到
但是因为它们只在前台发生
他们的例子仅限于
不必在后台接收
通知的应用
一个很好的例子 - YouTube
他们的iOS应用程序使用FCM连接
为YouTube直播活动提供室内聊天
由于这个应用程序只关心
在处于前景时获得的大量聊天消息
对于Firebase Cloud Messaging 它是一个非常好的实例
但是如果你认为你的应用
不需要这些类型的消息
我建议不要直接连接到FCM服务上
至少在完成了其余的
Firebase Cloud Messaging工作之后再用
当你尝试追踪APNS实施的问题时
这只是你所要处理的
一个额外因素
这就是我所要说的
一个被简单化的关于FCM如何在iOS设备上
工作的概括
希望这可以让你更深入地了解
幕后发生的情况
如果你觉得此视频提供了你所需的资讯 请务必订阅
我们也会在另一集的“Firecasts”上再见
非常感谢你的观看
想要观看一些更精彩的Firebase内容吗？
那么就在这里查看这些视频