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