【发布时间】:2020-01-20 21:36:58
【问题描述】:
我正在尝试使用 Swift 访问从 Firebase 函数 twilioToken 返回的令牌,就像使用 Redux JS 一样。我附上了我用于 JS 的代码,所以我可以用 Swift 模仿它,但不确定如何从 firebase 函数调用中访问 result.token。我在这里错过了什么吗?我是否需要以不同的方式从 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)]);
}
【问题讨论】:
-
开始,存储
output是没用的;您的请求结果完全在call的关闭中处理。你在result对象中究竟得到了什么? -
@MichaelFourre 抱歉正在测试,我只能让它返回
nil -
@MichaelFourre 返回的令牌值是否应该出现在该结果中?因为问题可能出在其他地方
-
根据我所看到的,它应该。为了继续前进,您可能希望验证从请求到结果的每一步,以确保您的问题不会介于两者之间。如果您更新了您的问题以显示您的问题出现的确切时间,那么诊断和提供解决方案会容易得多。
-
好的,谢谢,我会反馈的。
标签: swift google-cloud-functions twilio