【iOS】動態更換圖標

iOS 10.3蘋果添加了更換圖標的功能,經過這個功能,咱們能夠在適當的時候採起特定的方式爲咱們的App更換圖標。 聽似很好很方便,實則並無。緣由以下:html

  1. 更換的圖標,咱們須要預置在項目中
  2. 替換圖標這個功能,必定要通過用戶贊成(雖然有跳過這一步的方法,可是不建議使用

雖然咱們在使用這個功能時有着種種限制,可是瑕不掩瑜,他一樣爲咱們的用戶體驗帶來了提高:ios

  1. 逢年過節想換個應景的App圖標,不用在進行發版了
  2. 公司有個重大活動須要更換圖標,不用擔憂活動前不能成功發版上線了

注: 咱們更換的不僅是APP的圖標,還有通知欄的中的圖標,以及設置界面中的圖標等全部與咱們 App 有關的圖標。git

開發步驟

準備你要更換的圖標

將咱們須要更換的圖標放到咱們的項目目錄中(由於放到.xcassets中無論用),圖片的命名建議如下面的方式命名,例如:xx20x20@2x.png,xx20x20@3x.png…這樣在填寫Info.plist時也會省事不少。github

icon命名

PS: 其實對於更換的圖標,咱們也能夠只提供一張,但命名時,咱們就不要填寫具體的尺寸了,只保留圖片名字便可,例如:xx@2x.png,xx@3x.png, 可是效果上可能不如準備一整套的效果好。畢竟把一張桌面圖標大小的圖片塞到通知圖標那麼小的框裏,圖片會壓縮。objective-c

修改Info.plist

想要實現換圖標的功能,Info.plist 文件的修改是很重要的一步。數組

編輯Info.plist

  • CFBundleIcons: 一個字典,包含全部AppIcon信息,即上圖的Icon files(iOS 5)
  • CFBundlePrimaryIcon: 若是已經在Assets.xcassets中設置了AppIcon,那麼CFBundlePrimaryIcon中的配置會被忽略,Assets.xcassetsAppIcon將會自動配置到CFBundlePrimaryIcon中。
  • CFBundleAlternateIcons: 一個數組,負責配置可供替換的icon信息
  • UIPrerenderedIcon: 是否已經預渲染,若是不設置該項或者設爲NO。系統會自動爲icon進行渲染增長光澤

若是想詳細瞭解CFBundleIcons, CFBundlePrimaryIcon, CFBundleAlternateIcons,請查看附件2app

若是iPad須要也須要更換圖標,那麼咱們須要在CFBundleIcons~ipad進行一樣的設置。async

注: 不能把圖片放在.xcassets裏面ide

編寫代碼

經過查看文檔,咱們能夠看到下面幾個屬性和方法。ui

// 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));
複製代碼

系統提供的 API 簡單明瞭,惟一要注意的是下面這個方法。

- (void)setAlternateIconName:(nullable NSString *)alternateIconName completionHandler:(nullable void (^)(NSError *_Nullable error))completionHandler
複製代碼

方法中的alternateIconName參數,是要填寫您在Info.plist 中填寫的名字,如圖二中所示,咱們應當在此方法中填寫female或者male1.

代碼示例

爲了方便你們使用,我將更換圖標相關的代碼已經寫好在下面,如需自取。 也能夠訪問 DynamicAppIconDemo,查看 FSAppIconManager

+ (NSString *)getCurrentAppIconName {
    if (@available(iOS 10.3, *)) {
        return ([UIApplication sharedApplication].alternateIconName.length == 0) ? @"" : [UIApplication sharedApplication].alternateIconName;
    } else {
        // Fallback on earlier versions
        return @"";
    }
}

+ (BOOL)canChangeAppIcon {
    if (@available(iOS 10.3, *)) {
        return [[UIApplication sharedApplication] supportsAlternateIcons];
    } else {
        // Fallback on earlier versions
        return NO;
    }
}

+ (void)changeAppIconWithIconName:(NSString *)iconName completionHandler:(void (^)(NSError * _Nullable))completionHandler {
    if (@available(iOS 10.3, *)) {
        [[UIApplication sharedApplication] setAlternateIconName:iconName completionHandler:^(NSError * _Nullable error) {
            if (!error) {
                completionHandler(nil);
            } else {
                completionHandler(error);
            }
        }];
    } else {
        // Fallback on earlier versions
        NSDictionary *userInfo = @{
                                   NSLocalizedDescriptionKey: NSLocalizedString(@"AppIcon change failed", nil),
                                   NSLocalizedFailureReasonErrorKey: NSLocalizedString(@"The current system version does not support replacing the AppIcon.", nil),
                                   NSLocalizedRecoverySuggestionErrorKey: NSLocalizedString(@"", nil)
                                   };
        NSError *error = [NSError errorWithDomain:@""
                                             code:34001
                                         userInfo:userInfo];
        completionHandler(error);
    }
}
複製代碼

下面給出部分 App Icon 相關的資料

App Icon Attributes

Attribute Value
Format PNG
Color space sRGB or P3 (see Color Management)
Layers Flattened with no transparency
Resolution Varies. See Image Size and Resolution
Shape Square with no rounded corners

App Icon Sizes

Device or context Icon size
iPhone 180px × 180px (60pt × 60pt @3x)
120px × 120px (60pt × 60pt @2x)
iPad Pro 167px × 167px (83.5pt × 83.5pt @2x)
iPad, iPad mini 152px × 152px (76pt × 76pt @2x)
App Store 1024px × 1024px (1024pt × 1024pt @1x)

Spotlight, Settings, and Notification Icons

Device or context Spotlight icon size Settings icon size Notification icon size
iPhone 120px × 120px (40pt × 40pt @3x) 87px × 87px (29pt × 29pt @3x) 60px × 60px (20pt × 20pt @3x)
80px × 80px (40pt × 40pt @2x) 58px × 58px (29pt × 29pt @2x) 40px × 40px (20pt × 20pt @2x)
iPad Pro, iPad, iPad mini 80px × 80px (40pt × 40pt @2x) 58px × 58px (29pt × 29pt @2x) 40px × 40px (20pt × 20pt @2x)

Notice:

Don’t add an overlay or border to your Settings icon. iOS automatically adds a 1-pixel stroke to all icons so that they look good on the white background of Settings.

  1. Human Interface Guidelines - App Icon
  2. CFBundleIcons,CFBundlePrimaryIcon,CFBundleAlternateIcons

title: 【iOS】動態更換 App 圖標

author: zhangpeng

date: 2018.07.10

GitHub: github.com/fullstack-z…

相關文章
相關標籤/搜索