主頁 > 移動端開發 > 網路加載框架Retrofit

網路加載框架Retrofit

2021-11-01 09:30:56 移動端開發

1.Retrofit簡介

A type-safe HTTP client for Android and Java,封裝了OkHttp,也是由Square公司貢獻的一個處理網路請求的
開源專案,

github地址:https://github.com/square/retrofit

引入依賴(具體訪問github獲取最新的依賴):
implementation ‘com.squareup.retrofit2:retrofit:2.9.0’

引入Retrofit后就不用了引入OkHttp,因為Retrofit封裝了OkHttp

2.Retrofit基本使用一

在這里插入圖片描述
一、根據Http介面創建Java介面(導包的時候一定不要導錯,要導的是Retrofit的Call):

public interface HttpbinService {
    @POST
    @FormUrlEncoded
    Call<Response>post(@Field("username")String name,@Field("password")String pwd);

    @GET
    Call<Response>get(@Query("username")String name,@Query("password")String pwd);
}

3.Retrofit基本使用二

二、創建Retrofit物件,并生成介面實作類物件:

Retrofit retrofit = new Retrofit.Builder().baseUrl("https://www.httpbin.org/").build();
HttpbinService httpbinService = retrofit.create(HttpbinService.class);

三、介面實作類物件呼叫對應方法獲得回應:

retrofit2.Call<ResponseBody> call = httpbinService.post("lance", "123");
        call.enqueue(new retrofit2.Callback<ResponseBody>() {
            @Override
            public void onResponse(retrofit2.Call<ResponseBody> call, retrofit2.Response<ResponseBody> response) {
                try {
                    Log.i(TAG, "postAsync: " + response.body().string());
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

            @Override
            public void onFailure(retrofit2.Call<ResponseBody> call, Throwable t) {

            }
        });

4.Retrofit的注解

方法注解:@GET,@POST,@PUT,@DELETE,@PATH,@HEAD,@OPTIONS,@HTTP ?
標記注解:@FormUrlEncoded,@Multipart,@Streaming ?
引數注解:@Query,@QueryMap,@Body,@Field,@FieldMap,@Part,@PartMap ?
其他注解:@Path,@Header, @Headers,@Url

4.1@HTTP:

  • 作用于方法,用于發送一個自定義的HTTP請求

示例:

//介面
@HTTP(method = "POST", path = "get", hasBody = true)
Call<ResponseBody> http(@Query("username") String userName, @Query("password") String pwd);

4.2@Body:

  • 作用于方法的引數
  • 使用該注解定義的引數不可為null
  • 當你發送一個post或put請求,但是又不想作為請求引數或表單的方式發送請求時,使用該注解定義的引數可以直接傳入一個物體類,retrofit會通過convert把該物體序列化并將序列化后的結果直接作為請求體發送出去.

示例:

//介面
@POST("post")
Call<ResponseBody> postBody(@Body RequestBody body);
//實體
 @Test
    public void bodyTest() throws IOException {
        FormBody formBody = new FormBody.Builder()
                .add("a", "1").add("b", "2").build();
        Response<ResponseBody> response = httpbinService.postBody(formBody).execute();
        System.out.println(response.body().string());
    }

4.3 @Path:

  • 作用于方法的引數,用于定義Multipart請求的每個part
  • 使用該注解定義的引數,引數值可以為空,為空時,則忽略
  • 使用該注解定義的引數型別有以下3種方式可選:

如果型別是okhttp3.MultipartBody.Part,內容將被直接使用,省略part中的名稱,即 @Part MultipartBody.Part part

如果型別是RequestBody,那么該值將直接與其內容型別一起使用,
在注釋中提供part名稱(例如,@Part(“foo”)RequestBody foo),

其他物件型別將通過使用轉換器轉換為適當的格式, 在注釋中提供part名稱(例如,@Part(“foo”)Image photo),

示例:

//介面
 @POST("{id}")
    @FormUrlEncoded
    Call<ResponseBody> postInPath(@Path("id") String path, @Header("os") String os, @Field("username") String userName, @Field("password") String pwd);
//實體
    @Test
    public void pathTest() throws IOException {
//        https://www.httpbin.org/post
        Response<ResponseBody> response = httpbinService.postInPath("post", "android", "lance", "123").execute();
        System.out.println(response.body().string());
    }

4.4@Header

  • 作用于方法的引數,用于添加請求頭
  • 使用該注解定義的請求頭可以為空,當為空時,會自動忽略,當傳入一個List或array時,為拼接每個非空的item的值到請求頭中.
  • 具有相同名稱的請求頭不會相互覆寫,而是會照樣添加到請求頭中

4.5@Headers

  • 作用于方法,用于添加一個或多個請求頭
  • 具有相同名稱的請求頭不會相互覆寫,而是會照樣添加到請求頭中

示例:

//介面
 @Headers({"os:android", "version:1.0"})
    @POST("post")
    Call<ResponseBody> postWithHeaders();
//實體
@Test
    public void headersTest() throws IOException {
        Call<ResponseBody> response = httpbinService.postWithHeaders();
        System.out.println(response.execute().body().string());
    }

4.6@Url

  • 作用于方法引數
  • 用于添加請求的介面地址

示例:

//介面
  @POST
    Call<ResponseBody> postUrl(@Url String url);
//實體
@Test
    public void urlTest() throws IOException {
        Response<ResponseBody> response = httpbinService.postUrl("https://www.httpbin.org/post").execute();
        System.out.println(response.body().string());
   }
 

更多Retrofit注解知識可參考:鏈接

5.Retrofit的轉換器

在我們接到服務器的回應后,目前無論是OkHttp還是Retrofit都只能接收到String字串型別的資料,在實際開發中, 我們經常需要對字串進行決議將其轉變為一個Java Bean物件,比如服務器回應資料為JSON格式字串,那么我 們可以自己利用GSON庫完成反序列化的操作,而Retrofit提供了多個轉換器使得回應能夠完成自動的資料轉換,以 json決議為例:

添加依賴: implementation ‘com.squareup.retrofit2:converter-gson:2.9.0’

修改介面方法

 @POST("post") @FormUrlEncoded Call<JavaBean> post(@Field("username") String userName, @Field("password") String pwd);

這里測驗依舊是采用玩安卓的開放API:https://www.wanandroid.com/blog/show/2
在這里插入圖片描述

這里使用到Talend API Tester ,安裝和使用具體參考:
https://blog.csdn.net/yuanfate/article/details/108615333
https://www.cccitu.com/3391.html

我們使用Talend API Tester插件訪問玩安卓的API介面(這里POST的是我們已經注冊好的賬號),回傳的資料是json格式的:

{"data":{"admin":false,"chapterTops":[],"coinCount":2568,"collectIds":[17188,18965,20087,19623],"email":"","icon":"","id":86459,"nickname":"lanceedu","password":"","publicName":"lanceedu","token":"","type":0,"username":"lanceedu"},"errorCode":0,"errorMsg":""}

在這里插入圖片描述
這里又用到了https://www.bejson.com/jsonviewernew/來幫助我們進行json的格式的轉換:
在這里插入圖片描述

由此我們就可以按照這個格式自己創建物體類,當然自己寫java物體類還過于繁瑣,我們這個可以用到bejson網站通過json轉換為Java物體類(在轉換之前自己先寫好包名類名),生成好后點擊下載再將代碼直接匯入專案中即可:
在這里插入圖片描述
在這里插入圖片描述

代碼示例:

1.手動反序列化

public interface WanAndroidService {
//介面

    @POST("user/login")
    @FormUrlEncoded
    Call<ResponseBody> login(@Field("username") String username, @Field("password") String pwd);


}

  @Test    public void loginTest() throws IOException {
           Call<ResponseBody> call =
                   wanAndroidService.login("lanceedu", "123123");
           Response<ResponseBody> response = call.execute();
           String result = response.body().string();
           System.out.println(result);
           //手動進行資料轉換
           BaseResponse baseResponse = new Gson().fromJson(result, BaseResponse.class);
           System.out.println(baseResponse);  

運行測驗代碼后我們就能得到反序列化后的格式:
在這里插入圖片描述
2.利用轉換器反序列化
ResponseBody改為BaseResponse(物體類)

public interface WanAndroidService2 {
//介面

    @POST("user/login")
    @FormUrlEncoded
    Call<BaseResponse> login(@Field("username") String username, @Field("password") String pwd);
    }
@Test

    public void loginConvertTest() throws IOException {
        Call<BaseResponse> call = wanAndroidService2.login("lanceedu", "123123");
        Response<BaseResponse> response = call.execute();
        BaseResponse baseResponse = response.body();
        System.out.println(baseResponse);
    }

Retrofit實體化時一定要添加轉換器!

.addConverterFactory(GsonConverterFactory.create()) //添加轉換器

運行代碼后得到反序列后的資料:
在這里插入圖片描述

6.Retrofit的嵌套請求和配接器

在實際開發中,可能會存在:需要先請求A介面,再請求B介面的情況,比如需要請求獲取收藏文章串列,但是需 要先登錄拿到Cookie才能請求收藏文章串列介面,此時請求就有了先后順序,為了完成這個功能,我們需要這樣實 現代碼:
在這里插入圖片描述

Retrofit的介面方法回傳型別必須是Call,如果能夠將Call改為RxJava中的Observable,對于嵌套的情況,就能得到非 常方便優雅的解決,這就是配接器的功能,如果我們想要回傳的不是Call,配接器就能夠幫助我們轉換為其他型別, 以RxJava3為例:

添加依賴: implementation ‘com.squareup.retrofit2:adapter-rxjava3:2.9.0’

修改介面方法

@POST("post") @FormUrlEncoded Observable<JavaBean> post(@Field("username") String userName, @Field("password") String pwd);

這里我們測驗還是用到玩安卓的開放API:
在這里插入圖片描述
代碼示例(用到了cookie的知識,具體參考我之前的文章https://blog.csdn.net/Lbsssss/article/details/121057667):

public interface WanAndroidService2 {
//介面

    @POST("user/login")
    @FormUrlEncoded
    Flowable<BaseResponse> login2(@Field("username") String username, @Field("password") String pwd);


    @GET("lg/collect/list/{pageNum}/json")
    Flowable<ResponseBody> getArticle(@Path("pageNum") int pageNum);
}
//具體實作 
Map<String, List<Cookie>> cookies = new HashMap<>();

Retrofit retrofit3 = new Retrofit.Builder()
        .baseUrl("https://www.wanandroid.com/")
        .callFactory(new OkHttpClient.Builder()
                .cookieJar(new CookieJar() {
                    @Override
                    public void saveFromResponse(@NotNull HttpUrl httpUrl, @NotNull List<Cookie> list) {
                        cookies.put(httpUrl.host(), list);
                    }

                    @NotNull
                    @Override
                    public List<Cookie> loadForRequest(@NotNull HttpUrl httpUrl) {
                        List<Cookie> cookies = WanAndroidUnitTest.this.cookies.get(httpUrl.host());
                        return cookies == null ? new ArrayList<>() : cookies;
                    }
                }).build())
        .addConverterFactory(GsonConverterFactory.create()) //添加轉換器
        .addCallAdapterFactory(RxJava3CallAdapterFactory.create()) // 添加配接器
        .build();
WanAndroidService2 wanAndroidService3 = retrofit3.create(WanAndroidService2.class);

@Test
public void rxjavaTest() {
    wanAndroidService3.login2("lanceedu", "123123")
            .flatMap(new Function<BaseResponse, Publisher<ResponseBody>>() {
                @Override
                public Publisher<ResponseBody> apply(BaseResponse baseResponse) throws Throwable {
                    return wanAndroidService3.getArticle(0);
                }
            })
            .observeOn(Schedulers.io())
            .subscribeOn(Schedulers.newThread())
            .subscribe(new Consumer<ResponseBody>() {
                @Override
                public void accept(ResponseBody responseBody) throws Throwable {
                    System.out.println(responseBody.string());
                }
            });
    while (true) {
    }
}

最后能得到收藏的文章串列:
在這里插入圖片描述

7.檔案上傳與下載:

1.上傳檔案(與OkHttp類似):

//介面
@POST("post")
    @Multipart
    Call<ResponseBody> upload(@Part MultipartBody.Part file);
 @Test
    public void uploadFileTest() throws IOException {
        File file1 = new File("C:\\Users\\Administrator\\Desktop\\1.txt");
        MultipartBody.Part part = MultipartBody.Part.createFormData("file1",
                "1.txt", RequestBody.create(file1, MediaType.parse("text/plain")));

        Call<ResponseBody> call =
                uploadService.upload(part);
        System.out.println(call.execute().body().string());
    }

2.下載檔案(兩種):

//介面 兩種方式
@Streaming
    @GET
    Call<ResponseBody> download(@Url String url);

@Streaming
    @GET
    Flowable<ResponseBody> downloadRxJava(@Url String url);
@Test
    public void downloadTest() throws IOException {
        Response<ResponseBody> response = uploadService.download(
                "https://fga1.market.xiaomi.com/download/AppStore/07adf043b0b2c40371abc6c685363e83d27f3efd7/com.sdu.didi.psnger.apk")
                .execute();
//        response.isSuccessful()
        InputStream inputStream = response.body().byteStream();
        FileOutputStream fos = new FileOutputStream("C:\\Users\\劉博\\Desktop\\a.apk");
        int len;
        byte[] buffer = new byte[4096];

        while ((len = inputStream.read(buffer)) != -1) {
            fos.write(buffer, 0, len);
        }
        fos.close();
        inputStream.close();
    }

    @Test
    public void downloadRxjavaTest() {
        uploadService.downloadRxJava("https://fga1.market.xiaomi.com/download/AppStore/07adf043b0b2c40371abc6c685363e83d27f3efd7/com.sdu.didi.psnger.apk")
                .map(new Function<ResponseBody, File>() {
                    @Override
                    public File apply(ResponseBody responseBody) throws Throwable {
                        InputStream inputStream = responseBody.byteStream();
                        File file = new File("C:\\Users\\劉博\\Desktop\\a.apk");
                        FileOutputStream fos = new FileOutputStream(file);
                        int len;
                        byte[] buffer = new byte[4096];

                        while ((len = inputStream.read(buffer)) != -1) {
                            fos.write(buffer, 0, len);
                        }
                        fos.close();
                        inputStream.close();
                        return file;
                    }
                }).subscribe(new Consumer<File>() {
            @Override
            public void accept(File file) throws Throwable {

            }
        });
        while (true) {
        }
    }

運行代碼就能在指定路徑得到下載的apk了:
在這里插入圖片描述

本文demo:https://github.com/gujunhe/NetworkDemo.git

轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/343165.html

標籤:其他

上一篇:解決Vue專案在iOS 10 報錯 “Cannot declare a let variable twice: ‘r‘”

下一篇:System.Diagnostics.TraceSource不向ApplicationInsights發送資料

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【從零開始擼一個App】Dagger2

    Dagger2是一個IOC框架,一般用于Android平臺,第一次接觸的朋友,一定會被搞得暈頭轉向。它延續了Java平臺Spring框架代碼碎片化,注解滿天飛的傳統。嘗試將各處代碼片段串聯起來,理清思緒,真不是件容易的事。更不用說還有各版本細微的差別。 與Spring不同的是,Spring是通過反射 ......

    uj5u.com 2020-09-10 06:57:59 more
  • Flutter Weekly Issue 66

    新聞 Flutter 季度調研結果分享 教程 Flutter+FaaS一體化任務編排的思考與設計 詳解Dart中如何通過注解生成代碼 GitHub 用對了嗎?Flutter 團隊分享如何管理大型開源專案 插件 flutter-bubble-tab-indicator A Flutter librar ......

    uj5u.com 2020-09-10 06:58:52 more
  • Proguard 常用規則

    介紹 Proguard 入口,如何查看輸出,如何使用 keep 設定入口以及使用實體,如何配置壓縮,混淆,校驗等規則。

    ......

    uj5u.com 2020-09-10 06:59:00 more
  • Android 開發技術周報 Issue#292

    新聞 Android即將獲得類AirDrop功能:可向附近設備快速分享檔案 谷歌為安卓檔案管理應用引入可安全隱藏資料的Safe Folder功能 Android TV新主界面將顯示電影、電視節目和應用推薦內容 泄露的Android檔案暗示了傳說中的谷歌Pixel 5a與折疊屏新機 谷歌發布Andro ......

    uj5u.com 2020-09-10 07:00:37 more
  • AutoFitTextureView Error inflating class

    報錯: Binary XML file line #0: Binary XML file line #0: Error inflating class xxx.AutoFitTextureView 解決: <com.example.testy2.AutoFitTextureView android: ......

    uj5u.com 2020-09-10 07:00:41 more
  • 根據Uri,Cursor沒有獲取到對應的屬性

    Android: 背景:呼叫攝像頭,拍攝視頻,指定保存的地址,但是回傳的Cursor檔案,只有名稱和大小的屬性,沒有其他諸如時長,連ID屬性都沒有 使用 cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DURATIO ......

    uj5u.com 2020-09-10 07:00:44 more
  • Android連載29-持久化技術

    一、持久化技術 我們平時所使用的APP產生的資料,在記憶體中都是瞬時的,會隨著斷電、關機等丟失資料,因此android系統采用了持久化技術,用于存盤這些“瞬時”資料 持久化技術包括:檔案存盤、SharedPreference存盤以及資料庫存盤,還有更復雜的SD卡記憶體儲。 二、檔案存盤 最基本存盤方式, ......

    uj5u.com 2020-09-10 07:00:47 more
  • Android Camera2Video整合到自己專案里

    背景: Android專案里呼叫攝像頭拍攝視頻,原本使用的 MediaStore.ACTION_VIDEO_CAPTURE, 后來因專案需要,改成了camera2 1.Camera2Video 官方demo有點問題,下載后,不能直接整合到專案 問題1.多次拍攝視頻崩潰 問題2.雙擊record按鈕, ......

    uj5u.com 2020-09-10 07:00:50 more
  • Android 開發技術周報 Issue#293

    新聞 谷歌為Android TV開發者提供多種新功能 Android 11將自動填表功能整合到鍵盤輸入建議中 谷歌宣布Android Auto即將支持更多的導航和數字停車應用 谷歌Pixel 5只有XL版本 搭載驍龍765G且將比Pixel 4更便宜 [圖]Wear OS將迎來重磅更新:應用啟動時間 ......

    uj5u.com 2020-09-10 07:01:38 more
  • 海豚星空掃碼投屏 Android 接收端 SDK 集成 六步驟

    掃碼投屏,開放網路,獨占設備,不需要額外下載軟體,微信掃碼,發現設備。支持標準DLNA協議,支持倍速播放。視頻,音頻,圖片投屏。好點意思。還支持自定義基于 DLNA 擴展的操作動作。好像要收費,沒體驗。 這里簡單記錄一下集成程序。 一 跟目錄的build.gradle添加私有mevan倉庫 mave ......

    uj5u.com 2020-09-10 07:01:43 more
最新发布
  • 歡迎頁輪播影片

    如圖,引導開始,球從上落下,同時淡入文字,然后文字開始輪播,最后一頁時停止,點擊進入首頁。 在來看看效果圖。 重力球先不講,主要歡迎輪播簡單實作 首先新建一個類 TextTranslationXGuideView,用于影片展示 文本是類似的,最后會有個圖片箭頭影片,布局很簡單,就是一個 TextVi ......

    uj5u.com 2023-04-20 08:40:31 more
  • 【FAQ】關于華為推送服務因營銷訊息頻次管控導致服務通訊類訊息

    一. 問題描述 使用華為推送服務下發IM訊息時,下發訊息請求成功且code碼為80000000,但是手機總是收不到訊息; 在華為推送自助分析(Beta)平臺查看發現,訊息發送觸發了頻控。 二. 問題原因及背景 2023年1月05日起,華為推送服務對咨詢營銷類訊息做了單個設備每日推送數量上限管理,具體 ......

    uj5u.com 2023-04-20 08:40:11 more
  • 歡迎頁輪播影片

    如圖,引導開始,球從上落下,同時淡入文字,然后文字開始輪播,最后一頁時停止,點擊進入首頁。 在來看看效果圖。 重力球先不講,主要歡迎輪播簡單實作 首先新建一個類 TextTranslationXGuideView,用于影片展示 文本是類似的,最后會有個圖片箭頭影片,布局很簡單,就是一個 TextVi ......

    uj5u.com 2023-04-20 08:39:36 more
  • 【FAQ】關于華為推送服務因營銷訊息頻次管控導致服務通訊類訊息

    一. 問題描述 使用華為推送服務下發IM訊息時,下發訊息請求成功且code碼為80000000,但是手機總是收不到訊息; 在華為推送自助分析(Beta)平臺查看發現,訊息發送觸發了頻控。 二. 問題原因及背景 2023年1月05日起,華為推送服務對咨詢營銷類訊息做了單個設備每日推送數量上限管理,具體 ......

    uj5u.com 2023-04-20 08:39:13 more
  • iOS從UI記憶體地址到讀取成員變數(oc/swift)

    開發除錯時,我們發現bug時常首先是從UI顯示發現例外,下一步才會去定位UI相關連的資料的。XCode有給我們提供一系列debug工具,但是很多人可能還沒有形成一套穩定的除錯流程,因此本文嘗試解決這個問題,順便提出一個暴論:UI顯示例外問題只需要兩個步驟就能完成定位作業的80%: 定位例外 UI 組 ......

    uj5u.com 2023-04-19 09:16:23 more
  • FIDE重磅更新!性能飛躍!體驗有禮!

    FIDE 開發者工具重構升級啦!實作500%性能提升,誠邀體驗! 一直以來不少開發者朋友在社區反饋,在使用 FIDE 工具的程序中,時常會遇到諸如加載不及時、代碼預覽/渲染性能不如意的情況,十分影響開發體驗。 作為技術團隊,我們深知一件趁手的開發工具對開發者的重要性,因此,在2023年開年,FinC ......

    uj5u.com 2023-04-19 09:16:15 more
  • 游戲內嵌社區服務開放,助力開發者提升玩家互動與留存

    華為 HMS Core 游戲內嵌社區服務提供快速訪問華為游戲中心論壇能力,支持玩家直接在游戲內瀏覽帖子和交流互動,助力開發者擴展內容生產和觸達的場景。 一、為什么要游戲內嵌社區? 二、游戲內嵌社區的典型使用場景 1、游戲內打開論壇 您可以在游戲內繪制論壇入口,為玩家提供沉浸式發帖、瀏覽、點贊、回帖、 ......

    uj5u.com 2023-04-19 09:15:46 more
  • iOS從UI記憶體地址到讀取成員變數(oc/swift)

    開發除錯時,我們發現bug時常首先是從UI顯示發現例外,下一步才會去定位UI相關連的資料的。XCode有給我們提供一系列debug工具,但是很多人可能還沒有形成一套穩定的除錯流程,因此本文嘗試解決這個問題,順便提出一個暴論:UI顯示例外問題只需要兩個步驟就能完成定位作業的80%: 定位例外 UI 組 ......

    uj5u.com 2023-04-19 09:14:53 more
  • FIDE重磅更新!性能飛躍!體驗有禮!

    FIDE 開發者工具重構升級啦!實作500%性能提升,誠邀體驗! 一直以來不少開發者朋友在社區反饋,在使用 FIDE 工具的程序中,時常會遇到諸如加載不及時、代碼預覽/渲染性能不如意的情況,十分影響開發體驗。 作為技術團隊,我們深知一件趁手的開發工具對開發者的重要性,因此,在2023年開年,FinC ......

    uj5u.com 2023-04-19 09:14:08 more
  • 游戲內嵌社區服務開放,助力開發者提升玩家互動與留存

    華為 HMS Core 游戲內嵌社區服務提供快速訪問華為游戲中心論壇能力,支持玩家直接在游戲內瀏覽帖子和交流互動,助力開發者擴展內容生產和觸達的場景。 一、為什么要游戲內嵌社區? 二、游戲內嵌社區的典型使用場景 1、游戲內打開論壇 您可以在游戲內繪制論壇入口,為玩家提供沉浸式發帖、瀏覽、點贊、回帖、 ......

    uj5u.com 2023-04-19 09:08:34 more