generateIosIcon method

void generateIosIcon(
  1. Uint8List imageBytes,
  2. Directory targetDir,
  3. Color? backgroundColor
)

產生ios app icon的圖標 imageBytes - 原本的圖標bytes targetDir - 目標資料夾: 通常指向到 ios/Runner/Assets.xcassets/AppIcon.appiconset 產生的size列表 20x20(x2,x3) 29x29(x2,x3) 38x38(x2,x3) 40x40(x2,x3) 60x60(x2,x3) 64x64(x2,x3) 68x68(x2) 76x76(x2) 83.5x83.5(x2) 1024x1024

Implementation

void generateIosIcon(
  Uint8List imageBytes,
  Directory targetDir,
  Color? backgroundColor,
) {
  final sizeList = [
    IosIconSize(size: 20, multiple: [2, 3]),
    IosIconSize(size: 29, multiple: [2, 3]),
    IosIconSize(size: 38, multiple: [2, 3]),
    IosIconSize(size: 40, multiple: [2, 3]),
    IosIconSize(size: 60, multiple: [2, 3]),
    IosIconSize(size: 64, multiple: [2]),
    IosIconSize(size: 76, multiple: [2]),
    IosIconSize(size: 83.5, multiple: [2]),
    IosIconSize(size: 1024),
  ];

  targetDir.createSync(recursive: true);

  final imageBeans = <IosIconStructImagesBean>[];

  for (var size in sizeList) {
    for (var multiple in size.multiple) {
      // 雖然只能整數, 但目前唯一有小數點的83.5是x2, 所以不會有誤差
      final imageSize = (size.size * multiple).toInt();
      final newImageBytes = MxImageUtil.resizeImage(
        imageBytes,
        imageSize,
        imageSize,
        removeAlpha: true,
        backgroundColor: backgroundColor,
      );
      final imageName = size.iconName(multiple);

      final bean = IosIconStructImagesBean(
        size: '${size.size}x${size.size}',
        idiom: 'universal',
        filename: '$imageName.png',
        scale: '${multiple}x',
        platform: 'ios',
      );

      imageBeans.add(bean);

      // 把圖片寫入檔案
      File('${targetDir.path}/${bean.filename}')
          .writeAsBytesSync(newImageBytes);
    }
  }

  // 最後生成對應圖檔的結構json
  final structBean = IosIconStructBean(
    images: imageBeans,
    info: IosIconStructInfoBean(
      version: 1,
      author: 'com.mx.appicon',
    ),
  );

  final encoder = JsonEncoder.withIndent('    ');
  final structString = encoder.convert(structBean.toJson());

  File('${targetDir.path}/Contents.json').writeAsStringSync(structString);
}