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
2. Change Include all app icon assets in the project Build Settings to YES.
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