久久亚洲成a人片熟女精品色一区二区三区|国产精品视频第一精品视频|av天堂热无码手机版|亚洲?v无码久久无遮挡|国产精品偷伦视频免费观看国产|麻豆国产自产精品丰满熟妇|av无码av不卡一区二区|久久亚洲精品中文字

ARTICLE DETAIL

資訊詳情

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

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

Unity手游動態(tài)圖標(biāo)雙端工程化方案:Android activity-alias與iOS setAlternateIconName實戰(zhàn) 1. 動態(tài)圖標(biāo)這件事到底在解決什么問題做過手游運營的人都有一個共識App圖標(biāo)是成本最低、觸達(dá)最廣的運營位。它不需要用戶打開游戲不需要推送權(quán)限甚至不需要用戶在線——只要圖標(biāo)躺在手機桌面上每一次解鎖屏幕都是一次曝光。春節(jié)換紅底、周年慶換金色、聯(lián)動活動換角色立繪這套玩法在國內(nèi)頭部手游里早就跑通了。但問題在于Unity作為跨平臺引擎本身并沒有提供一套統(tǒng)一的動態(tài)圖標(biāo)API。Android和iOS兩端的實現(xiàn)路徑完全不同Android靠activity-alias做組件切換iOS靠setAlternateIconName做系統(tǒng)級替換。更麻煩的是Unity的構(gòu)建流程會覆蓋原生工程配置你手動改的東西下一次出包就沒了。所以真正要解決的不是怎么換圖標(biāo)這個單點問題而是怎么在Unity的構(gòu)建管線里把雙端的動態(tài)圖標(biāo)能力做成可配置、可自動化、不丟配置的工程化方案。這篇文章適合三類人看一是正在做手游運營功能開發(fā)的同學(xué)二是需要給項目加動態(tài)圖標(biāo)但不知道從哪下手的Unity客戶端三是想了解Androidactivity-alias和iOS alternate icon底層機制的移動端開發(fā)者。我會把兩端的原理、Unity側(cè)的工程改造、構(gòu)建腳本、踩過的坑全部攤開講代碼和配置都可以直接抄。先說結(jié)論Android端用activity-alias方案切換時會有一次桌面圖標(biāo)的閃動系統(tǒng)會短暫移除再添加組件但兼容性最好從Android 5.0到14都沒問題iOS端用setAlternateIconName切換時系統(tǒng)會彈一個您已更改圖標(biāo)的提示框這個提示無法繞過除非用私有API不建議。兩端都需要在Unity構(gòu)建后處理原生工程文件這部分我用Editor腳本自動化掉了。2. 雙端方案選型為什么Android用activity-aliasiOS用setAlternateIconName2.1 Android端activity-alias是唯一靠譜的路Android換圖標(biāo)這件事網(wǎng)上能搜到好幾種說法我一個個說清楚為什么最后選了activity-alias。第一種是直接改AndroidManifest.xml里application的android:icon屬性然后重新安裝。這顯然不行用戶不可能為了換個圖標(biāo)重新下載APK。第二種是用PackageManager.setComponentEnabledSetting動態(tài)啟用/禁用組件。這個API本身沒問題關(guān)鍵在于你要啟用/禁用什么組件。Android的桌面圖標(biāo)本質(zhì)上是一個activity組件帶LAUNCHERcategory的那個你沒法直接替換一個activity的圖標(biāo)但你可以通過activity-alias創(chuàng)建多個別名每個別名指向同一個主Activity但各自帶不同的android:icon。然后通過setComponentEnabledSetting控制哪個別名處于啟用狀態(tài)。具體來說主Activity保持android:enabledfalse且不帶LAUNCHER category然后為每個圖標(biāo)創(chuàng)建一個activity-alias只有當(dāng)前選中的那個alias是enabledtrue且?guī)AUNCHER category。切換圖標(biāo) 禁用舊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這里有幾個必須注意的細(xì)節(jié)我踩過坑主Activity的intent-filter里不能有LAUNCHER category否則桌面上會出現(xiàn)兩個圖標(biāo)。只保留MAIN action即可。每個alias的android:name建議用相對路徑如.icon_default這樣會自動拼上包名避免硬編碼包名出錯。android:enabled的初始狀態(tài)默認(rèn)圖標(biāo)那個alias設(shè)為true其他全部false。這個狀態(tài)會被系統(tǒng)持久化用戶重啟手機也不會丟。切換時用PackageManager.setComponentEnabledSetting必須傳DONT_KILL_APP標(biāo)志否則切換的瞬間你的進(jìn)程會被殺掉用戶體驗極差。// 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 ); } // 啟用目標(biāo)alias pm.setComponentEnabledSetting( new ComponentName(pkg, pkg . aliasName), PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP ); }實測下來這個方案在小米、華為、OPPO、vivo、三星的主流機型上都能正常工作。唯一的問題是切換瞬間桌面圖標(biāo)會有一個短暫的消失再出現(xiàn)的過程這是系統(tǒng)launcher重新加載組件導(dǎo)致的無法避免。我的做法是在切換前給用戶一個loading提示切換完成后彈一個Toast讓用戶知道發(fā)生了什么。2.2 iOS端setAlternateIconName的能與不能iOS從10.3開始提供了setAlternateIconName:completionHandler:這個API允許App在運行時切換圖標(biāo)。但蘋果對這個功能加了很多限制你必須提前知道第一所有備選圖標(biāo)必須在Info.plist里預(yù)先聲明。你不能在運行時動態(tài)生成圖標(biāo)只能從預(yù)先打包進(jìn)Bundle的圖標(biāo)里選。聲明方式是在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第二圖標(biāo)文件必須放在Bundle根目錄下不能放在Assets.xcassets里。這是最容易踩的坑。Xcode的Asset Catalog雖然方便但setAlternateIconName只認(rèn)Bundle根目錄下的png文件。你需要把備選圖標(biāo)以AppIcon_Festival60x60.png、AppIcon_Festival60x602x.png、AppIcon_Festival60x603x.png的命名方式直接拖進(jìn)Xcode工程選擇Create folder references而不是Create groups。第三切換時會彈系統(tǒng)提示框。這是iOS的硬性行為提示內(nèi)容大概是您已更改XXX的圖標(biāo)。這個提示無法通過公開API繞過。有些團(tuán)隊用UIApplication.shared.isStatusBarHidden之類的hack去遮蓋但在新版本iOS上已經(jīng)失效了不建議折騰。第四切換必須在主線程調(diào)用且completionHandler里要處理錯誤。如果圖標(biāo)名不存在或者文件缺失會返回error。// iOS側(cè)切換代碼 - (void)switchIcon:(NSString *)iconName { if (![UIApplication sharedApplication].supportsAlternateIcons) { NSLog(當(dāng)前設(shè)備不支持切換圖標(biāo)); return; } NSString *targetName [iconName isEqualToString:default] ? nil : iconName; [[UIApplication sharedApplication] setAlternateIconName:targetName completionHandler:^(NSError * _Nullable error) { if (error) { NSLog(切換圖標(biāo)失敗: %, error.localizedDescription); } else { NSLog(切換圖標(biāo)成功); } }]; }注意傳nil表示恢復(fù)默認(rèn)圖標(biāo)。另外supportsAlternateIcons這個屬性在iOS 10.3才可用低版本要加可用性判斷。2.3 兩端方案對比對比項Android (activity-alias)iOS (setAlternateIconName)最低支持版本Android 5.0iOS 10.3圖標(biāo)來源打包進(jìn)APK的mipmap資源打包進(jìn)Bundle的png文件切換時系統(tǒng)提示無但桌面圖標(biāo)會閃動有彈窗無法繞過是否需要重啟App否否圖標(biāo)數(shù)量限制理論上無限制建議不超過10個審核風(fēng)險無需在審核時說明用途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并拷貝圖標(biāo)文件。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設(shè)置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)圖標(biāo)配置注入完成); } 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)先級設(shè)為1000確保在其他后處理腳本之后執(zhí)行處理了Gradle工程和直接APK兩種構(gòu)建模式用XmlDocument操作而不是字符串替換避免格式錯誤。3.3 iOS側(cè)PostprocessBuild修改Info.plist并拷貝圖標(biāo)iOS這邊更麻煩一點因為除了改Info.plist還要把圖標(biāo)文件拷貝到正確的位置。Unity構(gòu)建出來的Xcode工程Info.plist在Unity-iPhone/Info.plist圖標(biāo)需要拷貝到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); // 主圖標(biāo) PlistElementDict primaryIcon bundleIcons.CreateDict(CFBundlePrimaryIcon); PlistElementArray primaryFiles primaryIcon.CreateArray(CFBundleIconFiles); primaryFiles.AddString(AppIcon60x60); // 備選圖標(biāo) 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); // 拷貝圖標(biāo)文件到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)圖標(biāo)配置注入完成); } 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(圖標(biāo)文件不存在: 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安全得多。圖標(biāo)文件我放在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í)行圖標(biāo)切換: 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(切換圖標(biāo)失敗: %, error); }]; }); } }這個.mm文件需要放在Assets/Plugins/iOS/目錄下Unity會自動把它編譯進(jìn)Xcode工程。4. 實操全流程從資源準(zhǔn)備到出包驗證4.1 圖標(biāo)資源規(guī)范與準(zhǔn)備Android和iOS對圖標(biāo)尺寸的要求不一樣我整理了一個對照表平臺用途尺寸命名規(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的圖標(biāo)放在Assets/Plugins/Android/res/下Unity構(gòu)建時會自動合并到APK的res目錄。注意不要放在Assets/Resources/下那樣不會被打進(jìn)原生資源。iOS的圖標(biāo)命名有個坑CFBundleIconFiles里寫的是AppIcon_Festival60x60系統(tǒng)會自動去找AppIcon_Festival60x60.png、AppIcon_Festival60x602x.png、AppIcon_Festival60x603x.png。所以命名必須嚴(yán)格一致大小寫敏感。4.2 構(gòu)建腳本的完整配置把上面兩個Postprocessor腳本放到Assets/Editor/目錄下Unity會自動識別。但有幾個配置項需要確認(rèn)Player Settings → Publishing Settings → Build如果勾選了Custom Main ManifestUnity會用你提供的manifest而不是自動生成。這種情況下你需要手動在自定義manifest里加aliasPostprocessor腳本要相應(yīng)調(diào)整。Player Settings → Other Settings → Package Name確保包名正確alias的name會基于包名生成。iOS Player Settings → Icon這里配置的是主圖標(biāo)備選圖標(biāo)不走這里走我們的Postprocessor。我建議的做法是不勾選Custom Main Manifest讓Unity自動生成然后Postprocessor在構(gòu)建后注入。這樣最省心。4.3 切換邏輯的時機與狀態(tài)管理圖標(biāo)切換不是隨便什么時候都能調(diào)的。我的經(jīng)驗是不要在App啟動時立即切換。啟動階段系統(tǒng)資源緊張切換容易失敗。建議在進(jìn)入主界面后延遲1-2秒再執(zhí)行。切換狀態(tài)要持久化。用PlayerPrefs記錄當(dāng)前圖標(biāo)名下次啟動時對比服務(wù)端下發(fā)的配置如果一致就不重復(fù)切換避免不必要的閃動和彈窗。切換前檢查網(wǎng)絡(luò)和資源。如果圖標(biāo)資源是熱更下載的Android可以iOS不行因為圖標(biāo)必須打包進(jìn)Bundle要確保下載完成再切換。public class IconSwitchController : MonoBehaviour { private const string ICON_KEY current_icon_name; void Start() { Invoke(CheckAndSwitchIcon, 2f); } private void CheckAndSwitchIcon() { string serverIcon GetServerIconConfig(); // 從服務(wù)端或本地配置讀取 string localIcon PlayerPrefs.GetString(ICON_KEY, default); if (serverIcon ! localIcon) { DynamicIconManager.SwitchIcon(serverIcon); PlayerPrefs.SetString(ICON_KEY, serverIcon); PlayerPrefs.Save(); } } }4.4 出包驗證清單出包后別急著發(fā)按這個清單過一遍Android安裝后桌面圖標(biāo)是否正常顯示默認(rèn)圖標(biāo)用adb shell dumpsys package 包名查看alias的enabled狀態(tài)是否正確。Android調(diào)用切換后桌面圖標(biāo)是否變成目標(biāo)圖標(biāo)殺掉App重開圖標(biāo)是否保持Android切換時App是否被殺掉如果被殺檢查DONT_KILL_APP標(biāo)志是否傳了。iOS安裝后圖標(biāo)是否正常切換時是否彈出系統(tǒng)提示切換后圖標(biāo)是否變化iOS殺掉App重開圖標(biāo)是否保持恢復(fù)默認(rèn)圖標(biāo)是否正常雙端連續(xù)切換多次是否有異常圖標(biāo)資源是否都正確打包5. 常見問題與排查技巧實錄5.1 Android端典型問題問題一桌面上出現(xiàn)兩個圖標(biāo)。這是最常見的問題。原因通常是主Activity的intent-filter里還保留著LAUNCHER category。檢查AndroidManifest.xml確保主Activity的intent-filter里只有MAIN action沒有LAUNCHER category。另外檢查是否有多個alias同時處于enabled狀態(tài)。問題二切換后圖標(biāo)沒變但alias狀態(tài)變了。這種情況通常是launcher緩存導(dǎo)致的。不同廠商的launcher刷新機制不一樣小米和華為一般會立即刷新OPPO和vivo可能有延遲。解決辦法是切換后發(fā)一個廣播通知launcher刷新但這不是標(biāo)準(zhǔn)API各廠商支持情況不一。我的做法是切換后彈一個Toast提示用戶圖標(biāo)將在幾秒后更新給用戶預(yù)期。問題三切換時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的部分機型可能有兼容性問題。如果目標(biāo)用戶里老機型占比高建議做降級處理檢測切換是否成功失敗則提示用戶手動更換。5.2 iOS端典型問題問題一切換時報錯icon name not found。檢查三件事Info.plist里CFBundleAlternateIcons的key是否和傳入的name一致圖標(biāo)文件是否在Bundle根目錄下不是Assets.xcassets文件名是否和CFBundleIconFiles里聲明的一致包括2x、3x后綴。問題二切換時彈窗提示您已更改圖標(biāo)能否去掉不能。這是iOS的系統(tǒng)行為公開API無法繞過。有些團(tuán)隊嘗試用UIAlertController的私有方法去攔截但在iOS 13以后已經(jīng)失效。接受它或者在產(chǎn)品層面引導(dǎo)用戶比如切換前先彈一個自定義提示說明會有一個系統(tǒng)彈窗。問題三審核時被拒說動態(tài)圖標(biāo)功能不明確。App Store審核指南對動態(tài)圖標(biāo)沒有明確禁止但如果你的App切換圖標(biāo)后功能沒有變化審核員可能認(rèn)為這是無意義的功能。建議在審核時提供說明動態(tài)圖標(biāo)用于節(jié)日活動或用戶個性化并在App內(nèi)提供明確的切換入口。問題四iPad上不生效。iPad的圖標(biāo)尺寸和iPhone不一樣CFBundleIconFiles需要額外聲明iPad的尺寸如AppIcon_Festival76x76。如果只聲明了60x60iPad上可能不生效。建議同時聲明iPhone和iPad的圖標(biāo)尺寸。5.3 雙端通用問題速查表問題現(xiàn)象可能原因排查方向解決方案切換后圖標(biāo)不變資源未打包檢查APK/Bundle里是否有圖標(biāo)文件確認(rèn)資源路徑正確切換后App重啟未傳DONT_KILL_APP檢查Android代碼加上標(biāo)志iOS切換報錯plist配置錯誤檢查CFBundleAlternateIcons修正key和文件名桌面出現(xiàn)雙圖標(biāo)LAUNCHER category重復(fù)檢查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上會被當(dāng)成不同的組件處理。第二個坑是iOS圖標(biāo)文件放進(jìn)了Assets.xcassets。Xcode的Asset Catalog會把圖標(biāo)編譯成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. 工程化擴展與進(jìn)階玩法6.1 圖標(biāo)配置表驅(qū)動硬編碼圖標(biāo)名不是好做法。我建議用ScriptableObject做配置表把圖標(biāo)名、資源路徑、生效時間、平臺限制都配置化。[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 服務(wù)端下發(fā)與灰度圖標(biāo)切換的配置最好走服務(wù)端下發(fā)這樣可以隨時調(diào)整活動時間不需要發(fā)版。服務(wù)端返回一個JSON客戶端解析后對比本地狀態(tài)決定是否切換?;叶确矫婵梢园从脩鬒D哈希或者渠道包來控制哪些用戶參與。6.3 與熱更系統(tǒng)的配合Android的圖標(biāo)資源可以走熱更因為alias的icon屬性可以指向下載到本地的資源實際上不行alias的icon必須是打包進(jìn)APK的資源。所以Android的備選圖標(biāo)也必須預(yù)先打包進(jìn)APK不能熱更。這一點和iOS一樣。所以動態(tài)圖標(biāo)的動態(tài)指的是切換時機動態(tài)而不是圖標(biāo)資源動態(tài)。這個認(rèn)知很重要很多團(tuán)隊一開始以為可以熱更圖標(biāo)結(jié)果發(fā)現(xiàn)不行。如果確實需要大量圖標(biāo)比如用戶自定義圖標(biāo)Android可以通過PackageManager的setComponentEnabledSetting配合動態(tài)生成的alias來實現(xiàn)但需要反射調(diào)用隱藏API風(fēng)險較高不建議。6.4 用戶體驗優(yōu)化建議切換圖標(biāo)這件事用戶感知很強但也很容易做成騷擾。我的建議是給用戶選擇權(quán)。不要強制切換在設(shè)置里提供圖標(biāo)選擇入口讓用戶自己選。切換前告知。尤其是iOS系統(tǒng)彈窗會讓用戶困惑提前用自定義彈窗說明。提供恢復(fù)默認(rèn)的入口。用戶換了圖標(biāo)后想換回來要能方便地找到。不要頻繁切換。一天切好幾次會讓用戶覺得App不穩(wěn)定。我在實際項目里的做法是默認(rèn)圖標(biāo)保持不變只在重大活動時通過服務(wù)端配置切換活動結(jié)束后自動恢復(fù)。同時在設(shè)置里提供圖標(biāo)樣式選項讓喜歡個性化的用戶自己選。這樣既保證了運營效果又不打擾普通用戶。最后分享一個小技巧Android端可以在切換后發(fā)一個自定義廣播Intent.ACTION_PACKAGE_CHANGED部分launcher會響應(yīng)這個廣播刷新圖標(biāo)能減少圖標(biāo)閃動的時間。但這個廣播不是所有l(wèi)auncher都認(rèn)只能算錦上添花。iOS端則可以在切換完成后用UIApplication.shared.applicationIconBadgeNumber觸發(fā)一次刷新有時候能讓圖標(biāo)更快更新但效果不穩(wěn)定看系統(tǒng)版本。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
97最新在线播放视频| 超碰色图| 成人八戒网站| 色色毛片| 久久久久久久久久久久色网| 青青草精品| 一级A啪啪啪啪| 97国产精品视频| 牛牛久久国产精品视频一二三| 大香蕉懂9| 日韩精彩免费| 国产精品色片一区二区| 97爱啪| 久久性爱视频| 大香蕉综合网| 思思在线免费视频| 高清无码 国产精品| 日本一区二区三区四区五区六区七区八区九区 | 一级成人性爱| 国产精品久久蜜乳av| 黄色十八禁网站| 天天综合精品| 亚洲免费成人精品电影| 国产精品无码成人精品| 91成人精品| 美欧老女人97| 国产丰满熟夫69mpp| 国产又色又爽又舒服的三级视频| 极品美女福利在线观看| 中文色综合| 丰满人妻-区二区三区免费看| 嗯嗯啊好大| 中文无码一二三区| 免费看美国人人爽,人人操| 久艹日日日| 97美日韩视频| 亚洲丝袜诱惑| 中文字幕黄色一起草| 天堂亚洲精品久久老牛| 最新av在线| 色妺妺在线视频| www久久99| 亚洲欧美精品福利在线| 盗摄女人妻在线| 国产精品麻豆免费视频| 十八禁av无码免费网站APP| 狠操91,com| 在线观看A啊啊啊| 97超碰精品图片| 加勒比五月天| 欧美少妇性乱| 性色高清..……| 久久r精品| 亚洲在线综合| 97超碰超| 国产人妻久久精品一区二区三区| 欧美大战久久久伊人| 超碰激情808| 亚洲色偷偷色噜噜狠狠99网| 亚洲精品 大香蕉| 久久久九九网站| 香蕉婷婷| 精品一国2| 久久97超碰香蕉| 亚洲在高跟鞋自慰久久在色线| 人人手机欧洲亚洲国产人妻| 国产美女激情| 97免费视频在线观看视频| 91丝袜激情在线| 区一二区日韩亚洲乱码av电影| 丁香五月婷婷基地| 亚洲男人天堂Av| 97人肏| 丰满少妇一区二区三区四区观看| 9+1视频网址| 婷婷色网| 亚洲 se图 欧美电影| 亚洲精品一区中文字幕乱码| 97在线无精品| 国产精品日日摸天天碰| 91另类| 国产精品白丝在线播放 | 91精品综合久久久久久五月丁香| 性欧美另类高清| 台湾大香蕉99热| 中文字幕、久久精品国产2020、久久综合久久自在自线精品自、亚洲 | 操逼精品视频| 亚洲天堂男人网| 亚洲天堂一区| 欧美性爱十八禁| 色99色| 欧洲中文字幕| 欧美 亚洲精品首页| 人妻天天爽天天爽三区| 一级特级aaaa毛片免费观看| 国产美女91视频| 啊啊啊快操我视频| 日本一级特级毛片视频| 黄片无码在线制服| 高树玛利亚无码流出| 熟妇人妻一区二区三在线| 日韩久射综合| 欧美午夜一区二区三区| 夜夜高潮夜夜爽| 好吊爽好吊爽在线视频,中文字幕精品一区二区日本,国产良妇出轨视频在线观看, | 97资源视频| 91精品丝袜在线观看| 国产剧情一区在线观看| 97久久精品国产| 少妇久久久免费| yw尤物av无码点击进入麻豆| 久久日韩毛| 久久精品免视看国产成人﹣蜜臀av一区. 久久精品免视看国产成人,蜜臀av一区 | 日韩熟女三十乱伦| 一道本久久棕合爱| 亚洲蜜臀视频精品久久| 老熟女乱伦片| 人妻一区二区三区| 欧美性夜| 东京热免费视频| 亚洲情色在线| jk白丝没脱就开始啪啪| 少妇激情AV| 曰韩中文人妻视频| 男人天堂.AB| 亚洲男人天堂手机版| 国产高清在线观看欧美| 香蕉色网| 无码在线亚洲| 97国产精选| 操操吧亚洲乱伦视频| 亚洲日韩一区电影| 亚洲se91| 99操| 蜜乳AV一区| 欧美综合网1| 久艾草在线精品视频在线观看| 东京热免费视频| 日韩97在线| 青娱乐999| 亚州成人A√| 收看日本人日bb| 使劲用力艹少妇视频一区二区| 欧美偷拍区| 99色骚| 日韩不卡毛片Av免费高清| 日本布卡一区二三区| 五月丁香激情综合| 超碰在线人妻中文字幕| 97伦乱| 天天插天天干| 美国人人操人人操| 日韩猛交| 蜜屁av| 91殴美大片| 亚洲欧美国产日本一区二区三区| 秋霞怕怕片| 2003天天干夜夜操| 国产精品熟女九九九| 亚洲女毛多水多21P| 男人天堂导航| 欧美中字二区| 99色综合| 无码日韩人妻av一| 婷婷操逼| 九九久久精品| 亚洲综合贴图91| 欧美亚洲se91| 日韩无码视频黄色| 天天插天天操| 五十路熟女在线不卡观看一区二区| www.久久超碰| 99久re热视频精品98| 精品国产72| 国产精品爆乳懂色蜜乳| 久久久蜜桃一区二区三区| 久久无码成人| av三级电影在线播放| 在线观看无码三级少妇| 亚洲精品久久久久久久久豆丁网| 日韩啪啪网| 日韩电影天堂视频二区三区| 91久久久久| 国产精品熟女九色九色蜜臀| 美女操逼福利视频| 在线电影亚洲色图| 欧美性爱精品一区二区| 日韩无码第3页| 色综合网1| 久久风骚城市| 99啪啪| 黑人性欧美| 日本 欧美 国产一区| 97精品视频网站| 在线欧美69V免费观看视频| 97在线欧洲| dy888午夜老子影视达达兔| 性站 | 操操碰| 啊啊啊骚| 加勒比综合九九99视频在线播放| 久操网无码在线| 久久精品国产精品| 欧美天天插| 乱伦熟妇一区二区| 久久九九精品一区二区 | 色五91| 国产精品久久妻无码网站| 999 久久久| 九九aV| 欧美性爱第1 页| 亚洲图片 激情小说| 亚洲欧美日韩夜夜| 人妻偷拍一区二区三区| 大香久久| 99热这里只有精品1| 97激情97激情| 日韩av女优在线免费一区| 国产精品久久99日日| 啊啊啊啊免费视频| 色综九九九一区| 四虎免费看黄| 97 国产一区| 极品色社| 嗯~啊~快点 死我视频| 伦理片秋霞免费影院| 青草草免费网站av| 国产精品嫩草影院午夜两性| 久久久久亚洲| 麻豆天美一区二区| 久久久久久久久久久久色网| 中文无线日韩一区| 日韩大香蕉精品在线视频| 蜜桃不卡一区二区| 成人热久久精品| 亚洲网站一区二区在线| 欧美AB在线观看| 亚洲成人在线播放| 爽爽歪在线视频| 天天综合日韩网| 日本高清电影欧美色图| 超碰亚洲欧美日韩无| 超碰调教97| 午夜精品99久久久久传媒| 99热91| 色婷婷电影网| 福利偷拍视频-中文字幕2019国语完整视频大全-S91AV | 亚洲国产剧情少妇激情| 91色五月俺来也| 精品美女少妇一区二区三区| 欧美人妻另类在线| 97色操| 精品一级毛片在线观看| 五月婷婷六月丁香网址| 性爱综合网| 久久熟妇五十路一区| 99色骚| 综合亚州欧美| 男女做爰猛烈动高潮A片免费应用| 国产精品福利资源在线尤物| 国产精品久久久久久照片| 黄色视频特级毛片| 精品久久9| 一起草视频在线| 老熟乱一区二区三区四区| 97色伦欧美| 久久久少妇诱惑精品视频| 久久一二三级一一一| 91性生活久久久| 成人欧美一区二区三区黑人一| 99re在线视频这里只有精品| 亚洲色图欧美另类在线| 亚洲高清视频在线观看| 91久久久久久| 秋霞影音一区二区三区| 午夜超爽| 日韩色| 尤物网站91| 日本 情色 1区| 五月天欧美色图| 成人精品一区二区三区| 久久亚洲日韩国产欧| 精久久久| 亚洲国产美女久久久久 | 欧美日产国产在线成人第一区| 大香蕉久久| 福利视频香蕉免费一区二区在线| 欧 美 自 拍 偷 拍| 小视频玖玖| 六月丁丁香| 五月天成人综合| 中文字幕一区 二 区 三 四 五 区日 日 骚 | 色月天AV导航| 天天日美女的B| 丁香7月婷婷| 大香久久| 亚洲最新a在线观看| 涩五月婷婷| 蜜臀久久久| 五月丁香色婷婷| 色老汉玖玖爱| 久草线上视频免费看| 亚洲第一页色网| 亚洲精品久久久久毛片A片拉屎| 乱伦色图网址是多少| 久久免费精品视频免一| 亚洲nv男人的天堂网| 色999偷自拍拍| 一级AAA片一区二区三区| 777超碰| 乱伦3P视频| 天美传媒Av在线| 91东京热男人的天堂| 一牛影视久久久一区二区三区| 加勒比五月天| 日日操丁香五月天| 少妇内射www在线观看视频 | 97超碰久久色| 日韩成人性爱AV| 亚洲 欧美 小说| 日少妇视频| 青青操轻轻| 亚洲色丰满少妇高潮| 人人人干干人人干| 国产福利夜| 午夜福利1区2区3区| 欧美天堂超碰97| 久久久久久国产精品免费网站| 欲女人妻性色av| 亚洲国产一级精品毛一级精品看免费视频| 国产二区三区粉嫩在线| 成人免费看吃奶视频网站| 99自拍B亚洲 | 久久久久久电影| 欧亚不卡| 欧美激情中文字幕另类小说| 大香蕉人妻久久| 久久久999网站| 国产午夜在线观看| 精品一区二区麻豆| 黄色毛片A片| 久久黄黄| 黑人精品成人一区二区三区| 亚洲成a人v欧美综合天堂下载 | 人人澡人人弄| 99久久久无码| 九九香蕉网| 精品无码久久久久久国产浪潮| 日本淫穴在线| 精品免费一区二区三区在线亚洲人成| 欧美丝袜制服久久| 国产对白刺激视频| www.色操逼| 人人操我人人干| 男人的天堂VA| 亚洲性刺激| 九九国产| 欧美极品色| 日韩熟女乱伦中出| 97超碰人人模人人拍人人| 国产日产欧产美韩系列麻豆免费| 国产五码丝袜屁眼| 亚洲aw毛茸茸在线| 九九久久首页| 射欧美综合| 九月AV| 久艹伊人精品综合在线| 安徽熟妇视频| 色九九九综合| 91国精产品| 狠狠躁天天躁日日躁| 亚洲精品骚逼| 欧美一区二区三区黄色影视| 超碰日韩美妻| 4虎在线观看| 99亚洲天堂| 920日本午夜免费| 国产丝袜视频| 91爱看| 78久久久| 9I1性色影院| 精品成人女人久久| 久久这里只精品免费福利| http://qxhbdz.com| 欧美精品激情| a一区二区三区乱码在线| 亚洲一级特黄大片在线播放91| 欧美性后入| 一区二区你上我| 97丝袜亚洲在线播放| 激情第四色| 国产高潮AA片免费看| 最新日产中文在线麻豆| 视频在线观看青青99国产| 日本久久久精品电影| 久久精品| 开心五月婷婷| 蜜桃色院一区久久 | 久久视频少妇美女| 欧美在线永久天堂| 激情一区二区三区在线观看| 亚洲精品97p| 久久精品国产亚洲5555| 91小视频| 九一综合网| 96一区二区| 岛国AB视频| 日韩78m视频| 88xx成人精品视频| 国产精品麻豆成人av| 亚洲一区二区av| 91人人看| 五月婷婷六月天| 精品一区二区三区蜜桃臀赵总 | 五月丁香网站| 玖玖资源视频一区二区三区| 国产成人无码a| 久久婷婷一区二| 精品久久久一本一道| 精品一区二区成人| 麻豆成人av| 秋霞成人一级在线观看| 精品网站99999| 在线欧美69V免费观看视频| 欧美大香蕉97| 黄站在线免费观看| 久操婷婷| 日本一区二区不卡精品| 欧美淫乱视频| 欧美成人9797| 黄色av网站在线播放| 精品少妇一区二区三区在线视频| 99国产在线绯色一区| 在线视频资源| 国产综合久久久麻桃个| 久久五十路熟女人妻| 天天干,天天日| 色99999| 亚洲色图欧美色图制服丝袜| 一本大道不卡一二三区| ji熟女.com| 人人操av| 爱妃国产亚洲视频中文字幕| 国产老太乱伦一区| 少妇毛片久久| 性爱乱伦一区| 人妻干天天| 97在线免费公开视频| 日韩91网| 黄片视频,下载| 成人片在线播放| 中文啪啪视频| 探花视频免费观看国产专区| a片在线播放| 天天淫人人妻日日色| 久久亚州精品成人Av无| 一区二区影视| 久操免费观看| 欧洲精品一级二级精品综合视频综合| 久噜噜| 99久久综合| 色久综合| 碰人碰碰人人开房人肉| 国产老熟女| 亚洲一区中文字幕久久,果冻传媒一区二区天美传媒| 91c色| 国产强上视频在线观看| 国产精品熟女丝袜一区二区| 天天天天天天天天天天干美女| 亚洲天天做日日做天天谢日日| 校园春色五月天| 欧美亚洲首页| 放黄片放3级黄片没穿衣服| 四虎AV在线播放| 天天干18禁| 97综合网| 天天色天天干天天射| 久久久久久电影| 美国一区二区三区视频| 丁香五月激情啪啪| 日韩簧片免费看| 国产不卡免费在线视频| 久久九九视频九九视频| 精品人妻无码一区二区三区不卡-精品人妻无码一区二区...|精品少妇一区二区三 | 亚州操操穴网| 麻豆成人av| 日本不卡一区二区三区| 大香蕉中文201| 夫妻日逼| 一区二区三区黄色片a| 影音先锋中文字幕日本好一区二区| 激情色色| 欧洲自拍第一页| 欧美日本成人一区二区| 污污汅18禁网站在线永久免费观看| 91国产大片| 精彩久久中文| 国产一级内射无挡观看| 69AV女优男人的天堂| 999国产精品999久久久久久| 日韩精品黄片免费观看| 综合色图区| 国产吹潮女在线观看| 好属操| 欧美在线干| 大香蕉青青9| 在线观看成人性爱免费小视频| 五月天开心网| 人妻丝袜二区| 97人人操人人干| 亚洲在线A| 亚洲一本大道中文字幕无码在线| 久久久久无码一妻区| 精品欧美А∨无码黑人大荫蒂| 吉田爱美AV在线| 久操视频资源站公开| 淫骚熟女一区二区三区| 国模精品一区二区三区苹果色戒| 91人妻最真实刺激绿帽| 91xingse| 亚洲九九视频在线观看| 亚洲精品一区二区精品| 330dv亚洲成年视频网| 免费一级黄色录像影片| 亚洲女人毛茸茸91| 欧美精品999| 亚洲高清色综合| AA丁香综合激情| 国产精品香蕉| 狠狠亚洲| 激情自拍 校园春色| 日韩精品一区二区高清| 91网18| 一本色道久久天天射天天干| 久久神马影院| 久艹免费| 性色av一区二区| 九九碰九九爱97超碰| 96久久久| 高清无码人妻久久久一区二区三区aⅴ| 亚洲天天综合| 97色碰| 亚洲日韩在线a不卡99精品| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区二区老师黑人潮喷一 | 91九久| 一本色道无码DVD中文字幕| 97硬碰| 99青草| 午夜福利成人免费视频| 蜜乳AV.COM| 国产激情片在线观看| 久久久久久久97| 天天大干大香蕉| 亚州熟妇精品| 麻豆天美在线喷水AV| caopeng97| 日韩人妻制服丝袜av| av网站免费看| 久久久久久久强迫| 免费观看性欧美一级| 丁香婷婷五月| 五十路三区在线| 欧美综合色| 茄子社区国产精品| 精品人妻少妇| 亚洲欧美日韩偷拍色图| 久久αⅴ| 国产精品操| 亚洲午夜未满十八勿入网站日本又色又爽又黄 | 精品九区| 欧美国产精品久久九九| 亚洲成人精品在线一区| av无线看| 婷婷色婷婷| 熟女丰满人妻一区| 亚洲最大的黄色电影网站。 | 日韩综合无码色欲vv| 亚洲AV噜噜狠狠网址蜜桃动漫| 被窝影院午夜看片无码| 久久性爱精品一区| 国产免费一区二区在线A片视频| 大香蕉九九| 绯色AV粉色AV蜜臀AV| 熟女视频久久| 中文字幕在在线观看网站| 青青草伊人久久| ai欧美亚洲小说| 久九九九九九九九热| 亚洲中文字幕在现观看| 婷婷丁香九月| 国产高清不卡视频| 欧美丝袜美女电影一二三四区| 精品无码欧美三级| 91青视频| 9久综合网| 女人双腿搬开让男人桶| 蜜臀AV成人精品蜜臀AV久久| 亚洲性综合| 亚洲日韩人妻中文字幕一区| 麻豆啪啪啪视频| 色五月天AV| 欧美亚洲天堂| 五月天伊人| 国产女人9999| 精品少妇后入一区二区三区四区人妻巨乳 | 男女啊啊啊啊啊| 国产久久成人| 欧美大干日韩| 婷婷丁香五月天综合东京热| 九九久久久九九| 天堂精品一区| 在线观看AV片| 九九热午夜欧亚国产视频| 久久久久久电影| 97超碰天天| 欧美极品美女aaaaaa级黄片| 超碰色中文| 超碰在线人妻中文字幕| 日本一片一区| 日韩一区二区熟女| 91女神在线视频| 天天操人人操骚逼网站| 中国AV美女| 黄色不卡视频| 免费看日产一区二区三区| 国产精品久久久亚洲第一牛牛_在线观看 | 婷婷久月| 久久久∴| 亚洲啪啪啪啪视香蕉| 呦呦一区| 亚洲无码国产精品久久| 欧美极品性爱天天射| 精品视频一二三中文| 粉嫩av在线| 天天亚洲| 久久伦理视频久久大香蕉视频| 在现视频女上位好爽| 欧美色五月| 躁躁日曰躁2020| 深夜福利黄片| 无码精品久久| 欧美72网页| 日韩欧美中文日韩欧美色| 超碰在线第一页| 啊啊啊啊嗯嗯嗯用力好爽 | 亚洲国产综合图区中文字幕 | 欧美人人AAA| 国产精品999aaa| 超碰免费欧美7| 国产四虎在线| 美女啊啊啊啊啊啊啊| 欧美日韩大香蕉| 亚洲蜜臀精品视频久久| 日韩精品系列| 老女人碰碰在线碰碰视频| 99久久久无码| 五月婷婷AV| 丁香五月综合| 在线观看日韩av不卡| 亚洲图片激情综合另类| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区二区 | 操比国产| 极品美女福利在线观看| 两性色网| 亚洲午夜福利视频| 久久久久成人亚洲国产| 18禁免费视频| 睡产熟女乱伦| 国产av高清版| 内射日韩大臀美女| 九一亚洲国产免费| 啊啊啊97视频| 公司1区2区3区精产精| 日韩内| 色区97| 白丝AV| 国产一级137片内射麻豆| 无码久久国产| 黄片免费看的| 乱色视频中文字幕| 九九九午夜| 日本黄色裸日本黄色裸体| 大香蕉之青青草原| 亚洲风情在线观看| 亚洲春色一区二区三区| 日本一区视频在线观看| 99热这里只有精品地址| 精品四五区| 另类成人首页一区| 亚洲最新Av| 亚洲AV无码黄色强奸| 天天爽天天操| 色五月AV在线| 91露脸熟女专区| 天天操天天插| 大香蕉青青9| 午夜毛片亚洲精品片国产久久久| 日本操大逼| 色综合加勒比四四季| 国产人妻久久精品一区二区三区| 免费一级性爱久久| 清清一区二区三区四区不卡视频| 男人成人黄色视频在线观看免费下载| 黄色小视频日本txt| 五月天婷婷激情| 欧美在线干| 多乙久久久久久| 欧美老妇女内射网址| 九九九久久久| 精品人妻1237| 欧美自拍偷拍综合图片| 超碰爽人妻熟女Av| 放黄片放3级黄片没穿衣服| 激情综合亚洲| 亚洲图片偷拍欧美| 久操视频资源站公开| 在线五区| 婷婷月色| 五十路熟女人妻一区二区在线观看| 亚洲日韩精品在线播放| 日韩欧美女求操每天更新| 色五月婷婷久久| 亚洲Av诱惑| 午夜人妻精品综合在线| 婷婷天堂站| 天天性射网| 人人天天欧洲| 国产高清26uuu| 欧美偷偷网| 91丨九色丨东北熟女| 中日韩免费看男女操逼大全| 色第一页| 99热网站| 天天操天天干一区二区 | 精品一区二区成人| 久久精品成人| 大香蕉综合| 久久久久9| 日韩无码黄色片| 大香蕉综合网| 97精选久久| 欧美日韩免费专区在线| 国内毛片无码一级毛片| 国产一级137片内射麻豆| 91蜜桃传媒精品久久久一区二区| 欧美内射少妇| 4399成人黄A片| 看黄片视频免费| 色网站导航大全| 日本免费二区三区| 天天影视网色欲色香| 国精品一区二区三| 91亚洲精品青草| 欧美午夜视频精品久久| 国产熟女完整版中字| 乱性AV| 亚洲av性爱电影| 丰满人妻一区二区三区免费| 99re在线视频这里只有精品 | 亚洲色天堂九9| 天天在线91| 97精品在线| 国偷自 一区二区| www. 男人天堂成人在线| 亚热日本熟女| 欧美日韩天堂| 激情人妻另类| 欧美性Fer办公室秘书| 美女大乳久久久久久久女人18| 日韩在线人妻网站| 国产精品熟妇一区二区三| 日本免费一区二区不卡 | 欧美人妻另类在线| 国语精品对白| 美女诱惑久久| 一级片在线观看高清无码| 亚洲人妻中文高清| 男人天堂2012| 色欲色香天天天综合网www-亚洲综合国| 国产精品网站免费| 伊人少妇久久久| 精品久久久一本一道| 嗯嗯啊啊好爽| 最新日产中文在线麻豆| 乱伦系列一区二区| 蜜臀在线免费观看在线免费观看| 在线小视频| 精品久久久av无码免费| 欧美亚洲另类在线蜜桃| 国产欧美精品日韩区二区麻豆天美| 国产馆极品诱惑| 亚洲性猛交| 97视频在线免费观看| 久久久久久久国产视频| 日韩pv中文| 黄色工厂这里只有精品| 男女激情黄色网址| wwe 天天干.com| 欧美在线电影| 天天干天天狼在线视频| 亚av顶级裸体一区二区三区四区五区 | 加勒比久久av| 欧美 亚洲| 亚洲黄色a级片| 丝袜喷水在线| 九九九九热| 久久久九97| 丰满人妻区一区二区三| 91 丝袜在线| 日韩啊V| 伊人久久大香蕉线AV五月天| 五月天色综合| 日本三级精品| AV天天在线观看| 天天射日日干| 精品99999久久久久久| 国产精品久久| 亚洲AV免费在线观看| 爱爱啊啊啊| 闷骚老熟女15P| 三级日韩一区二区三区| 麻豆AV一区二区| 国产三级资源在线观看| 国产精品经典一卡久久久 | 果冻传媒A片一二三区| 日本午夜福利影院| 久操视频在线观看| 在线啊啊啊啊| 成人一道本免费视频| 麻豆国产成人精品| 被体育老师抱着c到高潮| 欧美高清色| 日韩中文字幕av在线播放| 熟女突然公开看18禁影片| 综合色好色| 加勒比海成人视频网| 另类图片五月| 日逼国产| 在线观看不卡一区二区三区| 欧美综合狠| 欧美亚综合色图| 欧美劲爆视频一区二区| 黄色av网站在线播放| 欧美色图片| 少妇熟女视频一区二区三区| 99ri在线视频| 中文自拍欧美影视| 一区二区三区黄色片a| 粉嫩AV一区二区夜夜| 熟女高潮合集-永久久久-成人AV | 人人妻人人操人人乐| 99啪啪视频| 久久香蕉综合一本到3atv| 伦激情人妻另类人妻| 久久久新亚洲AV| 男人的天堂久久久| 性做久久久久久免费观看软件| 粉嫩av在线| 91丨人妻丨国产丨丝袜| 嗯嗯啊啊啊好爽| 97超级久久| 亚洲国产日韩精品久久久| 91在线丝袜| 欧洲一区二区| 久热这里只有精品9| 男女啊啊啊啊啊| 91精品人妻一品二品三品| 妇女乱色二区| 欧美精品亚洲精品日韩传电影| 加勒比伊人综合| 97天天操天天干| 久久九七| 色踪合AV| 久久一二三四五六七八九区| 天天欧美97| 国产精品人妻免费精品| 天天视频网站黄| 蜜乳Av成人片网站| 五月丁香婷婷综合网| 色av中文字| 婷婷色香| 青青草华人在线欧美在线| 天天综合欧美| 一级黄色视频网| 久久久久婷婷| 久久久网一区| 在线中文字幕视频| 亚洲欧洲综合av在线| 五月婷久久| 亚洲在高跟鞋自慰久久在色线| 久久久久久免费电影| 国产探花日韩援交| 91碰碰| 久久中文字幕不卡人妻| 日韩激情啪啪| 中文字幕天天天天天| 婷婷人妻激情| 精品亚洲国产成人av网站| AV九九| 国产诱惑| 亚洲av综合色| 操操操操网黑人| 乱伦日本中文自拍| 色综合99| 另类老少妇| 亚洲一区二区性爱电影| 久久精9| 国产精品成人无码a v毛片| 欧美视频在线第3页| 亚洲一区二区中文字幕| 国产精品视频白浆免费| yazhousetuoumei| 欧美色女人| 91嫩草欧美| 天天激情综合站| 1二区9| 国产精品一区午夜福利| 美骚妇av高清在线| a v网站在线播放| 综合色久欲| 九九碰九九爱97超碰| 精品在线78| 欧亚综合一卡二卡中文字幕| 亚洲牲交| 久久夜嗨| 亚洲 国产 精品一区| 啊啊啊啊,啊啊好多水| 婷婷五月天社区| 亚洲国产精品无码AV久久| 91原创在线观看| 亚洲精品官网在线观看| 欧美亚洲丝袜人妻制服中文99| 操一区| 51久久夜色精品国产麻豆| 蜜桃久久久久久久久久久久| 伊人影院综合是一个与深夜成人在线| 91精品操美女| 国产极品999| www.色婷婷色综合| 强奸乱伦免费网站| 久久伊人影院| 久久偷偷色综合蜜桃| 丁香五月激情网| 成人一级性爱| 色色97爱| 玖玖资源视频一区二区三区| 天天综合网久久ww| av天堂手机版追回| 13小男生GAY自慰脱裤子| 亚洲天堂美臀在线| 欧美少妇一区二区三区| 婷婷综合五月| 欧美顶级黄色大片免费| 日韩免费在线观看不卡| 骚日日av| 色天欧美| 97超碰亚洲| 蜜奶av| 五月天伊人| 国产女人高潮视频| 这里只有精品久久| 六月丁香久久| 婷婷五月天成人| a级理论午夜日本| 91动漫操逼视频| 久久亚洲AV无码专区国产精品| AVE乱伦| 亚洲影院无码在线| 无码人妻精品一区二区三区99不卡| 欧美精品宗合| 中文字幕日韩人妻视频| 久久久99免费| 日日日日做夜夜夜夜无码| 成人无码在线视频网站| 精品中文字幕第一页| 一区二区三区 日韩欧美| 欧美另类综合久久| 色情五月婷婷| 狠狠久久四虎| 欧美97视频| 日本精品一区二区三| 一区二区三区一亚洲中文字幕、综合区灬 | 超碰97人妻在线| 制度丝袜99| 婷婷色综合| 欧美在线大香蕉| 中文字幕欧美精品亚洲日韩蜜臀| 亚洲色图欧洲| 欧亚成人在线视频| 欧美—性—交—色| 波多野结衣先锋影音| 99爱在线视频| 国产第二页| 操b在线观看| 九九色影院| 9999九九九久久久| 亚州男人天堂| 亚洲欧美日韩精品久久久一区二区 | 亚洲av综合色区图片亚洲| 最新AVzaixian| 4tube欧美女厕所| 亚洲色图尤物视频| 91AV老熟女视频| 一区二区视频在看| 中国探花熟女| 天堂涩涩| 精品中文字幕第一页| 淫色网综合| 亚欧高清| 国产久久一区二区三区野外在线| 快灬快灬 一下爽蜜桃在线观看| 国产精品极品美女视频| 精品久久久av| 欧美传媒| 五月天综合网| 亚洲精品国产熟女| 96国产污污污丝袜| 精品人妻一区| 精人妻无码一区二区三区伊人直播| 免费家庭乱伦视频| 四虎884a| 久久久免费的精品| 欧洲一区二区| 超碰调教97| 强奸乱伦 亚洲一区| 色男人色天堂东京热| 中文字幕91页| 久久精品国产97欧美精品亚洲 | 午夜情侣自拍网站| 久久久久久亚洲Av无码| 裸体1区| 欧美亚洲日韩人妻在线观看| 亚洲风情在线观看| 1204金沙人妻懂旧版免费| 日本肉体xxxx裸交| 国产在线综合福利网站| 亚洲淫色网中文| 97天堂| 超碰国产精品久| 熟女少妇视频| 亚洲av总站| 99性视频| 亚洲aV性爱| 乱伦a片视频| 久久9亚洲| 人妻密肉在线观看| 屁股久久久久久| 亚洲小说视频| 久久九九热| 视频在线观看青青99国产| 国产精品久久发布| 婷婷五月天综合网| ,成人免费啪啪视频| 日韩在线一区高清在线| 岛园激情| 久久久96精品| 99亚洲天堂| 久久系列| 国产精品小视频一区二区三区| av中亚| 精品.99999| 另类TS人妖一区二区三区| 伊人精品视频| 老司机老司机午夜影院| 欧美精品亚洲精品日韩传电影| 亚洲欧美国产其他二区| 97K超碰在线| 天美传媒av 在线| 性无码专区2020| 久久夜夜夜夜| 手机在线人成免费视频| 四虎免费在线播放| 久久久久骚| 国产精品点击进入在线影院| 中文字幕第23区| 国内毛片无码一级毛片| 欧美男人天堂| 四虎884a| 五月天色色网站| 国产精品午夜AV完会免费| 综合天天网| 大香网伊人久久综合| 中文字幕乱码在线| 性爱AV天堂| 五月丁香综合激情| 国产精品视频91久久| 嗯嗯啊啊的视频| 天天舔天天 | 欧亚无码视频| 啊啊啊啊啊啊啊在线| 激情小说五月天| 欧美一区二区三区互相| 情色五月天就去干| 宅男91视频在线播放| 在线无码操| 农村女一级毛卡片| 日韩人人精品| 亚洲城人男人的天堂| 人、人、摸,人、人、草| 日本阿v天堂在线观看| 美女骚尻视频| 日韩美女久久一区二区三区| 国产一区二区av综合| 无码精品久久久久久亚洲| 超碰到97情色| 强上我不卡卡| 久久久久久久人妻| 久久黄色性爱视频| 亚洲国产成人综合碰碰三级经典| 久久久久国产| 一区二区三区四区五区高清无码永久视频| 操逼片中文| 亚洲av无码国产精品字幕| 国产9熟妇视频网站| 天天日天天干天天整| 久久偷拍人| 热久久无毒不卡| 伊人久久大香线蕉无码| 伊人精品国产| 精品一区二区成人| 偷拍五区| 五月婷婷啪啪| 综合另类| 91天天爱| 亚洲欧美经典一区二区| 男女啊啊啊啊啊| 亚洲午夜福利在线影院| 欧美老妇综合网| 欧美熟妇成人一区二区| 超碰在线一区二区三区| 久久亚洲日韩国产欧| 久久久久元码视频| 天天看高清麻豆| 91艹逼精品| 最新精品久久蜜桃 | 国产高清成人传媒影视| 午夜一区二区三区国产| 国产传媒午夜理伦精品| 日本伦乱九九九综合| 好色综合| 97操| 极品另类| 久久久新亚洲AV| 久久伊人最新网址视频| aV中亚| 久久精品人人做人人看| 你懂的在线观看区国产| 日本αv| 国产色综合亚洲色综合吹潮| 乱伦熟女论坛| 热无码中文亚洲H一道本一区二区| 私人尤物在线精品不卡| 思思久热在线精品66| 高清国产精品福利网站| 久久亚洲中文字幕视频| 日本性爱视频一级| 国产精品探花色| 中国zzijzzijzzwww精品| 国产女人操逼视频| 久久艹逼视频|