Flutter项目——IOS动态更改图标

Flutter与IOS交互 ——使用pigeon插件

dev_dependencies: 

        pigeon: ^10.0.0

import 'package:pigeon/pigeon.dart';

@HostApi()
abstract class F2NApi {
  bool changeIcon(String iconId);
  String getStatement();
}

@FlutterApi()
abstract class N2FApi {
  String getInitStatement();
}

生成:

flutter pub run pigeon \

 --input  message.dart \

 --dart_out lib/message_generated.dart \

 --objc_header_out ios/Runner/Pigeon.h \

 --objc_source_out ios/Runner/Pigeon.m \

 --java_out android/app/src/main/java/com/metajoy/flutter_application_3/Pigeon.java \

 --java_package "com.metajoy.flutter_application_3"
# flutter pub run pigeon --input  message.dart --dart_out lib/pigeon/message_generated.dart --objc_header_out ios/Runner/Pigeon.h --objc_source_out ios/Runner/Pigeon.m --java_out android/app/src/main/java/com/metajoy/flutter_application_3/Pigeon.java --java_package "com.metajoy.flutter_application_3"

IOS端的实现:主要使用了IOS10.3提供的setAlternateIconName,传入nil则重置为原始图标。

前期配置:

Xcode13及以上版本:

1.直接在Assets.xcassets中创建AppIcon

在这里插入图片描述

2.工程Build Settings中 Include all app icon assets改为 YES。​​​​​​​

在这里插入图片描述

Xcede13之前的版本:需要在Info.plist中添加**CFBundleAlternatelcons**相关字段来声明对应的备用图标。 

具体代码:

OC代码:

@interface MyApi : NSObject<F2NApi>
@end

@implementation MyApi

- (void)extracted:(NSString * )iconId {
    if(@available(iOS 10.3,*)){
        if(![[UIApplication sharedApplication] supportsAlternateIcons]){
            return;
        }
        if([iconId isEqualToString:@"AppIcon"] || [iconId isEqualToString:@""]){
            iconId = nil;
        }
        [[UIApplication sharedApplication] setAlternateIconName:iconId completionHandler:^(NSError * _Nullable error) {
            if(error){
                NSLog(@"更换icon发生错误err: %@",error);
            }else{
                NSLog(@"更换成功");
            }
            
        }];
        
        
    }else{
        NSLog(@"版本太低了");
    }
}

-(NSNumber *)changeIconIconId:(NSString *)iconId error:(FlutterError *_Nullable *_Nonnull)error{
    NSLog(@"flutter向native传递消息 %@", iconId);
    [self extracted:iconId];
    return @YES;
}

Swift代码:

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        
        self.changeAppIcon(iconName: "AppIcon1")
    }
    
    func changeAppIcon(iconName: String?) {
        if #available(iOS 10.3, *) {
            
            if UIApplication.shared.supportsAlternateIcons == false {
                
                return;
            }
            
            //iconName 如果传nil 可以重置为原始icon
            UIApplication.shared.setAlternateIconName(iconName) { error in
                
                if error != nil {
                    print("更换app图标发生错误了" + "\(error.debugDescription)")
                } else {
                    print("替换icon成功")
                }
            }
            
        } else {
            
            print("系统版本太低了")
            
        }
        
    }

 效果图:

如果想要取消弹窗:iOS替换应用图标_ios 修改应用图标_LocationLu的博客-CSDN博客 

猜你喜欢

转载自blog.csdn.net/renxi0/article/details/130062706