Procházet zdrojové kódy

feat: H5/cocos游戏防封禁能力迁移 (#47)

huangdong před 5 měsíci
rodič
revize
decabd51f4

+ 6 - 8
app/src/main/java/com/adealink/weparty/cocosgame/viewmodel/BaseCocosWebGameViewModel.kt

@@ -18,6 +18,7 @@ import com.adealink.frame.mvvm.livedata.ExtMutableLiveData
 import com.adealink.frame.mvvm.livedata.OnceMutableLiveData
 import com.adealink.frame.mvvm.viewmodel.BaseViewModel
 import com.adealink.frame.util.AppUtil
+import com.adealink.frame.util.getHost
 import com.adealink.frame.util.getLocationInWindow
 import com.adealink.frame.util.runOnUiThread
 import com.adealink.weparty.App
@@ -54,7 +55,6 @@ import com.adealink.weparty.module.room.RoomModule
 import com.adealink.weparty.module.sound.data.getGameSound
 import com.adealink.weparty.module.webview.WebModule
 import com.adealink.weparty.module.webview.listener.IWebBroadcastListener
-import com.adealink.weparty.network.getLocalHost
 import com.adealink.weparty.sound.SoundScene
 import com.adealink.weparty.sound.manager.soundManager
 import com.adealink.weparty.webview.jsbridge.data.WebBroadcastData
@@ -195,14 +195,12 @@ abstract class BaseCocosWebGameViewModel<GameType, GameMode, MagicMode, PlayerCo
                 viewSize,
                 safeArea,
                 AccountModule.token,
-                App.instance.networkService.replaceUrlHost(App.instance.networkService.baseUrl),
+                App.instance.networkService.baseUrl,
                 RoomModule.getJoinedRoomId() ?: 0,
-                wsUrl = App.instance.networkService.replaceUrlHost(
-                    when {
-                        AppBase.isProdEnv -> "wss://${getLocalHost()}/api/gamewebsocket"
-                        else -> "ws://${getLocalHost()}/api/gamewebsocket"
-                    }
-                )
+                wsUrl = when {
+                    AppBase.isProdEnv -> "wss://${getHost(App.instance.networkService.baseUrl)}/api/gamewebsocket"
+                    else -> "ws://${getHost(App.instance.networkService.baseUrl)}/api/gamewebsocket"
+                }
             )
         )
     }

+ 4 - 2
module/webview/src/main/java/com/adealink/weparty/webview/WeNextWebView.kt

@@ -8,6 +8,8 @@ import com.adealink.frame.base.fastLazy
 import com.adealink.frame.log.Log
 import com.adealink.weparty.App
 import com.adealink.weparty.cocosgame.method.OnDeeplinkJsMethod
+import com.adealink.weparty.cocosgame.method.PauseDialogManagerJSNativeMethod
+import com.adealink.weparty.cocosgame.method.ResumeDialogManagerJSNativeMethod
 import com.adealink.weparty.module.webview.listener.IWebBroadcastListener
 import com.adealink.weparty.webview.broadcast.webBroadcastManager
 import com.adealink.weparty.webview.constant.NATIVE_JS_BRIDGE
@@ -42,14 +44,13 @@ import com.adealink.weparty.webview.jsnativemethod.HideNavigationBarJSNativeMeth
 import com.adealink.weparty.webview.jsnativemethod.IsHighPotentialVibrationOpenJSNativeMethod
 import com.adealink.weparty.webview.jsnativemethod.KVStorageGetJSNativeMethod
 import com.adealink.weparty.webview.jsnativemethod.LaunchGooglePayJSNativeMethod
+import com.adealink.weparty.webview.jsnativemethod.NetworkRequestSNativeMethod
 import com.adealink.weparty.webview.jsnativemethod.OpenFullPageWebView
 import com.adealink.weparty.webview.jsnativemethod.OpenInPhoneBrowser
-import com.adealink.weparty.cocosgame.method.PauseDialogManagerJSNativeMethod
 import com.adealink.weparty.webview.jsnativemethod.PerformanceHelperJSNativeMethod
 import com.adealink.weparty.webview.jsnativemethod.PlaySoundJSNativeMethod
 import com.adealink.weparty.webview.jsnativemethod.ReportAfBackEventJSNativeMethod
 import com.adealink.weparty.webview.jsnativemethod.ReportWebInfoJSNativeMethod
-import com.adealink.weparty.cocosgame.method.ResumeDialogManagerJSNativeMethod
 import com.adealink.weparty.webview.jsnativemethod.RoomSupportAddUserDialogJSNativeMethod
 import com.adealink.weparty.webview.jsnativemethod.SaveToExcelJSNativeMethod
 import com.adealink.weparty.webview.jsnativemethod.SearchUsesJSNativeMethod
@@ -144,6 +145,7 @@ class WeNextWebView : BaseWebView, IWebBroadcastListener, DefaultLifecycleObserv
         jsBridge.addNativeMethod(ResumeDialogManagerJSNativeMethod())
         jsBridge.addNativeMethod(WebBroadcastJSNativeMethod(this))
         jsBridge.addNativeMethod(GoMiniSlotJSNativeMethod(this))
+        jsBridge.addNativeMethod(NetworkRequestSNativeMethod())
     }
 
     override fun loadUrl(urlP: String) {

+ 86 - 0
module/webview/src/main/java/com/adealink/weparty/webview/jsnativemethod/NetworkRequestSNativeMethod.kt

@@ -0,0 +1,86 @@
+package com.adealink.weparty.webview.jsnativemethod
+
+import com.adealink.frame.base.Callback
+import com.adealink.frame.log.Log
+import com.adealink.weparty.App
+import com.adealink.weparty.webview.jsbridge.callback.JSBridgeCallback
+import com.adealink.weparty.webview.jsbridge.data.JSResponse
+import com.adealink.weparty.webview.jsbridge.method.JSNativeMethod
+import com.google.gson.annotations.SerializedName
+import retrofit2.Constants
+
+data class NetworkRequestReq(
+    @SerializedName("method") val method: String?,
+    @SerializedName("path") val path: String?,
+    @SerializedName("data") val data: String?,
+    @SerializedName("headers") val headers: Map<String, String>?,
+    @SerializedName("config") val config: RequestConfig? // 请求配置
+)
+
+data class RequestConfig(
+    @SerializedName("isCore") val isCore : Boolean = false, // 是否核心请求,核心请求会上报流量、请求时间相关信息
+    @SerializedName("timeout") val timeout : Long? = null
+)
+
+enum class NetworkRequestMethod(val method: String) {
+    GET("GET"),
+    POST("POST"),
+    PUT("PUT"),
+    DELETE("DELETE");
+
+    companion object {
+        fun map(method: String?): NetworkRequestMethod {
+            return entries.firstOrNull { it.method == method } ?: POST
+        }
+    }
+}
+
+class NetworkRequestSNativeMethod: JSNativeMethod<NetworkRequestReq, String> {
+
+    companion object {
+        const val TAG = "tag_h5_network"
+    }
+
+    override val methodName: String = "onNetworkRequest"
+
+    override fun handleMethodCall(data: NetworkRequestReq, callback: JSBridgeCallback<String>?) {
+        Log.d(TAG, "request, data:${data}")
+
+        if (data.path.isNullOrEmpty()) {
+            callback?.reject(JSResponse.JSError.CLIENT_HANDLE_REQUEST_DATA_TYPE_ERROR)
+            return
+        }
+
+        val url = buildUrl(App.instance.networkService.baseUrl, data.path)
+        val headers = (data.headers?: hashMapOf()).toMutableMap()
+
+        // 核心请求
+        if(data.config?.isCore == true) {
+            headers[Constants.KEY_CORE_REQ] = Constants.CORE_REQ_VALUE
+        }
+
+        App.instance.networkService.http(
+            NetworkRequestMethod.map(data.method?.uppercase()).method,
+            url,
+            headers,
+            data.data?: "",
+            data.config?.timeout,
+            object : Callback<String> {
+
+                override fun onCall(t: String?) {
+                    if (t.isNullOrEmpty()) {
+                        Log.i(TAG, "response, url: ${url}, data is null")
+                        callback?.reject(JSResponse.JSError.CLIENT_ERROR)
+                        return
+                    }
+                    Log.i(TAG, "response, url: ${url}, SUCCESS")
+                    callback?.resolve(t)
+                }
+            })
+    }
+
+    private fun buildUrl(baseUrl: String, path: String, removePrefix: String = "api/"): String {
+        return baseUrl.trimEnd('/') + "/" + path.removePrefix(removePrefix).trimStart('/')
+    }
+
+}