99精品久久精品一区二区-亚洲熟妇无码?v在线播放-日本国产精品无码字幕在线观看-久久久亚洲永夜AV-亚洲一级无码一区二区一-免费国产成高清人在线视频-中文字幕乱码免费观看-国产毛片精品妇女久久久

ARTICLE DETAIL

資訊詳情

深耕商務建站與企業(yè)官網(wǎng)運營的一線實戰(zhàn)洞察。

Unity手游動態(tài)圖標雙端工程化方案:Android activity-alias與iOS setAlternateIconName實戰(zhàn)

Unity手游動態(tài)圖標雙端工程化方案:Android activity-alias與iOS setAlternateIconName實戰(zhàn) 1. 動態(tài)圖標這件事到底在解決什么問題做過手游運營的人都有一個共識App圖標是成本最低、觸達最廣的運營位。它不需要用戶打開游戲不需要推送權(quán)限甚至不需要用戶在線——只要圖標躺在手機桌面上每一次解鎖屏幕都是一次曝光。春節(jié)換紅底、周年慶換金色、聯(lián)動活動換角色立繪這套玩法在國內(nèi)頭部手游里早就跑通了。但問題在于Unity作為跨平臺引擎本身并沒有提供一套統(tǒng)一的動態(tài)圖標API。Android和iOS兩端的實現(xiàn)路徑完全不同Android靠activity-alias做組件切換iOS靠setAlternateIconName做系統(tǒng)級替換。更麻煩的是Unity的構(gòu)建流程會覆蓋原生工程配置你手動改的東西下一次出包就沒了。所以真正要解決的不是怎么換圖標這個單點問題而是怎么在Unity的構(gòu)建管線里把雙端的動態(tài)圖標能力做成可配置、可自動化、不丟配置的工程化方案。這篇文章適合三類人看一是正在做手游運營功能開發(fā)的同學二是需要給項目加動態(tài)圖標但不知道從哪下手的Unity客戶端三是想了解Androidactivity-alias和iOS alternate icon底層機制的移動端開發(fā)者。我會把兩端的原理、Unity側(cè)的工程改造、構(gòu)建腳本、踩過的坑全部攤開講代碼和配置都可以直接抄。先說結(jié)論Android端用activity-alias方案切換時會有一次桌面圖標的閃動系統(tǒng)會短暫移除再添加組件但兼容性最好從Android 5.0到14都沒問題iOS端用setAlternateIconName切換時系統(tǒng)會彈一個您已更改圖標的提示框這個提示無法繞過除非用私有API不建議。兩端都需要在Unity構(gòu)建后處理原生工程文件這部分我用Editor腳本自動化掉了。2. 雙端方案選型為什么Android用activity-aliasiOS用setAlternateIconName2.1 Android端activity-alias是唯一靠譜的路Android換圖標這件事網(wǎng)上能搜到好幾種說法我一個個說清楚為什么最后選了activity-alias。第一種是直接改AndroidManifest.xml里application的android:icon屬性然后重新安裝。這顯然不行用戶不可能為了換個圖標重新下載APK。第二種是用PackageManager.setComponentEnabledSetting動態(tài)啟用/禁用組件。這個API本身沒問題關(guān)鍵在于你要啟用/禁用什么組件。Android的桌面圖標本質(zhì)上是一個activity組件帶LAUNCHERcategory的那個你沒法直接替換一個activity的圖標但你可以通過activity-alias創(chuàng)建多個別名每個別名指向同一個主Activity但各自帶不同的android:icon。然后通過setComponentEnabledSetting控制哪個別名處于啟用狀態(tài)。具體來說主Activity保持android:enabledfalse且不帶LAUNCHER category然后為每個圖標創(chuàng)建一個activity-alias只有當前選中的那個alias是enabledtrue且?guī)AUNCHER category。切換圖標 禁用舊alias 啟用新alias。activity android:namecom.unity3d.player.UnityPlayerActivity android:exportedtrue android:enabledfalse intent-filter action android:nameandroid.intent.action.MAIN / /intent-filter /activity activity-alias android:name.icon_default android:targetActivitycom.unity3d.player.UnityPlayerActivity android:enabledtrue android:exportedtrue android:iconmipmap/app_icon_default android:labelstring/app_name intent-filter action android:nameandroid.intent.action.MAIN / category android:nameandroid.intent.category.LAUNCHER / /intent-filter /activity-alias activity-alias android:name.icon_festival android:targetActivitycom.unity3d.player.UnityPlayerActivity android:enabledfalse android:exportedtrue android:iconmipmap/app_icon_festival android:labelstring/app_name intent-filter action android:nameandroid.intent.action.MAIN / category android:nameandroid.intent.category.LAUNCHER / /intent-filter /activity-alias這里有幾個必須注意的細節(jié)我踩過坑主Activity的intent-filter里不能有LAUNCHER category否則桌面上會出現(xiàn)兩個圖標。只保留MAIN action即可。每個alias的android:name建議用相對路徑如.icon_default這樣會自動拼上包名避免硬編碼包名出錯。android:enabled的初始狀態(tài)默認圖標那個alias設為true其他全部false。這個狀態(tài)會被系統(tǒng)持久化用戶重啟手機也不會丟。切換時用PackageManager.setComponentEnabledSetting必須傳DONT_KILL_APP標志否則切換的瞬間你的進程會被殺掉用戶體驗極差。// Android側(cè)切換代碼 public void switchIcon(String aliasName) { PackageManager pm getPackageManager(); String pkg getPackageName(); // 先禁用所有alias String[] allAliases {icon_default, icon_festival, icon_anniversary}; for (String alias : allAliases) { pm.setComponentEnabledSetting( new ComponentName(pkg, pkg . alias), PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP ); } // 啟用目標alias pm.setComponentEnabledSetting( new ComponentName(pkg, pkg . aliasName), PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP ); }實測下來這個方案在小米、華為、OPPO、vivo、三星的主流機型上都能正常工作。唯一的問題是切換瞬間桌面圖標會有一個短暫的消失再出現(xiàn)的過程這是系統(tǒng)launcher重新加載組件導致的無法避免。我的做法是在切換前給用戶一個loading提示切換完成后彈一個Toast讓用戶知道發(fā)生了什么。2.2 iOS端setAlternateIconName的能與不能iOS從10.3開始提供了setAlternateIconName:completionHandler:這個API允許App在運行時切換圖標。但蘋果對這個功能加了很多限制你必須提前知道第一所有備選圖標必須在Info.plist里預先聲明。你不能在運行時動態(tài)生成圖標只能從預先打包進Bundle的圖標里選。聲明方式是在Info.plist里加一個CFBundleIcons字典keyCFBundleIcons/key dict keyCFBundlePrimaryIcon/key dict keyCFBundleIconFiles/key array stringAppIcon60x60/string /array /dict keyCFBundleAlternateIcons/key dict keyfestival/key dict keyCFBundleIconFiles/key array stringAppIcon_Festival60x60/string /array keyUIPrerenderedIcon/key false/ /dict keyanniversary/key dict keyCFBundleIconFiles/key array stringAppIcon_Anniversary60x60/string /array keyUIPrerenderedIcon/key false/ /dict /dict /dict第二圖標文件必須放在Bundle根目錄下不能放在Assets.xcassets里。這是最容易踩的坑。Xcode的Asset Catalog雖然方便但setAlternateIconName只認Bundle根目錄下的png文件。你需要把備選圖標以AppIcon_Festival60x60.png、AppIcon_Festival60x602x.png、AppIcon_Festival60x603x.png的命名方式直接拖進Xcode工程選擇Create folder references而不是Create groups。第三切換時會彈系統(tǒng)提示框。這是iOS的硬性行為提示內(nèi)容大概是您已更改XXX的圖標。這個提示無法通過公開API繞過。有些團隊用UIApplication.shared.isStatusBarHidden之類的hack去遮蓋但在新版本iOS上已經(jīng)失效了不建議折騰。第四切換必須在主線程調(diào)用且completionHandler里要處理錯誤。如果圖標名不存在或者文件缺失會返回error。// iOS側(cè)切換代碼 - (void)switchIcon:(NSString *)iconName { if (![UIApplication sharedApplication].supportsAlternateIcons) { NSLog(當前設備不支持切換圖標); return; } NSString *targetName [iconName isEqualToString:default] ? nil : iconName; [[UIApplication sharedApplication] setAlternateIconName:targetName completionHandler:^(NSError * _Nullable error) { if (error) { NSLog(切換圖標失敗: %, error.localizedDescription); } else { NSLog(切換圖標成功); } }]; }注意傳nil表示恢復默認圖標。另外supportsAlternateIcons這個屬性在iOS 10.3才可用低版本要加可用性判斷。2.3 兩端方案對比對比項Android (activity-alias)iOS (setAlternateIconName)最低支持版本Android 5.0iOS 10.3圖標來源打包進APK的mipmap資源打包進Bundle的png文件切換時系統(tǒng)提示無但桌面圖標會閃動有彈窗無法繞過是否需要重啟App否否圖標數(shù)量限制理論上無限制建議不超過10個審核風險無需在審核時說明用途3. Unity工程側(cè)改造讓構(gòu)建管線自動處理原生配置3.1 為什么不能手動改原生工程Unity的構(gòu)建流程是這樣的每次Build它都會重新生成Android的AndroidManifest.xml和iOS的Info.plist或者至少覆蓋你手動改的部分。你這次手動加了activity-alias下次出包就沒了。所以必須把配置注入到Unity的構(gòu)建管線里。Unity提供了兩個關(guān)鍵接口IPreprocessBuildWithReport和IPostprocessBuildWithReport。前者在構(gòu)建前執(zhí)行后者在構(gòu)建后執(zhí)行。對于Android我們需要在構(gòu)建后修改AndroidManifest.xml因為Unity生成的manifest在構(gòu)建后才最終確定對于iOS我們需要在構(gòu)建后修改Info.plist并拷貝圖標文件。3.2 Android側(cè)PostprocessBuild注入activity-aliasAndroid的manifest處理有個坑Unity構(gòu)建出來的工程AndroidManifest.xml在Temp/StagingArea目錄下構(gòu)建完成后會被拷貝到最終的Gradle工程里。我們需要在OnPostprocessBuild里找到這個文件并修改。using UnityEditor; using UnityEditor.Callbacks; using System.IO; using System.Xml; using UnityEngine; public class AndroidIconPostprocessor { [PostProcessBuild(1000)] public static void OnPostprocessBuild(BuildTarget target, string pathToBuiltProject) { if (target ! BuildTarget.Android) return; string manifestPath Path.Combine(pathToBuiltProject, AndroidManifest.xml); // 如果是Gradle工程路徑不同 if (EditorUserBuildSettings.exportAsGoogleAndroidProject) { manifestPath Path.Combine(pathToBuiltProject, unityLibrary, src, main, AndroidManifest.xml); } if (!File.Exists(manifestPath)) { Debug.LogError(找不到AndroidManifest.xml: manifestPath); return; } XmlDocument doc new XmlDocument(); doc.Load(manifestPath); XmlNode applicationNode doc.SelectSingleNode(/manifest/application); if (applicationNode null) return; // 找到主Activity移除LAUNCHER category設置enabledfalse XmlNode mainActivity FindMainActivity(applicationNode); if (mainActivity null) return; SetMainActivityDisabled(mainActivity); // 注入activity-alias string packageName doc.DocumentElement.GetAttribute(package); string[] iconNames { default, festival, anniversary }; foreach (string iconName in iconNames) { XmlElement alias CreateActivityAlias(doc, packageName, iconName); applicationNode.AppendChild(alias); } doc.Save(manifestPath); Debug.Log(Android動態(tài)圖標配置注入完成); } private static XmlNode FindMainActivity(XmlNode applicationNode) { foreach (XmlNode child in applicationNode.ChildNodes) { if (child.Name ! activity) continue; XmlNode intentFilter child.SelectSingleNode(intent-filter); if (intentFilter null) continue; XmlNode launcher intentFilter.SelectSingleNode(category[android:nameandroid.intent.category.LAUNCHER]); if (launcher ! null) return child; } return null; } private static void SetMainActivityDisabled(XmlNode activity) { XmlElement elem (XmlElement)activity; elem.SetAttribute(enabled, http://schemas.android.com/apk/res/android, false); // 移除LAUNCHER category XmlNode intentFilter activity.SelectSingleNode(intent-filter); if (intentFilter ! null) { XmlNode launcher intentFilter.SelectSingleNode(category[android:nameandroid.intent.category.LAUNCHER]); if (launcher ! null) intentFilter.RemoveChild(launcher); } } private static XmlElement CreateActivityAlias(XmlDocument doc, string packageName, string iconName) { XmlElement alias doc.CreateElement(activity-alias); alias.SetAttribute(name, http://schemas.android.com/apk/res/android, .icon_ iconName); alias.SetAttribute(targetActivity, http://schemas.android.com/apk/res/android, com.unity3d.player.UnityPlayerActivity); alias.SetAttribute(enabled, http://schemas.android.com/apk/res/android, iconName default ? true : false); alias.SetAttribute(exported, http://schemas.android.com/apk/res/android, true); alias.SetAttribute(icon, http://schemas.android.com/apk/res/android, mipmap/app_icon_ iconName); alias.SetAttribute(label, http://schemas.android.com/apk/res/android, string/app_name); XmlElement intentFilter doc.CreateElement(intent-filter); XmlElement action doc.CreateElement(action); action.SetAttribute(name, http://schemas.android.com/apk/res/android, android.intent.action.MAIN); XmlElement category doc.CreateElement(category); category.SetAttribute(name, http://schemas.android.com/apk/res/android, android.intent.category.LAUNCHER); intentFilter.AppendChild(action); intentFilter.AppendChild(category); alias.AppendChild(intentFilter); return alias; } }這段代碼有幾個關(guān)鍵點PostProcessBuild的優(yōu)先級設為1000確保在其他后處理腳本之后執(zhí)行處理了Gradle工程和直接APK兩種構(gòu)建模式用XmlDocument操作而不是字符串替換避免格式錯誤。3.3 iOS側(cè)PostprocessBuild修改Info.plist并拷貝圖標iOS這邊更麻煩一點因為除了改Info.plist還要把圖標文件拷貝到正確的位置。Unity構(gòu)建出來的Xcode工程Info.plist在Unity-iPhone/Info.plist圖標需要拷貝到Unity-iPhone/根目錄下。using UnityEditor; using UnityEditor.Callbacks; using System.IO; using UnityEditor.iOS.Xcode; using UnityEngine; public class IOSIconPostprocessor { [PostProcessBuild(1000)] public static void OnPostprocessBuild(BuildTarget target, string pathToBuiltProject) { if (target ! BuildTarget.iOS) return; string plistPath Path.Combine(pathToBuiltProject, Info.plist); PlistDocument plist new PlistDocument(); plist.ReadFromFile(plistPath); PlistElementDict rootDict plist.root; PlistElementDict bundleIcons rootDict.CreateDict(CFBundleIcons); // 主圖標 PlistElementDict primaryIcon bundleIcons.CreateDict(CFBundlePrimaryIcon); PlistElementArray primaryFiles primaryIcon.CreateArray(CFBundleIconFiles); primaryFiles.AddString(AppIcon60x60); // 備選圖標 PlistElementDict alternateIcons bundleIcons.CreateDict(CFBundleAlternateIcons); string[] iconNames { festival, anniversary }; foreach (string iconName in iconNames) { PlistElementDict iconDict alternateIcons.CreateDict(iconName); PlistElementArray iconFiles iconDict.CreateArray(CFBundleIconFiles); iconFiles.AddString(AppIcon_ Capitalize(iconName) 60x60); iconDict.SetBoolean(UIPrerenderedIcon, false); } plist.WriteToFile(plistPath); // 拷貝圖標文件到Bundle根目錄 string sourceDir Assets/Editor/DynamicIcons/iOS; string destDir pathToBuiltProject; foreach (string iconName in iconNames) { string baseName AppIcon_ Capitalize(iconName) 60x60; CopyIconFile(sourceDir, destDir, baseName .png); CopyIconFile(sourceDir, destDir, baseName 2x.png); CopyIconFile(sourceDir, destDir, baseName 3x.png); } Debug.Log(iOS動態(tài)圖標配置注入完成); } private static void CopyIconFile(string sourceDir, string destDir, string fileName) { string src Path.Combine(sourceDir, fileName); string dst Path.Combine(destDir, fileName); if (File.Exists(src)) { File.Copy(src, dst, true); } else { Debug.LogWarning(圖標文件不存在: src); } } private static string Capitalize(string s) { if (string.IsNullOrEmpty(s)) return s; return char.ToUpper(s[0]) s.Substring(1); } }這里用了Unity的PlistDocument類來操作plist比直接改XML安全得多。圖標文件我放在Assets/Editor/DynamicIcons/iOS/目錄下構(gòu)建時自動拷貝。3.4 Unity與原生層的橋接Unity側(cè)要調(diào)用原生的切換方法需要做平臺判斷和橋接。Android用AndroidJavaObjectiOS用DllImport。using UnityEngine; public class DynamicIconManager : MonoBehaviour { public static void SwitchIcon(string iconName) { #if UNITY_ANDROID !UNITY_EDITOR using (AndroidJavaClass unityPlayer new AndroidJavaClass(com.unity3d.player.UnityPlayer)) using (AndroidJavaObject activity unityPlayer.GetStaticAndroidJavaObject(currentActivity)) { activity.Call(runOnUiThread, new AndroidJavaRunnable(() { activity.Call(switchIcon, icon_ iconName); })); } #elif UNITY_IOS !UNITY_EDITOR _SwitchIcon(iconName); #else Debug.Log(編輯器模式下不執(zhí)行圖標切換: iconName); #endif } #if UNITY_IOS !UNITY_EDITOR [System.Runtime.InteropServices.DllImport(__Internal)] private static extern void _SwitchIcon(string iconName); #endif }iOS側(cè)需要一個.mm文件來暴露C接口給Unity// DynamicIcon.mm #import UIKit/UIKit.h extern C { void _SwitchIcon(const char* iconName) { NSString *name [NSString stringWithUTF8String:iconName]; dispatch_async(dispatch_get_main_queue(), ^{ if (![UIApplication sharedApplication].supportsAlternateIcons) return; NSString *target [name isEqualToString:default] ? nil : name; [[UIApplication sharedApplication] setAlternateIconName:target completionHandler:^(NSError *error) { if (error) NSLog(切換圖標失敗: %, error); }]; }); } }這個.mm文件需要放在Assets/Plugins/iOS/目錄下Unity會自動把它編譯進Xcode工程。4. 實操全流程從資源準備到出包驗證4.1 圖標資源規(guī)范與準備Android和iOS對圖標尺寸的要求不一樣我整理了一個對照表平臺用途尺寸命名規(guī)范存放位置Androidmipmap-mdpi48x48app_icon_default.pngAssets/Plugins/Android/res/mipmap-mdpi/Androidmipmap-hdpi72x72app_icon_default.pngAssets/Plugins/Android/res/mipmap-hdpi/Androidmipmap-xhdpi96x96app_icon_default.pngAssets/Plugins/Android/res/mipmap-xhdpi/Androidmipmap-xxhdpi144x144app_icon_default.pngAssets/Plugins/Android/res/mipmap-xxhdpi/Androidmipmap-xxxhdpi192x192app_icon_default.pngAssets/Plugins/Android/res/mipmap-xxxhdpi/iOS60x601x60x60AppIcon_Festival60x60.pngAssets/Editor/DynamicIcons/iOS/iOS60x602x120x120AppIcon_Festival60x602x.pngAssets/Editor/DynamicIcons/iOS/iOS60x603x180x180AppIcon_Festival60x603x.pngAssets/Editor/DynamicIcons/iOS/Android的圖標放在Assets/Plugins/Android/res/下Unity構(gòu)建時會自動合并到APK的res目錄。注意不要放在Assets/Resources/下那樣不會被打進原生資源。iOS的圖標命名有個坑CFBundleIconFiles里寫的是AppIcon_Festival60x60系統(tǒng)會自動去找AppIcon_Festival60x60.png、AppIcon_Festival60x602x.png、AppIcon_Festival60x603x.png。所以命名必須嚴格一致大小寫敏感。4.2 構(gòu)建腳本的完整配置把上面兩個Postprocessor腳本放到Assets/Editor/目錄下Unity會自動識別。但有幾個配置項需要確認Player Settings → Publishing Settings → Build如果勾選了Custom Main ManifestUnity會用你提供的manifest而不是自動生成。這種情況下你需要手動在自定義manifest里加aliasPostprocessor腳本要相應調(diào)整。Player Settings → Other Settings → Package Name確保包名正確alias的name會基于包名生成。iOS Player Settings → Icon這里配置的是主圖標備選圖標不走這里走我們的Postprocessor。我建議的做法是不勾選Custom Main Manifest讓Unity自動生成然后Postprocessor在構(gòu)建后注入。這樣最省心。4.3 切換邏輯的時機與狀態(tài)管理圖標切換不是隨便什么時候都能調(diào)的。我的經(jīng)驗是不要在App啟動時立即切換。啟動階段系統(tǒng)資源緊張切換容易失敗。建議在進入主界面后延遲1-2秒再執(zhí)行。切換狀態(tài)要持久化。用PlayerPrefs記錄當前圖標名下次啟動時對比服務端下發(fā)的配置如果一致就不重復切換避免不必要的閃動和彈窗。切換前檢查網(wǎng)絡和資源。如果圖標資源是熱更下載的Android可以iOS不行因為圖標必須打包進Bundle要確保下載完成再切換。public class IconSwitchController : MonoBehaviour { private const string ICON_KEY current_icon_name; void Start() { Invoke(CheckAndSwitchIcon, 2f); } private void CheckAndSwitchIcon() { string serverIcon GetServerIconConfig(); // 從服務端或本地配置讀取 string localIcon PlayerPrefs.GetString(ICON_KEY, default); if (serverIcon ! localIcon) { DynamicIconManager.SwitchIcon(serverIcon); PlayerPrefs.SetString(ICON_KEY, serverIcon); PlayerPrefs.Save(); } } }4.4 出包驗證清單出包后別急著發(fā)按這個清單過一遍Android安裝后桌面圖標是否正常顯示默認圖標用adb shell dumpsys package 包名查看alias的enabled狀態(tài)是否正確。Android調(diào)用切換后桌面圖標是否變成目標圖標殺掉App重開圖標是否保持Android切換時App是否被殺掉如果被殺檢查DONT_KILL_APP標志是否傳了。iOS安裝后圖標是否正常切換時是否彈出系統(tǒng)提示切換后圖標是否變化iOS殺掉App重開圖標是否保持恢復默認圖標是否正常雙端連續(xù)切換多次是否有異常圖標資源是否都正確打包5. 常見問題與排查技巧實錄5.1 Android端典型問題問題一桌面上出現(xiàn)兩個圖標。這是最常見的問題。原因通常是主Activity的intent-filter里還保留著LAUNCHER category。檢查AndroidManifest.xml確保主Activity的intent-filter里只有MAIN action沒有LAUNCHER category。另外檢查是否有多個alias同時處于enabled狀態(tài)。問題二切換后圖標沒變但alias狀態(tài)變了。這種情況通常是launcher緩存導致的。不同廠商的launcher刷新機制不一樣小米和華為一般會立即刷新OPPO和vivo可能有延遲。解決辦法是切換后發(fā)一個廣播通知launcher刷新但這不是標準API各廠商支持情況不一。我的做法是切換后彈一個Toast提示用戶圖標將在幾秒后更新給用戶預期。問題三切換時App閃退。檢查是否在主線程調(diào)用setComponentEnabledSetting。這個API必須在主線程執(zhí)行。另外檢查alias的name是否拼寫正確ComponentName的第二個參數(shù)必須是完整類名包名alias名。問題四某些機型上alias不生效。部分定制ROM尤其是早期的EMUI和MIUI對activity-alias的支持有問題。實測下來Android 7.0以上的主流機型基本沒問題Android 5.x和6.x的部分機型可能有兼容性問題。如果目標用戶里老機型占比高建議做降級處理檢測切換是否成功失敗則提示用戶手動更換。5.2 iOS端典型問題問題一切換時報錯icon name not found。檢查三件事Info.plist里CFBundleAlternateIcons的key是否和傳入的name一致圖標文件是否在Bundle根目錄下不是Assets.xcassets文件名是否和CFBundleIconFiles里聲明的一致包括2x、3x后綴。問題二切換時彈窗提示您已更改圖標能否去掉不能。這是iOS的系統(tǒng)行為公開API無法繞過。有些團隊嘗試用UIAlertController的私有方法去攔截但在iOS 13以后已經(jīng)失效。接受它或者在產(chǎn)品層面引導用戶比如切換前先彈一個自定義提示說明會有一個系統(tǒng)彈窗。問題三審核時被拒說動態(tài)圖標功能不明確。App Store審核指南對動態(tài)圖標沒有明確禁止但如果你的App切換圖標后功能沒有變化審核員可能認為這是無意義的功能。建議在審核時提供說明動態(tài)圖標用于節(jié)日活動或用戶個性化并在App內(nèi)提供明確的切換入口。問題四iPad上不生效。iPad的圖標尺寸和iPhone不一樣CFBundleIconFiles需要額外聲明iPad的尺寸如AppIcon_Festival76x76。如果只聲明了60x60iPad上可能不生效。建議同時聲明iPhone和iPad的圖標尺寸。5.3 雙端通用問題速查表問題現(xiàn)象可能原因排查方向解決方案切換后圖標不變資源未打包檢查APK/Bundle里是否有圖標文件確認資源路徑正確切換后App重啟未傳DONT_KILL_APP檢查Android代碼加上標志iOS切換報錯plist配置錯誤檢查CFBundleAlternateIcons修正key和文件名桌面出現(xiàn)雙圖標LAUNCHER category重復檢查manifest移除主Activity的LAUNCHER切換狀態(tài)丟失未持久化檢查PlayerPrefs切換后立即Save部分機型不生效ROM兼容性查看系統(tǒng)版本做降級提示5.4 我踩過的幾個坑第一個坑是Android的alias name用了絕對路徑。一開始我寫的是com.example.game.icon_default結(jié)果在某些機型上不生效。后來改成相對路徑.icon_default讓系統(tǒng)自動拼包名問題解決。原因是絕對路徑在某些ROM上會被當成不同的組件處理。第二個坑是iOS圖標文件放進了Assets.xcassets。Xcode的Asset Catalog會把圖標編譯成Assets.carsetAlternateIconName根本找不到。必須用folder reference的方式直接放Bundle根目錄。第三個坑是Unity構(gòu)建時覆蓋了Info.plist。我一開始在Xcode里手動改了plist結(jié)果Unity重新構(gòu)建后全沒了。后來用Postprocessor腳本自動注入才徹底解決。第四個坑是切換時機太早。在Awake里調(diào)用切換Android上經(jīng)常失敗因為Activity還沒完全初始化。改成延遲2秒后調(diào)用穩(wěn)定了。6. 工程化擴展與進階玩法6.1 圖標配置表驅(qū)動硬編碼圖標名不是好做法。我建議用ScriptableObject做配置表把圖標名、資源路徑、生效時間、平臺限制都配置化。[CreateAssetMenu(fileName IconConfig, menuName DynamicIcon/IconConfig)] public class IconConfig : ScriptableObject { [System.Serializable] public class IconEntry { public string iconName; public string displayName; public long startTime; public long endTime; public bool enableAndroid; public bool enableIOS; } public ListIconEntry icons new ListIconEntry(); public string GetActiveIcon(long currentTime) { foreach (var icon in icons) { if (currentTime icon.startTime currentTime icon.endTime) return icon.iconName; } return default; } }這樣運營配置活動時只需要改配置表不需要改代碼。6.2 服務端下發(fā)與灰度圖標切換的配置最好走服務端下發(fā)這樣可以隨時調(diào)整活動時間不需要發(fā)版。服務端返回一個JSON客戶端解析后對比本地狀態(tài)決定是否切換?;叶确矫婵梢园从脩鬒D哈?;蛘咔腊鼇砜刂颇男┯脩魠⑴c。6.3 與熱更系統(tǒng)的配合Android的圖標資源可以走熱更因為alias的icon屬性可以指向下載到本地的資源實際上不行alias的icon必須是打包進APK的資源。所以Android的備選圖標也必須預先打包進APK不能熱更。這一點和iOS一樣。所以動態(tài)圖標的動態(tài)指的是切換時機動態(tài)而不是圖標資源動態(tài)。這個認知很重要很多團隊一開始以為可以熱更圖標結(jié)果發(fā)現(xiàn)不行。如果確實需要大量圖標比如用戶自定義圖標Android可以通過PackageManager的setComponentEnabledSetting配合動態(tài)生成的alias來實現(xiàn)但需要反射調(diào)用隱藏API風險較高不建議。6.4 用戶體驗優(yōu)化建議切換圖標這件事用戶感知很強但也很容易做成騷擾。我的建議是給用戶選擇權(quán)。不要強制切換在設置里提供圖標選擇入口讓用戶自己選。切換前告知。尤其是iOS系統(tǒng)彈窗會讓用戶困惑提前用自定義彈窗說明。提供恢復默認的入口。用戶換了圖標后想換回來要能方便地找到。不要頻繁切換。一天切好幾次會讓用戶覺得App不穩(wěn)定。我在實際項目里的做法是默認圖標保持不變只在重大活動時通過服務端配置切換活動結(jié)束后自動恢復。同時在設置里提供圖標樣式選項讓喜歡個性化的用戶自己選。這樣既保證了運營效果又不打擾普通用戶。最后分享一個小技巧Android端可以在切換后發(fā)一個自定義廣播Intent.ACTION_PACKAGE_CHANGED部分launcher會響應這個廣播刷新圖標能減少圖標閃動的時間。但這個廣播不是所有l(wèi)auncher都認只能算錦上添花。iOS端則可以在切換完成后用UIApplication.shared.applicationIconBadgeNumber觸發(fā)一次刷新有時候能讓圖標更快更新但效果不穩(wěn)定看系統(tǒng)版本。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
色久婷婷网| 99热网精品| 欧美日韩成人免费在线| 九九热青草| 五月成人网站| 亚洲综合色丁香婷婷六月| 级人人91| 丁香久久| 草综合网| 亚洲有码在线视频| 北条麻妃九九九国产精品视频| 国产密乳av一区二区三区四区| 丁香五月婷婷深爱综合激情| 久操干| 第四色五月天| 色婷婷丁香九月| 日本天堂久久| 五月婷婷丁香| 婷婷五月天精品| 综合色播| 伊人久久大香线蕉亚洲五月天,| 色婷婷丁香九月| 五月婷婷基地| 五月综合色| 91碰人人| 亚洲爆乳无码精品AAA片蜜桃| 9久久精品| 久久五月婷综合网| 日日夜夜亚洲一区| 99色色最新视频| 五月婷久久久久综合| 五月天亭亭俺也| 五月丁香六月婷婷啪啪| 五月天婷婷激情在线色图| 五月婷婷色综图片| 狼人久草| 丁香婷婷五月综合色情| 久久性爱视频| 色色色区| 激情五月婷| 五月丁香A片| 亚洲激情网| 台湾综合丁香五月蜜桃| 久久黄A片| 五月停停999| 99热91| 国产肥白大熟妇BBBB视频| 另类 在线| 激情国产综合| Caop在线| 91丨人妻丨国产丨丝袜| 麻豆精品| 碰超99| 五月天停婷基地| 艹色18p| 婷婷六月天| 《亚洲操B久久免费在线观看,亚洲操B久久在线播放》在线播放 - 高清资源 - 97 | 伊人在线另类| 婷婷五月天毛片| 激情黄色五月天| 玖玖资源网站最新站| 新97人人上人人| 欧美日韩一区二区三区四区| 色五月av伊人| 丁香五月婷婷综合激情啪啪啪啪啪啪啪| 开心激情婷婷| 操操天堂| 丁香六月欧美| www色哟哟| 激情五月婷婷伊人| EEUSS鲁片一区二区三区| 亚洲综合另类| 婷婷色成人| 婷婷五月天网| 天天做天天爱天天爽夜夜揉| 99啪啪视频| 国产FREESEXVIDEOS性中国| 六月丁香社区| 久久黄色片| 思思久久思思| 99re在线这里只有精品视频首页| 日本天堂免费99| 五月天婷综合| 久久五月视频| 夜色.cnm| 超碰99在线观看| 琪琪色网址| 色五月丁香六月资源站| 美女五月天| 婷婷丁香五月天影院 | 久久99网| 激情丁香久久| 99热这里只有精品18| 色婷婷基地 | 成人操呦av| 色欲婷婷五月天| 毛片色五月| 色色哒五月婷婷六月丁香| 色色射| 啪啪婷婷五月天激情| 久久精品国产一区二区三区四区| 就爱操www com| 99热都是精品| 国产乱人偷精品人妻A片| 97亚洲精品| 日韩一级淫乱片一区二区三区| www. 五月. com| 日韩综合网络男女香蕉a片| 狠狠干天天内射| 五月天激情视频五月天| 天天精品视频免费观看| 色yeye色综合| 激情综合网婷婷久久| 狠狠干五月丁香综合网| 久久综合人妻| 日日操夜夜操中国无码| 婷婷激情综合色五月久久,色婷婷丁香花,丁香婷婷五月情天,久久婷婷五月综合色 | www,26uuu,c0m,色情| 婷婷五月综合性爱| 深爱激情69热| 超碰在线网站| 天天骑天天操| 天天插夜夜爽| 99在线播放| 婷婷五月视屏| 五月婷婷六月丁香综合| 99操碰| 丁香五月六月久久综合 | 五月婷婷影院| 精品无码av丁香五月激情| 色久五月| 99ri精品视频在线观看| 91xxxx九色| 91综合色| 欧美A A A A A| 97操视频| 午夜AV网| caopeng97日韩| 婷婷五月69| 99热都是精品| 春色激情第四色| 日韩AV片| 99热思思在线观看| 久久激情四射| 五月丁香六月成人| 天天舔天天摸天天射| 青柠影视免费高清电视剧| 日日夜夜爽爽| 免费国产视频| 久久五月天婷婷| 91啦丨九色丨刺激中文| 婷婷色Av| 天天色天天射天天日| 成人版视频在线观看| 色综合99| 香蕉曰比| 99操视频| 久久久五月婷婷| 久久婷婷精品| 91精品无码| 激情五月影院| 亚洲精品444久久久久久| 中文字幕丁香五月| 五月日韩中文字幕| 久久机只有这里精品| 噜噜在线| www.99热国产| 国产真实乱了老女人视频| 大香蕉婷婷丁香天堂AV| 亚洲热久久| 日本一毛片| 99热99热在线| 欧美人人女女精品综合五月天| 天天操天天草天天草天天| 亚洲日本韩国| 人妻 性久久久久久| 色婷婷电影网| 婷婷丁香五月天小说| 99视频内射三四| 婷香五月网在线| 国产67194| 国产美女视频久| 天堂久热| 大香蕉五月天婷婷丁香91| 青青草原99热| 婷婷色五月天色| 大香蕉五月丁香| 超碰99热| 99亚洲精品| 色色99色色| 人人超碰99| 99热首页| www.五月天婷婷| 婷婷五月丁香高清无码| 亚洲精品久久久久AV无码| 丁香六月色婷婷| 中文字幕在线免费观看视频| 九一牛视频探花| 婷婷久草| 婷婷色情六月| 婷婷五月俺要去| 色综合色婷色基地| 色婷婷丁香女女| VA色婷婷| 99在线免费视频| 亚洲色欲欧美一区二区三区| 色五月天丁香婷婷| 97人人操com| 九九色色| 丁香六月天| 五月婷婷啪啪综合网| 婷婷伊人视婷婷婷| 五月Huangsewang| 九九这里有精品| 色八月婷婷| 色婷婷激情视频| 99在线播放视频| 在线另类| 狠狠色噜噜狠狠狠狠狠色综合久久| 五月天激情中文字幕| 五月丁香婷婷老司机| 九九热99免费视频| 激情五月天网页| 五月天大香蕉婷| 五月婷精品| 色噜噜,噜噜色| 色欲久久99精品久久久久久| 九九99免费视频| 婷综合六月| 国产精品噜噜在线视频| 九九色婷婷五月天| 99亚洲色| 五月天婷婷影院| 99超碰在线观看| 丁香五月激情综合| 丁香六月婷婷姐网| 久久综合激情五月天| 五月激情综合网婷婷| 色噜噜在线| 亚洲碰碰碰| 久久99久久99精品免视看婷婷| 亚洲欧美一区二区三区四区爱爱动图| 婷婷爱爱蜜臀天天操| 五月综合久久| 综激情网| 激情综合网五月天| 五月婷综合网| JAPANRCEP老熟妇乱子伦视频 | 六月丁香深深爱| 天堂色色色| 欧美成人精品三区综合A片| 久久婷婷综合五月趴| 色综合久久天天综合网| 狠狠久久婷| 亚洲亚洲人成综合网络| 久久久久9999| 综合色色婷婷| 99色色色色| 袁子仪视频观看| 男人天堂 久久| 内射爽无广熟女亚洲| 91夫妻视频| 9精品在线| 激情深爱五月| 激情婷婷综合| 激情五月深爱五月观看| 激情视频网址| 久久婷婷色情7777网站| 91日韩美女被插视频| 超碰成人公开| 国产XXXX搡XXXXX搡麻豆| 91婷婷色五月| 精品久热69| 六月丁香婷婷六月激情综合| 婷婷五月开心中文字幕色| 九九九九综合| 色综合色五月| 91ncom.色| 丁香五月激情网| 婷婷中文综合网| 丁香激情网| av在线免费播放| 五月天婷婷在线播放| 99爱免费视频在线观看| 久久66精品| 天天看片日日夜夜| 91精品熟女| 精品视频这里只有精品| 狠狠艹狠狠艹| 色婷婷4| 开心激情站| WWW,五月| 99热日韩| 狠狠干五月天| 五月婷婷av| 成人国产综合| 精品久久99码| 激情综合五月天| 99无码视频| 天天干天天日天天操| 五月婷婷丁香综合| 天堂综合久| 可以免费观看的av| 棕合影院色色| 99热这里只有精品免费| 色婷婷99| 99超碰欧美| 懂色av粉嫩av蜜臀av| 国产乱子轮XXX农村| 综合激情婷婷| 久爱综合| 九九偷拍网| 婷婷综合色网| 婷婷五月天激情网址| 这里只有精彩小视频视频网站| 亚洲成人影视在线观看| 亚洲国产精品VA在线看黑人| www.99热最新视频8| a在线观看| 97操操操| 激情五月综亚网| 综合网激情五月天| 曰日爽日日操| 色色色色色色色色五月先| 狠狠色婷婷7777久| 亚洲V国产V欧美V久久久久久| 亚洲欧洲中文日韩久久AV乱码| 激情玖玖sh| 午夜少妇在线观看视频| www91色网站| 久久码久久无清| 狠狠色色综合| 婷婷色5月天在线。| 婷婷涩五月天综合| 99无码超碰| 日本三级大片| 婷婷婷婷婷婷婷婷婷婷丁香| 色伊人啪| 五月天激情婷婷五月天久久| 丁香五月天.com| 99热精品无码| 日韩欧美婷婷丁| 人妻AV在线观看| 另类色视频| 天天透天天干| 婷婷免费精品视频| 久久性爱视频网站| 五月丁香啪啪网| 色和综合网| 亚洲在线视频321| 五月丁香| 婷婷五月天无码| www.99在线| 亚洲熟妇AV乱码在线观看| 日韩中出视频| 五月天激情啪啪| 99久在线观看| 99热久| 国产色99| 婷婷激情五月天色| 色区域网站视频| 新伍月婷婷| 久久婷五月天| 精品亚洲国产成AV人片传媒| 六月色婷婷色| 五月天色综合服务平台| 五月精品| 丰滿爆乳一区二区三区| 97色色色色色色色| 婷婷丁香五月综合| 婷婷五月性感| 在线五月色播| 超碰99在线观看| Www.久久| 九九亚洲小视频| 九九色影视| 久热视频97AV在线观看| 精品无码人妻一区| 色色网站| 99热免费精品| 五月丁香色六月激情干大屄| 久久九网| 五月婷婷色丁香| 亚洲网站999| 天天日天天爱天天噪| 99热在线观看| 激情AV| 天天久| 欧美三级巜人妻互换| 亚洲第一成人无码A片| 婷婷五月花西瓜| 99这里都是精品| 操逼毛片国语对白| 射区导航| www.五月丁香| 婷婷六月综合基地| 久久婷婷草| 严洲天天插| 亚洲综合成人网| 97精品在线| 另类激情中文| 亚洲春色奇米影视| 99久久综合网| 成人在线二区| 色五月丁香在线| 五月丁香综合| 青青草性爱视频| 人人操97| 日韩综合天堂| 久草天堂| 热99国产精品| 能看的av| 这里只有在线精品| 国产FREESEXVIDEOS性中国| 色综合网上班开心婷婷久久| 婷婷综合激情| 国产精品久久久久久白浆色欲| 九九热在线精品视频| 久久久五月天婷婷成人网| www.俺去也com| 久久人妻少妇嫩草AV| 一本久久亚洲五月婷婷 | 另类图片 五月激情| 99色| 啪啪婷婷五月天激情| a网站免费观看| 久九色| 五月婷在线| 激情视频网址| 高清激情av在线观看| 99热精品在线观看| 思思99热这里只有精品6| 日韩少妇内射免费播放| 亚洲最大五月天成人网| 99re免费视频| 97久久久久| 中文激情网| 丁香五月电影| 6月丁香婷婷激情| 青柠影视免费高清电视剧| 9999色色色色| 91 原创 在线 九色| 九九这里是免费的视频5| 婷婷五月大香蕉| 婷婷天堂综合| 久久6这里只有精品| 无码成人播放器| 五月丁香六月婷婷手机无线| 九月大香蕉| 色婷婷69| 五月婷成人网| 激情五月婷婷她| 99九九精品视频| 九九热a| 噼里啪啦在线观看免费完整版视频| 色婷婷六月激情| 26uuu成人网| 欧美精品18| 99ri国产| 国产精产国品一二三在观看| 激情五月天激情五月天| www.99婷婷| 色婷婷成人做爰A片免费看网站| 天天做天天干天天综合网| 亚洲岛国电影| 狠狠爱综合| 五月色欧洲| 色原狠狠综合| 国产精品色| 九九热免费| 日本99久久| 强辱丰满人妻HD中文字幕| 色天五月天在线观看视频| 啪啪啪综合网| 免费色婷婷| 五月婷婷啪啪网| 色婷婷综合五月| 91pornav在线| 亚洲国产精品VA在线看黑人| 97操碰在线视频| www.激情五月天.com| 另类图片五月天婷婷| 久久老码第一| 婷婷性爱综合| 午夜天堂一区人妻| 婷婷色九月| 婷婷丁香成人网址| 天天爱天天做天天日| 国产超碰在线| 成人婷99最新| 五月婷婷激情综合网| 99热偷拍| 久久99jiu9| 婷婷五月天激情四射| 婷婷开心激情| 精品综合五月| 五月天色婷婷激情综合| 热99在线精品| 68热超碰在线| 国产成人精品一区二三区熟女在线| 久久国产色| 天天拍天天做视频| 99热久| 热久久婷婷| 婷婷六月色| 丁香九月婷| 婷婷5月九九| 色色色在线免费视频| www.玖玖婷婷在线| 99久操视频| 99色色网| 久久激情综合| 丁香狠狠色婷婷| 五月丁香基地| 色婷婷狠狠爱| 99久视频| 这里只有免费精品| 噜噜噜噜在线| 插插干干干色| 激情五月图| 五月婷婷三级| 天堂爱啪啪| 七七久久婷婷| 丁香五月 性爱| 99爱视频在线观看这里只有精品| 婷婷97碰碰| 狠狠做深爱婷婷久久综合一区| 六月丁香综合网| 五月丁香六月婷婷啪啪综合| 五月婷婷新网站| 久久久99久久| 激情综合婷婷| 日本久久网| 黄网在线播放| 婷婷五月激情综合| 丁香九月激情| 激情五月婷婷免费视频| 五月婷婷开心深| 五月婷婷性爱| 五月丁香六月婷婷,婷| 色噜噜狠狠色综| 91se在线视频| 99er6免费视频热播| 网色99| 日本三级日本三级三级人妇四虎| 久热99热| 性色欲情 网站| 综合亚洲五月天| 日韩二区搞逼插逼毛片| 影音先锋91视频| 超碰A V在线| 色婷婷色| 色一情一乱一乱一区91Av| 丁香五月激情六月欧亚激情综合导航| 婷婷激情五月天综合| 欧美丁香婷婷天天操| 97色片| 久久婷婷伊人| 丁香亭亭久久| 欧美性爱特黄一级aaaassss| 操一操| 九九热99热| 日日日日日| 伊人激情啪啪| 疯狂做受XXXX高潮A片| 婷婷六月天| 五月天婷婷色播综合在线| 91大屁股在线| 久久人视频| 狠狠情色| 激情婷婷内射| 婷婷五月天综合小说网| 婷婷中文字幕| 啪啪综合| 年轻的妺妺伦理HD中文| 蜜乳AV成人| 婷婷五月色影视先锋| 伊人激情| 婷婷五月色网| 无码 色| 97人人超| WWW、日本色丁香、co m| 丁香六月婷| 五月婷婷黄色| 亚洲五月天婷婷综合| 这里只有精品视频免费在线观看| 婷婷五月天亚洲| 午夜不卡久久精品无码免费| 婷婷五月色惰| 99操| 婷婷五月综合激情免费视频| 99热国产精品| 色婷婷丁香女女| 色婷婷五月影院| 婷婷五月丁香影院| 噜噜狠狠色综合久| 99久久99综合| 激情综合无码| 激情综合五月婷婷六月丁香| 激情五月天视频| 毛片九九九九九九| 五月婷婷视频啪啪美女| 国产成人av在线播放| 伊人高清无码| 只有精品在线观看| 天天色99| 91n网站cad入口在线观看| 99热这里只有精品268| 五月丁香综合在线| 久久色六月| 激情婷婷色色| 丁香六月久久| 五月天婷婷色综合| 激情综合网五月天天| 色色色婷| 综合网网欲色| 亚洲精色| 亚洲A片成人无码久久精品青桔| 婷婷丁香激情综合色情| 夜夜爽天天干| 日韩欧美成人网| 久久五月天合网| 开心五月综合激情网| 丁香九色不卡aaa| 婷婷五月永远18免费久久久| 久久与婷婷| 97色久| 六月丁香开心婷婷欧美| 另类小说五月天激情| 五月天婷婷激情| 久久婷婷啪啪视频| 五月丁香激情综合啪啪| 色青五月天| 婷婷五月天日本无码| 少妇AB又爽又紧无码网站| 激情九月婷婷| 99re免费精品视频| 亚洲无码成人| 六月久久婷婷| 97热精品| www.日韩国产| 日韩欧美一道四区中文字幕| 99热综合网| 日韩AV在线电影| 九九热视频免费| AV片一区在线观看| 婷婷激情综合网| 国产精品天天狠天天看| 日韩五月天婷婷| 性做久久久久久久免费看| 狠狠舔| 五月婷激情| 久草天堂| 天天天天干| 激情的五月婷婷蜜桃| 狠狠综合网| 少妇丁香婷婷| 婷婷丁香六月| 丁香五月丁香伊人| 依人大香蕉在钱1| 嫩BBB槡BBBB搡BBBB视频| www久久久久久久久久久| 国产精品色色色色| 97综合视频在线| 99九九精品视频| 1024在线视频| 五月婷婷九| 五月停停色色丁香| 泰州成人视频| 五月天成人网婷婷| 91re色综合视频| 色婷婷五月天视频在线| 综合五月丁香六月婷婷| 高清不卡一区| 激情的五月婷婷蜜桃| 99视频| 丁香久久久| 欧美啪啪五月天| 欧美在线97| 色婷婷黄色网络| 无码激情AAAAA片-区区| 婷婷五月天狠狠| 丁香六月| 欧美性爱五月天| 丁香五月天激情综合网| 大香蕉久久久久久久久| 9久热免费视频99| 欧美天天草人人草| 深爱五月激情| 婷婷九月激情| 免费无码毛片一区二区A片| 思思热在线免费视频| 久久五月婷婷视频| 久久久久久人妻| 99成人无码| 97热久久| 99re在线播放| 精a品a| 亚洲久热| 亚洲av综合在线| 淫视馆AV在线| 狠狠干在线视频| 久久综合五月| 99无码视频| 丁香六月婷婷色XXXXX| 久热久| 丁香色婷婷色手机免费在线| 成人综合视频在线| 青青草蜜臀| 激情婷婷九月| 嫩草AV久久伊人妇女超级A| 天天色天天爱天天爱天天爱y| 9操在线| 艹B高清无码| 91丁香五月| 五月丁香六月合| a九九热www| 久久婷婷九月国产精品| 中文字幕在线资源| 久久精品亚洲热| 婷婷色亚洲| 激情丁香五月天图片| 久久婷婷精品| 91久久九久久九久久九久久九久久| 婷久看人爽| 欧美色图天堂网色| 99在线资源视频| 婷婷香五月天| 五月丁香亭亭| 激情综合五月色丁香婷婷 | 九九人人操| 色九月婷婷丁香| 丁香婷婷五月综合影院| 色婷婷五月天亚洲| 国产精品色婷婷99久久精品| 操操综合网婷婷| 久久婷婷色| 99九九视频| 99热国产在线| 五月丁香婷婷久久| 激情小说五月天社区丁香| 久热天堂| 精品热青草| 五月婷婷六月丁香| www.激情| 在线观看av网站| 亚洲综合激情五月| 96性爱视频| WWW,激情五月天,COM| 六月色激情| 亚洲中文字幕翔田千里| 欧美性生交XXXXX无码小说| 久久综合99| 婷婷激情人妻| 色婷婷亚洲婷婷| 亚洲五月天婷婷在线| 丁香五月天在线直播观看| 激情五月婷黄版| 婷婷色丁香五月| 超碰a女人的天堂| 丁香花操逼| 日本色超碰| 3p九色在线| 久久综合久色欧美综合狠狠| 婷婷大香蕉| ss99热| 青青草a在线| 开心五月婷婷激情| 久久色情| 国产免费一区二区在线A片视频| 亚洲一区国产传媒| 色色九九五月天 | 色色网五月激情| 综合五月激情网| 日本欧美国产| 婷婷六月色播| 夜丁香五月婷婷| 99热这里只有精品在线播放| 99re最新地址| 丁香五月婷在线观看| 五月婷婷欲色| 啪啪亚洲综合| 婷婷深爱五月| 操逼巨乳91| 丁香五月色网| 亚洲高清在线| 热久精品| 少妇做爰免费视看片| 极品少妇XXXX精品少妇偷拍| 性色做爰片在线观看WW| 三级av在线| 婷婷五月天av小说| 99热精品网| 99热丁香五月| 99在线播放视频| 久这里只有精品99| 狠狠肏综合网| av性爱在线| 五月开心激情| 久久伦乱| 久色| 青青草青青草五月天| 99精品丰满| 99热天堂| 五月五婷婷网| 26UUU精品一区二区c〇m| 久热网在线视频| 中文字幕激情综合| 五月天婷婷小说| 日韩久久成人| 青青草Avb在线| 亚洲天堂爱爱| 九九成人高清视频| 人人爱人人添| 99日在线视频| 激情内射人妻1区2区3区| 人人综合色| 丁香六月婷婷久久高清| 五月天婷婷日日爱| 天天日天天干天天插天天射| 无码色| 国产这里只有精品| 五月婷婷 婷婷五月 一区二区 久久久 | 99这里只有精品| 国产一级黄色影片,| www.综合久久.com| 爱之国产色情综合| 99热这里只有精品在线播放 | 91久久婷婷| 久久久国产精品黄毛片| 色婷久| 丁香婷婷五月天色综合| 亚洲天堂aaa| 婷婷综合网| 香蕉视频性爱BB做爱| 日良久久| 久久九九蜜| 色综合九九| 亚洲精品a成人在线播放| 怎么样可以看免费的一级av| 亚洲热久| 婷婷5月天激情综合| 色噜噜狠狠插综合| 五月天久久婷婷| 婷婷伊人久久无码色五月| 婷婷综合色图| 久久人妻高清中文| 久久婷综合| 五月色情精品| 9久热| 五月天激情小说欧美激情| 色区久久| 丁香五月天激情四射网络不好 | 色综合色综合色综合高潮| 天天色色天天| 国产精品色色| 色色综合激情| 五月天婷婷深深爱| 色色五月天激情| 欧美日韩一区二区三区四区| 这里只有精品在线视频精品| 丁香六月婷婷激情| 免费做A爰片77777| 色欧美影院| 天天视频亚洲| 五月婷婷激情| 站长推荐无码播放| 亭亭色天香| 色五月综合网| 丁香视频| 激情二色月| 日本天天操| 婷婷综合一二三| 五月天另类小说久久小说网| 三级三久久线久久99久目本WW| www亚洲无码| 丁香五月天激情AV| 九九AV| 成人午夜无码视频| 色9999综合久久| 襙比视频| 国产精品国产| 99久久終合| 狠狠狠五月婷婷六月丁香| 久久丁香五月| 久久综合中文| 在线观看婷婷5月| 超碰国产一区| 99精品久久久久久久婷婷久久| 婷婷六月丁| 26UUU欧美激情一区二区| 毛片色五月| 一级内射毛片| 亚洲瑟瑟精品在线| 嫩草AV久久伊人妇女超级A| 激情五月天婷婷图| 色婷| 久99久在线| www.婷婷,com| 五月丁香久久综合色| 丁香婷婷深情五月亚洲| 亚洲精品无码A片一区二区| 思思热性操| 五月激情综合网| 99色色热| 久久XX| 超碰免费在线| 五月在线| 亚州精品色情无码A片| 91蜜桃婷婷狠狠久久综合9色| 丁香婷婷五月综合影院| 色噜噜狠狠色综合网| 日本在线观看aaa 99| 亚洲性色XXXXX| 九九综合九| 天天操夜夜玩!| 国产日产亚洲系列最新| 天天操天天操综合| 久久一级AV| 六月色国内综合| 欧美婷婷色| 激情小说 五月天| 五月天社区婷婷| 丁香六月五月婷婷| 久久精品天| 一本色道久久综合狠狠躁小说| 久久九九婷婷| 五月天播播| 亚洲情色一区| www.婷婷五月| 噜综合| 成人做爰A片免费看视频| 五月天久久婷婷婷| 中文字幕操比影片| 欧美五月婷婷| 久热超碰91| 丁香五月五月婷婷| 久久激情综合| 蒲京久久无码视频| 婷婷五月色激情欧美激情| 色九月欧美| 夜夜谢天天干| 激情五月婷婷伊人| 婷婷新网址| 99riAv1国产在线观看| 激情伊人| 久久视频在线视频| 丁香五月婷婷综合网| 久久玖玖综合| 六月婷婷综合| 六月天六月婷| 小泽玛利亚视频一区二区| 婷婷午夜激情| 人妻内射麻豆视频| 五月婷婷 自拍| 婷婷五月天激情电影| 五月婷婷综合热| 91.www综合| 99热这里只有精品99| 婷婷月五天在线在线看| 国产黄大片在线观看画质优化| 99热这里只有精品2| 爆乳熟女一区二区三区爆乳| 五月丁香激情综合| 色综合色综合色综合| 99久re热| 国产日韩精品SUV| 五月婷婷六月丁香综合在线| 黄色片区子| 成人国产欧美大片一区| 五月丁香六月情| 日日噜人人人做人| 狠狠色综合无线观看| 97人人做| 九九色99| 欧美天堂久久| 久久一级AV| 色色丁香五月天| 丁香婷婷六月天| 激情久久久久久久久久| 99精品国产乱码久久久人妻| 色婷婷五月天偷拍| 五月婷婷久久激情| 1234操逼网| 色色无码| 99热免费精品| 亚洲瑟瑟精品在线| AV电影在线播放| 亚洲成人在线在线| 九九99精品视频| 色五月五月丁香| 99男人的天堂| 97婷婷五月| 日韩十国产极品久久| 97干欧美| 婷婷综合五月天| 欧美天天干天天草| 另类激情五月天。| 亚洲区1| 丁香五月大香蕉| 婷婷 色 丁香 夜| 天天cha成人综合网| 91人人操人人| 天天久久婷婷| 国产人妻777人伦精品HD| 综合激情五月婷婷| 婷婷色情小说| 丁香五月天偷拍| 九九色色色| 超碰国产一区| 亚洲情综合五月天| www.婷婷五月天.com| 国语精品探花| AV天堂淫乩| 99热精品在线| 久碰视频| 性生活视频98791| 亚洲久热无码| 五月丁香六月婷婷亚洲激情综合| 五月丁香免费视频| 九久久精品视频99| 国产在线网址1| 国产AV一区二区三区日韩| AA丁香综合激情| 婷婷六月激情综合| 久久一二三视频| 69五月天视频| 丁香5月激情网| 超碰超碰在线| 五月婷激情影院| 丁香五月婷婷激情蜜桃| 久久久久久久11111111111| 99亚洲天堂| 99久久99九九九99九他书对| 婷婷丁香六月天| 五月天婷婷人妻| 婷婷免费无视频| 五月在在观看| 婷婷激情综合色五月久久,色婷婷丁香花,丁香婷婷五月情天,久久婷婷五月综合色 | 激情五月天婷婷直播| 99热销国产这里有精品| 婷婷综合偷拍| 丁香六月综合激| 丁香婷婷六月| 五月婷婷综合在线视频| 亲子乱AV-区二区三区| 婷婷99狠狠躁天天久久久九九九| 色婷婷六月| 日本欧美成人片AAAA| 婷婷激情五月| 亚洲亚洲人成综合网络| 亚洲婷婷五月天| www色婷婷| www.色婷婷| 图片区 小说区 区 亚洲五月| 天天操天天操天天操天天操天天操 | 综合深爱五月| 五月天另类图片| 岛国AV网| 色丁香五月| WWW.17C亚洲精品| 色综合大香蕉| 成人亚洲精品| 五月婷婷av| 香蕉AV福利精品导航| 欧美人与性动交CCOO| 男同91 | 91人人操人人| 99视频精品全部免费看| 欧美成人无码一区二区三区| 日韩欧美一区二区三区四区| 秋霞学生妹一二级| 91大屁股| av五月天婷婷丁香| 五月激情小说| av九九| 久久久18| 久久婷婷老| 亚洲免费视频网站| 婷婷色色宗合网| 丁香六月婷婷色播| 色噜噜狠狠色综合日日| 男人天堂99| Av性爱网站| 国产在线另类五月婷婷| 欧美色骚婷婷五月天| 国产片色| 色综合五月| 99色色| 99久久网站| 精品人妻一区二区三区在| 人人操碰| 在线另类视频| 日本本土色网第一区| 久久综合天天综合| 中文字幕 中文字幕明步| 婷婷久久大香蕉| 熟妇人妻中文字幕无码老熟妇| 665566 无码| 97婷婷丁香| 日韩成人网站精品久久大全| 国产精品蜜臀99| 99久精品视频| 狠狠精品干练久久久无码中文字幕| 日韩丁香涩| 91porn一起草| 婷婷六月丁香激情综合| 天天摸色吧天天摸色吧| 91精品丝袜久久久久久| 国产精品久久久爽爽爽麻豆色哟哟 | 色欲一区二区三区精品A片| 五月天婷婷色综合| 91碰| 新五月天婷婷激情电影| 五月天婷久精视频| 久久久久久久久久8888| 激情综合另类| 91婷婷| 丁香色综合| 色婷婷五月综合| Caoub青青超碰 | 欧美激情久| 日日日,com| 色综合激情| 天天日天天舔| 大香久久伊人网| 久久中文人妻系列| 色色亚洲五月天| 色情综合网| 色色丁香五月天社区| 蜜臀A∨在线水帘洞| 五月天激情综合| 九九碰九九爱97超碰| 六月婷综合| 操操碰| 激情五月丁香五月| 丁香婷婷啪啪| 九九99香蕉在线视频播放| 色五月激情综合| 9久久久久久久久久久| 久久九九Com| 99在线er热| 日日干日日| 中国丰满熟女A片免费观| 久久色天堂| 怡红院一二三| 色五月激情五月| www.婷婷五月| 丁香六月欧美| 99国产精品白浆在线观看免费| 999婷婷综合| 精品人妻在线| 99精品久久久久久久婷婷久久| 另类专区在线| 五月婷婷丁香五月| 西瓜美女a片| 伊人99热| 538任你爽视频不一样的| 亚洲国产色色| 日日日日日| 99精品在线| 丁香五月婷婷偷拍| 丁香六月激情国产| 婷婷五月天少妇| 综合网色| 日韩婷婷| 99精品一二三四视频| 伊人超碰在线| 五月丁香六月婷婷亚洲| 精品无码久久久久久久久| 国产精品人妻欲求不满| 99热只有| 青青草五月天| 深爱五月最新网址| 精品国产乱码久久久久夜深人妻| 五月丁香啪啪| 丁香色色色| 中文字幕AV网址| 综合五月婷婷| 九九伦子片| 天天干com| 激情性爱五月天网页| 成人小说 五月天 婷婷| 五月深爱婷婷| 99这里只有精品| 丁香五月激情棕合| 中文AV在线观看| 亚洲精品中文字幕成人片| 天天拍久久| 色色欧美色色| 狠狠狠狠操| 国产精产国品一二三在观看| 热的国产,热的综合,热的有码 | 五月婷婷激情网| √天堂资源在线人妻熟女| 五月婷婷六月色| 久操97| 久久久久人妻| 欧美图片丁香五月天| 色婷婷色99国产综合精品| www. 五月. com| 婷婷五月天伊人| 99视频网址| 久9热视频| aa久久| 人人摸人人搞| 婷婷四月 成人 狠狠干| 99这里只有精品| 天天操天天爽天天爱| 久久小说| 五月天婷婷久久综合| 婷婷丁香激情五月天色色色| 五月婷婷我| 午夜福利8055| 日韩精品一品二区三区的使用体验| 97成人在线视频精品| 五月天丁香成人社| 中文字幕在线免费观看视频| 思思99热| 五月天成人伊人| 4399无码视频二区| 亚洲激情婷婷| 色噜噜狠狠色综合成人99| 五月婷婷激情| 97干在线视频| 97色色网| 天天日天天做天天操| 色欲色香,www,com| 亚洲成人中心| 五月天日日操夜夜操| www久| 久热只有这里精品| 色婷婷色综合激情91| 97人妻碰碰中文无码久热丝袜| 蜘蛛女免费观看完整版高清电影| 国产精品日本一区二区在线播放| 思思热精品在线观看| 丁香五月激情综合婷综| 9+1视频网址| 日本成人噜噜噜噜噜| 激情五月最新网址| 草草操操| 69婷婷丁香午夜| 中文字幕日产A片在线看| 伍月婷丁香花全集| 国产精品视频免费看| 91狠狠色丁香婷婷综合久久精品| 色性五月天| 9有码中文| 五月综合激情婷婷六月色窝| 五月婷婷丁香色吧网| 五月丁香六月婷婷成人| 欧洲色区| 桃色五月天| 婷婷五月小说色综合| 五月天操逼激情| 丁香五月影视| 亚洲无码成人性爰网| 五月婷婷久久久久| 激情网五月| WWW,婷婷,COM| 草草操操| 综合 激情 婷婷| 色久女| 五月丁香激情欧洲啪啪| 久久99婷婷|