动态更新App的图标(AppIcon)
序言
????????隨著時代的進步,人的生活多元化。一些公司的 App 也隨著人的生活改變而進行適和情景的變化。比如,本公司的 App 在四月時是本公司成立 4 周年的生日,那就想在本公司 App 的 Icon 上添加一個圣誕帽。第一種方法: 在 App 的工程中,替換原始的 AppIcon ,再提交 AppStore 進行審核。這種方法不說麻煩,而且耗費時間長。第二種:在 App 中動態更新 AppIcon 。 這種方法直接、快速、適合即時應用。
1、本博客介紹方法實現的效果圖如下
2、 重點知識點的介紹
@interface UIApplication (UIAlternateApplicationIcons) // If false, alternate icons are not supported for the current process. @property (readonly, nonatomic) BOOL supportsAlternateIcons NS_EXTENSION_UNAVAILABLE("Extensions may not have alternate icons") API_AVAILABLE(ios(10.3), tvos(10.2));// Pass `nil` to use the primary application icon. The completion handler will be invoked asynchronously on an arbitrary background queue; be sure to dispatch back to the main queue before doing any further UI work. - (void)setAlternateIconName:(nullable NSString *)alternateIconName completionHandler:(nullable void (^)(NSError *_Nullable error))completionHandler NS_EXTENSION_UNAVAILABLE("Extensions may not have alternate icons") API_AVAILABLE(ios(10.3), tvos(10.2));// If `nil`, the primary application icon is being used. @property (nullable, readonly, nonatomic) NSString *alternateIconName NS_EXTENSION_UNAVAILABLE("Extensions may not have alternate icons") API_AVAILABLE(ios(10.3), tvos(10.2)); @end1 / supportsAlternateIcons 函數
????? 該函數是判斷設備是否支持備用 AppIcon 的功能。該功能的使用條件是設備的系統必須是 iOS 10.3 以上的版本。
2 / alternateIconName 參數
????? 該參數是一個只讀屬性的參數,如果該參數為 nil 時,那App 就會使用默認的AppIcon 。否則,App 使用的是備用AppIcon ,那么 alternateIconName 獲得的結果就是App 正在使用的備用AppIcon的名子。
3 / setAlternateIconName: completionHandler: 函數
????? 該函數是執行AppIcon 圖標替換的功能。在進行替換時 App 的系統會彈出一個提示讓你確定是否變更AppIcon 。如果,要自動變更App 的 Icon ,那么這個提示就不能出現。對于如何去掉這個提示,后面介紹。
3、使用備用AppIcon需要在工程的 info.plist 文件中進行配置,配置如下:
1、添加流程
- 我們在工程的 Info.plist 文件中添加 Icon files(iOS 5) 的 key 。該 key 的類型(Type)為 Dictionary 。
- Icon files(iOS 5) 對應的字典,包含 2 個對象分別是: Primary Icon 、Newsstand Icon。 這兩個對象的類型也是 * Dictionary* 。
- 我們要使用備用的AppIcon ,那么我們就要在 Icon files(iOS 5) 對應的字典中,添加一個對象 CFBundleAlternateIcons 對象,該對象的類型是字典(Dictionary)。
- 我們在CFBundleAlternateIcons 對象中添加備用*AppIcon 的圖像對象。如上圖 Icon1、Icon2 所示,這兩個對象的類型也是字典。
- 我們要在添加的AppIcon對象中在添加一個 CFBundleIconFiles 的對象,該對象的類型是數組(Array)。
- 在CFBundleIconFiles 的對象中添加AppIcon 的圖像文件名字為元素,該元素的類型是 String,以便后期使用。
2、參數介紹
- Primary Icon ?是默認 AppIcon 的對象。該對象包含 *Icon already includes gloss effects 、Icon files 兩個對象。 *Icon already includes gloss effects 是一個布爾類型,它表示AppIcon 是否是高光狀態。Icon files 是一個數組對象,它包含默認的AppIcons 的文件名字對象,對象類型是字符串(String)。
- CFBundleAlternateIcons ??備用AppIcon 可能有好幾個,那么CFBundleAlternateIcons 包含的對象就不只一個。我們介紹其中一個例如 Icon1 包含 CFBundleIconFiles 一個存放AppIcon 圖像的數組。數組內是各個AppIcon 文件的名字。
- Newsstand Icon ?? 這是報刊類 Newsstand App 的圖標設置。該對象包含 Binding edge、Icon files、Binding type 三個對象。Binding edge 是一個字符串對象,它的作用是設置Newsstand Icon 的位置,可選類型有 left、right、bottom 。Icon files 是一個數組對象,它里面存放圖像的文件名字。Binding type 是設置Newsstand Icon 歸屬的類型,類型可選有 Magazine 、 *Newspaper。
4、 核心代碼
#pragma mark Change 'AppIcon' -(void) changeAppIcon:(NSString *) iconName {// TODO: Get the App itselfUIApplication * application = [UIApplication sharedApplication];// TODO: Determine whether the device supports' AlternateIcons'/*** AlternateIcons : 擴展備用圖標。* 使用條件: ios10.3 以上的設備*/if ([application supportsAlternateIcons]) {// Change the 'AppIcon'[application setAlternateIconName:iconName completionHandler:^(NSError * _Nullable error) {// Change the abnormal result of 'AppIcon'NSLog(@"%@",error);}];} }在 App 程序中調用上面的函數,就可實現AppIcon的變更。注意,當你調用時,系統會彈出一個提示,讓你確定進行AppIcon 的變更操作,確定后AppIcon 才會替換。如下所示:
5、清除變更 AppIcon 時系統彈出框
???????? 我們知道系統的彈出框是由 UIAlertController 來實現的,它屬于一個控制器。在彈出的時候會調用 presentViewController:animated:completion: ? 函數。那我們可以通過這個方法來阻止彈框的彈出。由于蘋果系統的不開放性,我們也沒發更改這個函數。目前,方法就是利用運行時,用我們創建的一個方法來替換這個方法。在我們的方法中來阻止彈框的彈出。
1、核心代碼
該段代碼可放在繼承的控制器中或者在控制器中直接寫。導入運行時的函數庫 #import < objc/runtime.h >。
#pragma mark 彈窗的清楚 +(void)load {Method presentM = class_getInstanceMethod(self.class, @selector(presentViewController:animated:completion:));Method presentAlternativeM = class_getInstanceMethod(self.class, @selector(clearPresentViewController:animated:completion:));// 方法的切換method_exchangeImplementations(presentM, presentAlternativeM); }#pragma mark 清楚處理方法 -(void)clearPresentViewController:(UIViewController *)viewControllerToPresent animated:(BOOL)flag completion:(void (^)(void))completion{// 跳轉頁面的類型if ([viewControllerToPresent isKindOfClass:[UIAlertController class]]) {UIAlertController * alertVctl = (UIAlertController *) viewControllerToPresent ;if (alertVctl.title == nil && alertVctl.message == nil) {return ;}}// 頁面回調[self clearPresentViewController:viewControllerToPresent animated:flag completion:completion]; }6、代碼下載
- 代碼下載,可在博客下留言和郵箱。
- 可添加QQ:群號:185341804 (成功QQ吧),聯系群主獲取。
總結
以上是生活随笔為你收集整理的动态更新App的图标(AppIcon)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Tkinter单选框
- 下一篇: mysql 时区设定_mysql的时区设