Firebase HTTPs可调用的iOS Swift

时间:2018-07-03 16:56:09

标签: ios swift firebase google-cloud-functions

我已经使用Firebase创建了可行的Cloud Function,并且可以使用我的浏览器运行。现在,我正在使用我的iOS Swift代码,并且已经成功安装了所有依赖项。

但是,我是iOS / Swift的新手,试图找出从Cloud Function调用URL的位置?这是Firebase提供的从iOS应用程序内调用的代码:

  functions.httpsCallable("addMessage").call(["text": "test"]) { (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 text = (result?.data as? [String: Any])?["text"] as? String {
    print(text)  // WOULD EXPECT A PRINT OF THE CALLABLE FUNCTION HERE
  }
}

这是可调用的云功能(已部署):

    exports.addMessage = functions.https.onCall((data, context) => {
const text = data.text;
return {
    firstNumber: 1,
    secondNumber: 2,
    operator: '+',
    operationResult: 1 + 2,
  };
  });

到目前为止,我在XCode控制台中看不到任何内容,希望可以调用该函数。谢谢!

4 个答案:

答案 0 :(得分:1)

听起来您可能正在使用HTTP请求Cloud Function。 HTTP callable Cloud FunctionsHTTP request Cloud Functions不同。

注意HTTP可调用云功能的签名:

exports.addMessage = functions.https.onCall((data, context) => {
  // ...
});

相对于HTTP请求云功能:

exports.date = functions.https.onRequest((req, res) => {
  // ...
});

如果您使用的是onRequest,则必须从客户端制作一个HTTP request。如果使用的是可调用函数,则只需传递函数名称和数据即可,如示例中所示。从您显示的链接来看,就像

  functions.httpsCallable("testFunction").call(["foo": "bar"]) { (result, error) in
//...
}

答案 1 :(得分:0)

我想到了这个问题。我必须更新我的Cloud Function返回键以匹配我的Swift函数。这是TypeScript代码:

exports.addMessage = functions.https.onCall((data, context) => {
const text = data.text;
console.log(text)

return {
    text: "100"
  };

答案 2 :(得分:0)

希望这行得通。确保在可调用的Cloud Function的返回部分上添加一个'text'元素,例如:

    exports.addMessage = functions.https.onCall((data, 
    context) => {
    const text = data.text;
    return {
    text: text
    firstNumber: 1,
    secondNumber: 2,
    operator: '+',
    operationResult: 1 + 2,
  };
  });

在您的代码中,您将返回未使用的变量,例如“ firstNumber”,“ secondNumber”,“ operator”和“ operationResult”,而您忘记添加重要的变量,即“文字”。

答案 3 :(得分:0)

代替(result?.data as? [String: Any])?["text"] as? String 使用result?.data

最终看起来像这样

if let text = (result?.data) {
    print(text)  // WOULD EXPECT A PRINT OF THE CALLABLE FUNCTION HERE
}