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

文章介绍了如何在Flutter应用中使用Pigeon插件与iOS原生代码交互,特别是利用iOS10.3及以上版本的setAlternateIconName方法来改变应用图标。在Flutter端定义接口,通过Pigeon生成跨平台的绑定代码,然后在Objective-C或Swift中实现接口,处理图标变更的逻辑。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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的博客-优快云博客 

### 如何发布 Flutter 项目到应用商店 #### 准备工作 为了能够顺利地将Flutter应用程序发布至应用商店,无论是Google Play还是App Store,都需要做好一系列准备工作。对于iOS平台而言,这包括但不限于拥有macOS操作系统、有效的Apple ID(如果打算发布,则需加入苹果开发者计划)、以及最新版本的Xcode来支持打包操作[^3]。 #### 配置与构建 针对iOS端的应用程序,在准备阶段完成后,应确保已通过`flutter pub get`获取所有必要的包,并且可以通过命令`flutter build ios --release`来进行最终版本的构建。此过程会自动处理一些依赖项安装的工作,比如调用`pod install`以利用CocoaPods管理所需的第三方库[^2]。值得注意的是,在每次更改源码或是调整依赖关系之后,建议先清理旧有的构建产物再重新编译,即执行一次`flutter clean`后再尝试新的构建指令。 #### 打包与分发 一旦确认本地构建无误后,就可以着手进行更进一步的发布了。对于iOS设备上的应用,通常是在Xcode内完成最后几步——打开由Flutter生成的`.xcworkspace`文件,设置好签名等相关选项后启动归档(Archive),随后根据提示选择“Distribute App”,依照向导指示直至提交审核或直接发布给特定测试者群体[^4]。 至于Android方面,虽然具体细节有所区别,但整体思路相似:保证遵循官方指南中的各项要求,准备好相应的资源文件如图标等;接着借助Gradle工具链实现APK/Bundle形式的输出;最后登录Google Play Console上传制品并按指引完成后续流程即可[^5]。 ```bash # 清理缓存和临时文件 flutter clean # 获取最新的依赖包 flutter pub get # 构建iOS发行版 flutter build ios --release ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值