Flutter project—IOS dynamically changes icons

Flutter interacts with IOS - using pigeon plug-in

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();
}

generate:

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"

Implementation on IOS: Mainly using setAlternateIconName provided by IOS10.3, passing in nil will reset it to the original icon.

Early configuration:

Xcode13 and above versions:

1. Create AppIcon directly in Assets.xcassets

Insert image description here

2. Change Include all app icon assets in the project Build Settings to YES. ​​​​​​​

Insert image description here

Versions before Xcede13: You need to add **CFBundleAlternatelcons** related fields in Info.plist to declare the corresponding alternate icon. 

Specific code:

OC code:

@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 Code:

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("系统版本太低了")
            
        }
        
    }

 Rendering:

If you want to cancel the pop-up window: iOS replace application icon_ios modify application icon_LocationLu's blog-CSDN blog 

Guess you like

Origin blog.csdn.net/renxi0/article/details/130062706