Thay đổi icon cho App IOS mà không cần submit

Mở đầu

Gần đây chúng ta thường thấy có nhiều App thay đổi icon theo mùa hay event nào đó. Từ trước đến giờ, trên iOS để thay đổi icon của app chúng ta bắt buộc phải submit lên Apple Store, tuy nhiên từ iOS10.3 ta không cần phải submit mà vẫn có thể thay đổi được icon ^^. Hình dưới đây mình đã thử thay đổi icon từ Twitter sang Facebook.

Alternate Icons

Ta add thêm Extension của UIApplication vào như dưới đây

extension UIApplication {

    // If false, alternate icons are not supported for the current process.
    @available(iOS 10.3, *)
    open var supportsAlternateIcons: Bool { get }


    // 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.
    @available(iOS 10.3, *)
    open func setAlternateIconName(_ alternateIconName: String?, completionHandler: ((Error?) -> Swift.Void)? = nil)


    // If `nil`, the primary application icon is being used.
    @available(iOS 10.3, *)
    open var alternateIconName: String? { get }
}

Ngoài ra, do việc thay đổi icon bị hạn chế chỉ ở foreground nên sau khi thay đổi icon sẽ được thông báo dialog cho user.

Thực hiện

  1. Đăng ký Icon
  2. Đăng ký vào một số hạng mục cần thiết ở file Info.plist
  3. Thực hiện xử lý thay đổi Icon

1. Đăng ký icon

Do ở assert catalogue sử dụng icon không được "nuột" cho lắm nên mình đã lưu luôn ở trong project như hình.

2. Đăng ký vào một số hạng mục cần thiết ở file Info.plist

  1. Sử dụng Add row để thêm dòng mới vào, sau đó chọn Icon files (iOS 5)
  2. Primary Icon -> Icon files -> Item0 ở đây nhập tên default cho icon vào
  3. Để thay đổi được icon ta thêm CFBundleAlternateIcons vào
  4. CFBundleAlternateIcons -> nhập name tuỳ ý
  5. CFBundleAlternateIcons -> name (vừa nhập) -> CFBundleIconFiles -> Item0 : ở đây ta nhập name muốn đổi vào

Ở đây mình nhập name là facebook Icon và Instagram Icon. giá trị này sẽ được sử dụng trong source code

3. Thực hiện xử lý thay đổi Icon

Ta thực hiện một đoạn xử lý nhỏ như phần code ở dưới đây viết trong file ViewController.swift đó là khi nhấn vào Button thì icon sẽ thay đổi:

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    @IBAction func didTapChangeIcon(_ sender: UIButton) {

        // Info.plist で設定した値
        let iconName = "facebook Icon"

        UIApplication.shared.setAlternateIconName(iconName) { error in
            if let error = error {
                print(error.localizedDescription)
            }
            print("Done!")
        }
    }
}

Tổng kết

Chú ý là những app có icon động như đồng hồ hay Calendar thì ta không thể thay đổi được mà chỉ có thể thay đổi icon của app theo vd như mùa, event ... (theo hiệu biết hạn hẹp của mình)

Tham khảo : Qiita