我试图找到一种方法向Kotlin内部的FCM发送请求,但我找不到任何解决方案.

我在Swift 就是这么做的:

func sendPushNotification(to token: String, title: String, subtitle: String, body: String, data: [String: String] = [:]) {
        let urlString = "https://fcm.googleapis.com/fcm/send"
        let url = NSURL(string: urlString)!
        let paramString: [String : Any] = [
            "to" : token,
                                           
            "notification" : [
                "title" : title,
                "subtitle": subtitle,
                "body" : body,
                "sound": "social_notification_sound.wav"
            ],
                                          
            "data" : data
        ]

        let request = NSMutableURLRequest(url: url as URL)
        request.httpMethod = "POST"
        request.httpBody = try? JSONSerialization.data(withJSONObject:paramString, options: [.prettyPrinted])
        request.setValue("application/json", forHTTPHeaderField: "Content-Type")
        request.setValue("key={key}", forHTTPHeaderField: "Authorization")
        let task =  URLSession.shared.dataTask(with: request as URLRequest)  { (data, response, error) in
            do {
                if let jsonData = data {
                    if let jsonDataDict  = try JSONSerialization.jsonObject(with: jsonData, options: JSONSerialization.ReadingOptions.allowFragments) as? [String: AnyObject] {
                        NSLog("Received data:\n\(jsonDataDict))")
                    }
                }
            } catch let err as NSError {
                print(err.debugDescription)
            }
        }
        task.resume()
    }

我对Kotlin 很陌生,所以我不知道该怎么做.我已经安装了"Retrofit",但到目前为止,我还没有成功.我可以用FirebaseMessagingService()向我证明的token发送通知吗,title, subtitle, body & sound在Kotlin ?

如果是这样的话,这个函数会是什么样子?

提前谢谢你了.

推荐答案

我已经用OkHttp美元重写给柯特林了,请查收

import java.io.IOException
import okhttp3.Call
import okhttp3.Callback
import okhttp3.MediaType.Companion.toMediaType
import okhttp3.OkHttpClient
import okhttp3.Request
import okhttp3.RequestBody.Companion.toRequestBody
import okhttp3.Response
import org.json.JSONObject


fun sendPushNotification(token: String, title: String, subtitle: String, body: String, data: Map<String, String> = emptyMap()) {
    val url = "https://fcm.googleapis.com/fcm/send"

    val bodyJson = JSONObject()
    bodyJson.put("to", token)
    bodyJson.put("notification",
        JSONObject().also {
            it.put("title", title)
            it.put("subtitle", subtitle)
            it.put("body", body)
            it.put("sound", "social_notification_sound.wav")
        }
    )
    bodyJson.put("data", JSONObject(data))

    val request = Request.Builder()
        .url(url)
        .addHeader("Content-Type", "application/json")
        .addHeader("Authorization", "key=$key")
        .post(
            bodyJson.toString().toRequestBody("application/json; charset=utf-8".toMediaType())
        )
        .build()

    val client = OkHttpClient()

    client.newCall(request).enqueue(
        object : Callback {
            override fun onResponse(call: Call, response: Response) {
                println("Received data: ${response.body?.string()}")
            }

            override fun onFailure(call: Call, e: IOException) {
                println(e.message.toString())
            }
        }
    )
}

附注: val client = OkHttpClient()只是个例子,你不应该每次都创建它.OkHttpClient应该是共享的,当您创建单个OkHttpClient实例并将其重复用于所有HTTP调用时,它的性能最好.

Android相关问答推荐

Android模拟器:无法安装ShellCommandUnresponsiveResponse和UtpResponse异常

打开平板电脑的下载文件夹中的文件,例如使用其mimeType将Intent发送到我们的应用程序

Android开发:主题排版不适用于按钮文本

组成底部导航栏,自定义形状,周围透明

Android,从C++调用的铁 rust 库缺少符号

无法在Android Gradle中同步Chaquopy版本

如何判断堆肥是否为空?

Android studio应用判断无法打开离线数据库

使用 List 和 LazyColumn 重新组合所有项目

如何在每次显示可组合项时执行代码(并且只执行一次)

如何在 Delphi 和 Android 上避免 Indy Socket Error #13 Access denied 异常?

设置背景图片组成Column

React Native Android 应用程序在调试模式下运行良好,但当我们发布 apk 时,它会生成旧版本的应用程序

无法 HEAD 'https://jcenter.bintray.com/com/facebook/react/react-native/maven-metadata.xml'

Int 传递给 Intent 但Android工作室说我传递了一个字符串

记住或不记得derivedStateOf

为 AlertDialog 的消息文本设置自定义字体

Jetpack Compose:如何绘制这样的路径/线

如何将房间数据库导出到 .CSV

WindowManager 内的 RecyclerView 不更新