主頁 > 移動端開發 > Android 打包AAB+PAD(Unity篇)

Android 打包AAB+PAD(Unity篇)

2021-08-04 08:09:14 移動端開發

AAB

Android App Bundle 是 Android 新推出的一種官方發布格式,可讓你以更高效的方式開發和發布應用,借助 Android App Bundle,你可以更輕松地以更小的應用提供優質的使用體驗,從而提升安裝成功率并減少卸載量,轉換程序輕松便捷,你無需重構代碼即可開始獲享較小應用的優勢,改用這種格式后,你可以體驗模塊化應用開發和可自定義功能交付,并從中受益,

Play Asset Delivery

Play Asset Delivery (PAD) 將 app bundle 的優勢帶到游戲中,它允許超過 150 MB 的游戲替換舊版擴展檔案 (OBB),方法是將包含游戲所需的所有資源的單個工件發布到 Play,PAD 提供了靈活的分發模式、自動更新、壓縮和增量修補功能,并且可免費使用,使用 PAD,所有資源包均在 Google Play 上托管和提供,因此你無需使用內容分發網路 (CDN) 向玩家提供游戲資源,

Play Asset Delivery 使用資源包,資源包由資源(如紋理、著色器和聲音)組成,但不包含可執行代碼,通過 Dynamic Delivery,你可以按照以下三種分發模式自定義如何以及何時將各個資源包下載到設備上:「安裝時分發」「快速跟進式分發」「按需分發」

分發模式

「install-time」 資源包在用戶安裝應用時分發,這些資源包以拆分 APK(APK 集的一部分)的形式提供,它們也稱為“預先”資源包;您可以在應用啟動時立即使用這些資源包,這些資源包會增加 Google Play 商店上列出的應用大小,用戶無法修改或洗掉這些資源包,

「fast-follow」 資源包會在用戶安裝應用后立即自動下載;用戶無需打開應用即可開始 fast-follow 下載,此類下載不會阻止用戶訪問應用,這些資源包會增加 Google Play 商店上列出的應用大小,

「on-demand」 資源包會在應用運行時下載,

Google Play 商店會以歸檔檔案(而非拆分 APK)的形式提供配置為 fast-follow 和 on-demand 的資源包,這些資源包隨后會在應用的內部存盤空間中展開,您可以使用 Play Core API 查詢以這種方式提供的資源包的位置,應用無法假設這些檔案的存在或其位置,因為它們可能會被用戶洗掉,或由 Play Core SDK 在游戲會話之間移動,盡管這些檔案可由應用寫入,您也應將其視為只讀檔案,因為資源包補丁程式依賴于這些檔案的完整性,

資源更新

更新應用時,「install-time」 Asset Pack 會作為基礎應用更新的一部分進行更新(開發者無需執行任何操作),

對于 「fast-follow」「on-demand」 Asset Pack 的應用更新,則遵循以下步驟:

  • 1、系統將應用的補丁程式(包括所有資產)下載到設備上的安全位置,

  • 2、更新應用二進制檔案;這包括所有 install-time Asset Pack,

  • 3、之前下載的所有 Asset Pack 變為無效,

  • 4、將資產的補丁程式復制并應用到存盤在應用內部存盤空間中的資產,

在大多數情況下,當用戶打開游戲時,整體更新已完成,用戶可以立即開始玩更新后的版本,在極少數情況下,當用戶打開應用時,應用二進制檔案可能已完成更新,但資產的補丁程式應用程序尚未完成,因此用戶尚無法訪問這些資產,為了應對此類情形,您需要針對這些資產提供相應的“正在更新”界面元素,或構建邏輯來處理尚無法訪問的無效資源,由于只有在所有 Asset Pack 型別均已下載后,應用二進制檔案才會更新,因此補丁程式的應用操作會在本地以離線方式進行,且應快速完成,

紋理壓縮格式定位

紋理壓縮是一種有損影像壓縮,可讓 GPU 使用專用硬體直接從壓縮紋理進行渲染,從而減少所需的紋理記憶體和記憶體帶寬用量,借助紋理壓縮格式定位功能,您可以在 Android App Bundle 中添加使用多種紋理壓縮格式壓縮的紋理,并且依靠 Google Play 自動為每種設備提供采用最佳紋理壓縮格式的資源,

應用版本更新

新版本的應用上傳到 Google Play 后,如果用戶未在設備上更新該應用,他們可以打開之前的應用版本,在這種情況下,如有必要,應用可以通過呼叫 In-App Updates API 選擇強制更新或建議更新,借助此 API,您可以從應用內觸發更新,而不是讓用戶從 Google Play 商店觸發更新,

下載大小上限

Asset Pack 因具有較高的大小上限而成為大型游戲的理想之選:

  • 1、每個 fast-follow 和 on-demand Asset Pack 的下載大小上限為 512 MB,

  • 2、所有 install-time Asset Pack 的總下載大小上限為 1 GB,

  • 3、一個 Android App Bundle 中的所有 Asset Pack 的總下載大小上限為 2 GB,

  • 4、一個 Android App Bundle 中最多可以使用 50 個資源包,

如果你使用的是紋理壓縮格式定位,那么這些下載限制會分別應用于每個獨一無二的紋理格式,

針對 Unity 構建

Unity AssetBundle 檔案包含可在應用程式運行時由 Unity 引擎加載的序列化資產,這些檔案是特定于平臺的(例如,為 Android 構建)并且可以與資產包結合使用,最常見的是, 「一個 AssetBundle 檔案被打包成一個資產包」,該包使用與 AssetBundle 相同的名稱,

  • 1、獲取 Play Asset Delivery 的 Unity 插件(或包),

「注意:」 Google Play 核心庫的下載和使用受Play 核心軟體開發工具包服務條款的約束,下載和使用 Google Play 核心庫,「即表示你同意 Play 核心軟體開發工具包服務條款」

Unity 插件可用于精選的 Play 核心 API,包括 Play Asset Delivery,從Google Play Plugins for Unity 版本下載最新版本,這是一個包含 Play Core 插件以及其他 Play 插件(例如 Play In-app Billing 和 Play Instant)的單一軟體包,

  • 2、在 Unity 中創建 AssetBundles,

「注意:」 你可以使用 Unity AssetBundle Browser 在你的 Unity 專案中創建和管理 AssetBundle,

使用 UI 配置 AssetBundles

  • 1、在資產包中配置每個 AssetBundle:

    • 選擇Google > Android App Bundle > Asset Delivery設定,

    • 要選擇直接包含 AssetBundle 檔案的檔案夾,請單擊添加檔案夾,

  • 2、對于每個捆綁包,將Asset Delivery更改為「Install Time」「Fast Follow」「On Demand」,解決任何錯誤或依賴項并關閉視窗,

  • 3、選擇Google > Build Android App Bundle以構建應用程式包,

  • 4、(可選)配置你的應用程式包以支持不同的紋理壓縮格式,

常見的紋理壓縮格式:

  • DDS 或 S3TC:有時稱為 DXTC 或 DXTn,OpenGL 支持此格式的三種形式,

  • ETC1:大多數設備都支持此格式,這種格式不支持透明度,但游戲可將第二個紋理檔案用于 Alpha 通道組件,

  • ETC2:支持 GLES3 的所有設備均支持此格式,

  • PVRTC:iOS 游戲常用的格式,在某些 Android 設備上也受支持,

  • ASTC:專為取代之前的格式而設計的新格式,比先前的格式更加靈活,因為它支持各種塊大小,使用這種格式可以幫助您優化游戲大小,

支持的格式及支持相應格式設備所占的百分比:

使用 API 配置資產包

你可以通過編輯器腳本配置資產交付,這些腳本可以作為自動構建系統的一部分運行,

使用 AssetPackConfig 該類來定義要包含在 Android App Bundle 構建中的資產,以及模式,這些資產包不需要包含 AssetBundle,

public void ConfigureAssetPacks {
   // Creates an AssetPackConfig with a single asset pack, named
   // examplePackName, containing all the files in path/to/exampleFolder.
   var assetPackConfig = new AssetPackConfig();
   assetPackConfig.AddAssetsFolder("examplePackName",
                                   "path/to/exampleFolder",
                                   AssetPackDeliveryMode.OnDemand);

   // Configures the build system to use the newly created assetPackConfig when
   // calling Google > Build and Run or Google > Build Android App Bundle.
   AssetPackConfigSerializer.SaveConfig(assetPackConfig);

   // Alternatively, use BundleTool.BuildBundle to build an App Bundle from script.
   BuildBundle(new buildPlayerOptions(), assetPackConfig);
}

你還可以使用類中的靜態 BuildBundle 方法Bundletool生成帶有資產包的 Android App Bundle,給定 「BuildPlayerOptions」「AssetPackConfig」

Play Asset Delivery Unity API 集成

「Play Asset Delivery Unity API」 提供了請求資產包,下載管理,和訪問資源的功能,「確保」首先將 Unity 插件添加到你的專案中,

你在 API 中使用的函式取決于你創建資產包的方式,

  • 如果你使用 UI 配置 AssetBundles,請「選擇插件配置的資產包」

  • 如果你使用 API 配置資產包,請選「擇API 配置的資產包」

你可以根據要訪問的資產包的交付型別實施 API,這些步驟顯示在以下流程圖中,

檢索 AssetBundles

匯入 Play Asset Delivery API 并呼叫該 RetrieveAssetBundleAsync()方法來檢索 AssetBundle,

using Google.Play.AssetDelivery;

// Loads the AssetBundle from disk, downloading the asset pack containing it if necessary.
PlayAssetBundleRequest bundleRequest = PlayAssetDelivery.RetrieveAssetBundleAsync(asset-bundle-name);

安裝時交貨

資產包配置為「install-time」在應用程式啟動時立即可用,你可以使用以下命令從 AssetBundle 加載場景:

AssetBundle assetBundle = bundleRequest.AssetBundle;

// You may choose to load scenes from the AssetBundle. For example:
string[] scenePaths = assetBundle.GetAllScenePaths();
SceneManager.LoadScene(scenePaths[path-index]);

快速跟進和按需交付

這些部分適用于「fast-follow」「on-demand」資產包,

檢查狀態

每個資產包都存盤在應用程式內部存盤的單獨檔案夾中,使用該 「isDownloaded()」 方法確定是否已下載資產包,

監控下載

查詢PlayAssetBundleRequest 監控請求狀態的 物件:

// Download progress of request, between 0.0f and 1.0f. The value will always be
// 1.0 for assets delivered as install-time.
// NOTE: A value of 1.0 will only signify the download is complete. It will still need to be loaded.
float progress = bundleRequest.DownloadProgress;

// Returns true if:
//   * it had either completed the download, installing, and loading of the AssetBundle,
//   * OR if it has encountered an error.
bool done = bundleRequest.IsDone;

// Returns status of retrieval request.
AssetDeliveryStatus status = bundleRequest.Status;
switch(status) {
    case AssetDeliveryStatus.Pending:
        // Asset pack download is pending - N/A for install-time assets.
    case AssetDeliveryStatus.Retrieving:
        // Asset pack is being downloaded and transferred to app storage.
        // N/A for install-time assets.
    case AssetDeliveryStatus.Available:
        // Asset pack is downloaded on disk but NOT loaded into memory.
        // For PlayAssetPackRequest(), this indicates that the request is complete.
    case AssetDeliveryStatus.Loading:
        // Asset pack is being loaded.
    case AssetDeliveryStatus.Loaded:
        // Asset pack has finished loading, assets can now be loaded.
        // For PlayAssetBundleRequest(), this indicates that the request is complete.
    case AssetDeliveryStatus.Failed:
        // Asset pack retrieval has failed.
    case AssetDeliveryStatus.WaitingForWifi:
        // Asset pack retrieval paused until either the device connects via Wi-Fi,
        // or the user accepts the PlayAssetDelivery.ShowCellularDataConfirmation dialog.
    default:
        break;
}

大量下載

大于 150MB 的資產包可以自動下載,但只能通過 Wi-Fi 下載,如果用戶未連接到 Wi-Fi,則PlayAssetBundleRequest狀態設定為 AssetDeliveryStatus.WaitingForWifi 并暫停下載,在這種情況下,要么等待設備連接到 Wi-Fi,然后繼續下載,要么提示用戶批準通過蜂窩連接下載包,

if(bundleRequest.Status == AssetDeliveryStatus.WaitingForWifi) {
    var userConfirmationOperation = PlayAssetDelivery.ShowCellularDataConfirmation();
    yield return userConfirmationOperation;

    switch(userConfirmationOperation.GetResult()) {
        case ConfirmationDialogResult.Unknown:
            // userConfirmationOperation finished with an error. Something went
            // wrong when displaying the prompt to the user, and they weren't
            // able to interact with the dialog. In this case, we recommend
            // developers wait for Wi-Fi before attempting to download again.
            // You can get more info by calling GetError() on the operation.
        case ConfirmationDialogResult.Accepted:
            // User accepted the confirmation dialog - download will start
            // automatically (no action needed).
        case ConfirmationDialogResult.Declined:
            // User canceled or declined the dialog. Await Wi-Fi connection, or
            // re-prompt the user.
        default:
            break;
    }
}

取消請求(僅限按需)

如果需要在 AssetBundles 加載到記憶體之前取消請求,請呼叫 物件AttemptCancel() 上的方法 PlayAssetBundleRequest:

// Will only attempt if the status is Pending, Retrieving, or Available - otherwise
// it will be a no-op.
bundleRequest.AttemptCancel();

// Check to see if the request was successful by checking if the error code is Canceled.
if(bundleRequest.Error == AssetDeliveryErrorCode.Canceled) {
    // Request was successfully canceled.
}

異步請求資產包

在大多數情況下,你應該使用 Coroutines異步請求資產包并監控進度,如下所示:

private IEnumerator LoadAssetBundleCoroutine(string assetBundleName) {

    PlayAssetBundleRequest bundleRequest =
        PlayAssetDelivery.RetrieveAssetBundleAsync(assetBundleName);

    while (!bundleRequest.IsDone) {
        if(bundleRequest.Status == AssetDeliveryStatus.WaitingForWifi) {
            var userConfirmationOperation = PlayAssetDelivery.ShowCellularDataConfirmation();

            // Wait for confirmation dialog action.
            yield return userConfirmationOperation;

            if((userConfirmationOperation.Error != AssetDeliveryErrorCode.NoError) ||
               (userConfirmationOperation.GetResult() != ConfirmationDialogResult.Accepted)) {
                // The user did not accept the confirmation - handle as needed.
            }

            // Wait for Wi-Fi connection OR confirmation dialog acceptance before moving on.
            yield return new WaitUntil(() => bundleRequest.Status != AssetDeliveryStatus.WaitingForWifi);
        }

        // Use bundleRequest.DownloadProgress to track download progress.
        // Use bundleRequest.Status to track the status of request.

        yield return null;
    }

    if (bundleRequest.Error != AssetDeliveryErrorCode.NoError) {
        // There was an error retrieving the bundle. For error codes NetworkError
        // and InsufficientStorage, you may prompt the user to check their
        // connection settings or check their storage space, respectively, then
        // try again.
        yield return null;
    }

    // Request was successful. Retrieve AssetBundle from request.AssetBundle.
    AssetBundle assetBundle = bundleRequest.AssetBundle;

其他 Play Core API 方法

以下是你可能希望在應用中使用的一些其他 API 方法,

檢查下載大小

通過對 Google Play 進行異步呼叫并設定操作完成時的回呼方法來檢查 AssetBundle 的大小:

public IEnumerator GetDownloadSize() {
   PlayAsyncOperation<long> getSizeOperation =
   PlayAssetDelivery.GetDownloadSize(assetPackName);

   yield return getSizeOperation;
   if(operation.Error != AssetDeliveryErrorCode.NoError) {
       // Error while retrieving download size.
    } else {
        // Download size is given in bytes.
        long downloadSize = operation.GetResult();
    }
}

移除 AssetBundles

你可以洗掉當前未加載到記憶體中的快速關注和按需 AssetBundle,進行以下異步呼叫并設定完成時的回呼方法:

PlayAsyncOperation<string> removeOperation = PlayAssetDelivery.RemoveAssetPack(assetBundleName);

removeOperation.Completed += (operation) =>
            {
                if(operation.Error != AssetDeliveryErrorCode.NoError) {
                    // Error while attempting to remove AssetBundles.
                } else {
                    // Files were deleted OR files did not exist to begin with.
                }
            };

測驗

在 Unity Editor 中,選擇Google > Build and Run,

行為

「install-time」 包將在應用程式安裝程序中安裝,

「fast-follow」包的行為與「on-demand」包一樣,也就是說,當游戲被側載時它們不會被自動獲取,開發者需要在游戲開始時手動請求;這不需要你的應用程式中的任何代碼更改,

限制

以下是本地測驗的限制:

  • Packs 從外部存盤而不是 Play 中獲取,因此您無法測驗您的代碼在出現網路錯誤的情況下的行為,

  • 本地測驗不包括等待 Wi-Fi 場景,

  • 不支持更新,在安裝新版本的構建之前,請手動卸載以前的版本,

使用內部應用共享進行測驗

當你接近發布候選版本時,請使用盡可能真實的配置來測驗你的游戲,以確保你的游戲在生產環境中為您的用戶提供良好的性能, 構建您的應用程式包,

要使用內部應用程式共享測驗資產交付,請執行以下操作:

  • 構建你的應用程式包,

  • 按照 Play 管理中心的說明進行操作,了解如何在 內部共享您的應用,

  • 在測驗設備上,單擊您剛剛上傳的應用程式版本的內部應用程式共享鏈接,

  • 從點擊鏈接后看到的 Google Play 商店頁面安裝應用程式,

搞定齊活,

相關推薦

Android aab打包

App Bundle介紹

打包AAB+PAD(java篇)

AAB打包報錯

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

標籤:其他

上一篇:1個人70萬行代碼,20年持續更新,這款游戲號稱開發到死,永不停更

下一篇:大佬就是強,被阿里拒絕,掉頭就走進了騰訊

標籤雲
其他(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