当前位置 主页 > 服务器问题 > Linux/apache问题 >

    iOS中的实时远程配置全纪录

    栏目:Linux/apache问题 时间:2019-10-09 16:05

    前言

    当您需要快速推出远程配置更改时该怎么办?也许你做的上次更改没有成功,你想尽快撤消它们。或者您的应用中出现了问题,您需要禁用整个功能。

    更频繁地调用fetchWithExpirationDuration:completionHandler: (具有较少的到期时间)是一种方法,但Firebase不鼓励这样做。你冒着被下架的风险。

    如果您需要使远程配置缓存无效,而不必对短暂的到期时间进行硬编码,该怎么办?而不是反复询问服务器更新,让服务器在有更改时通知您。 Firebase远程配置现在与云功能集成,因此可以在配置发布或回滚时触发执行。这意味着您可以让一个函数向您的应用发送静默推送通知,让它知道配置已更改。

    在AppDelegate中触发回调时,不会向用户显示静默推送通知。通过将选项content_available设置为true,您甚至可以在推送通知到达时让iOS在后台启动您的应用程序(或恢复它)。一个问题:如果用户手动杀死它,iOS将无法在后台启动您的应用程序。这将持续到下次重新启动(第一次解锁后)。除此之外,你没有其他问题了。

    实现

    这个过程归结为:

    将应用程序订阅到Firebase Cloud Messaging主题 创建在远程配置更改时触发的云功能 处理AppDelegate中的静音推送通知 在下次启动时使远程配置缓存无效

    如何设置Firebase云消息传递超出了本文的范围,但文档是一个很好的起点。

    1.订阅到主题

    推送通知启动并运行后,我们需要将应用订阅到主题。我们将专门用于远程配置。

    Messaging.messaging().subscribe(toTopic: "REMOTE_CONFIG") { error in
     if let error = error {
      debugPrint("Could not subscribe to Remote Config topic", error)
     }
    }

    2.创建一个云服务

    Cloud Function只是一个Node.js脚本,因此您需要在您的计算机上使用Node.js.在撰写本文时,Cloud Functions支持Node v6或Node v8,其中v6是默认值。

    获得Node.js后,首先安装Firebase CLI。

    npm install -g firebase-tools

    然后使用CLI工具进行身份验证。

    firebase login

    现在为函数创建一个文件夹,cd进入它并初始化Firebase项目。

    firebase init functions

    这将启动CLI向导。完成它,你就准备好了。

    是时候添加将向REMOTE_CONFIG通道发送静默推送通知的云功能。在新创建的项目的函数目录中,您将找到index.js。打开它并用以下内容替换内容:

    const functions = require('firebase-functions');
    const admin = require('firebase-admin');
    ​
    admin.initializeApp(functions.config().firebase);
    ​
    exports.pushConfig = functions.remoteConfig.onUpdate(versionMetadata => {
     // Create FCM payload to send data message to REMOTE_CONFIG topic.
     const payload = {
      data: {
       CONFIG_STATE: 'STALE'
      }
     };
    ​
     const options = {
      content_available: true
     };
    ​
     // Use the Admin SDK to send the ping via FCM.
     return admin
      .messaging()
      .sendToTopic('REMOTE_CONFIG', payload, options)
      .then(response => {
       console.log(response);
      
       return null;
      });
    });