Возвращаемое значение вызова функции Firebase в Swift - PullRequest
0 голосов
/ 19 сентября 2019

Я пытаюсь получить доступ к токену, возвращенному функцией Firebase twilioToken с помощью Swift, как я это делал с Redux JS.Я прикрепил свой код, который использовал для JS, чтобы я мог имитировать его с помощью Swift, но не уверен, как получить доступ к result.token из вызова функции firebase.Я что-то здесь упускаю?Нужно ли получать значение из запроса https по-другому или я близок к своему текущему коду?Дайте мне знать, если мне нужно уточнить, спасибо!

Текущая ошибка на output.token равна Value of tuple type 'Void' has no member 'token'.

Попытка Swift код:

import UIKit
import MBProgressHUD
import FirebaseFunctions

class CallRoomVC: UIViewController {
    private var appDelegate: AppDelegate!
    private var userSession: UserSession = FirebaseUserSession.shared

    lazy var functions = Functions.functions()

    override func viewDidLoad() {
        super.viewDidLoad()
        appDelegate = UIApplication.shared.delegate as? AppDelegate

    }

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)

        guard let user = userSession.user else {
            fatalError("User instance must be created")
        }

        var output = functions.httpsCallable("twilioToken").call(["uid": user.id]) { (result, error) in
            if let error = error as NSError? {
                if error.domain == FunctionsErrorDomain {
                    let code = FunctionsErrorCode(rawValue: error.code)
                    let message = error.localizedDescription
                    let details = error.userInfo[FunctionsErrorDetailsKey]
                }
                // ...
                // or
                // print("Result: \(result.token)")
            }

        }
        if (output != nil) {
            print("Result: \(output.token)")
        }
    }
}

Функция Firebase:

"use strict";
const functions = require("firebase-functions");
const admin = require("firebase-admin");
// eslint-disable-next-line import/no-extraneous-dependencies
const google_cloud_logging = require("@google-cloud/logging");
const twilio = require("twilio");
const cors = require("cors")({
  origin: true
});
// eslint-disable-next-line import/no-extraneous-dependencies
admin.initializeApp(functions.config().firebase);

exports.twilioToken = functions.https.onRequest((req, res) => {
  return cors(req, res, () => {
    const token = new twilio.jwt.AccessToken(
      "xxxxxxxxxxxxxx", // Account ID
      "xxxxxxxxxxxxxx", // API Key SID
      "xxxxxxxxxxxxxx" // API Key Secret
    );
    token.identity = req.query.uid;
    token.addGrant(new twilio.jwt.AccessToken.VideoGrant());
    console.log("Sending token: ", token);
    res.status(200).send({ token: token.toJwt() });
  });
});

Код JS Redux:

function* getTokenSaga(action) {
  const token = yield call(
    rsf.functions.call,
    "twilioToken",
    {
      uid: action.uid
    },
    {
      method: "GET"
    }
  );

  yield put(retrievedToken(token.token));
}

export function* twilioRootSaga() {
  yield all([takeEvery(types.TOKEN.GET, getTokenSaga)]);
}

1 Ответ

1 голос
/ 23 сентября 2019

Twanio Developer Evangelist здесь.

Ваш вызов функции Firebase является асинхронным, так как он делает HTTP-запрос.Результат не возвращается в вашу переменную output, но он доступен в обратном вызове как объект result.Вместо этого вам нужно использовать result с чем-то вроде этого:

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)

    guard let user = userSession.user else {
        fatalError("User instance must be created")
    }

    functions.httpsCallable("twilioToken").call(["uid": user.id]) { (result, error) in
        if let error = error as NSError? {
            if error.domain == FunctionsErrorDomain {
                let code = FunctionsErrorCode(rawValue: error.code)
                let message = error.localizedDescription
                let details = error.userInfo[FunctionsErrorDetailsKey]
            }
        }
        if let token = (result?.data as? [String: Any])?["token"] as? String {
            print("Result: \(token)")
        }
    }

}

Этот пример был адаптирован из документации Firebase здесь .

Дайте мне знать, еслиэто помогает вообще.

...