是否有一种方法可以只在一个(或特定的)平台上使用包插件,例如iOS,而不是Android或web ?例如,firebase_messaging支持Android、iOS、macOS和Web,但我只希望它安装在需要FCM的Android上。我将用我自己的代码/其他库来支持其他平台。
我不希望插件在iOS上注册,因为它可能会导致崩溃/干扰我的应用程序,因为它做Objective-C方法搅拌。我想我不希望它的registerWithRegistrar
方法被调用。
注意:这是不同的支持特定的平台。也就是说,我仍然支持Android和iOS,我只是不希望一个插件在iOS上注册。考虑到这一点,我不仅想阻止插件注册,还想阻止编译。这是因为编译步骤会影响构建/其他插件。
Background
GeneratedPluginRegistrant
自动生成一个类来注册所有的插件:
Android,GeneratedPluginRegistrant.java
@Keep
public final class GeneratedPluginRegistrant {
public static void registerWith(@NonNull FlutterEngine flutterEngine) {
flutterEngine.getPlugins().add(new io.ably.flutter.plugin.AblyFlutterPlugin());
flutterEngine.getPlugins().add(new io.flutter.plugins.firebase.core.FlutterFirebaseCorePlugin());
flutterEngine.getPlugins().add(new io.flutter.plugins.firebase.messaging.FlutterFirebaseMessagingPlugin());
flutterEngine.getPlugins().add(new com.dexterous.flutterlocalnotifications.FlutterLocalNotificationsPlugin());
}
}
iOS,GeneratedPluginRegistrant.m
@implementation GeneratedPluginRegistrant
+ (void)registerWithRegistry:(NSObject<FlutterPluginRegistry>*)registry {
[AblyFlutterPlugin registerWithRegistrar:[registry registrarForPlugin:@"AblyFlutterPlugin"]];
[FLTFirebaseCorePlugin registerWithRegistrar:[registry registrarForPlugin:@"FLTFirebaseCorePlugin"]];
[FLTFirebaseMessagingPlugin registerWithRegistrar:[registry registrarForPlugin:@"FLTFirebaseMessagingPlugin"]];
[FlutterApnsPlugin registerWithRegistrar:[registry registrarForPlugin:@"FlutterApnsPlugin"]];
[FlutterLocalNotificationsPlugin registerWithRegistrar:[registry registrarForPlugin:@"FlutterLocalNotificationsPlugin"]];
}
@end
使用你在AppDelegate中调用registerWithRegistry:
方法,例如
在你的Android应用的MainActivity:
public class MainActivity extends FlutterActivity {
@Override
public void configureFlutterEngine(@NonNull FlutterEngine flutterEngine) {
GeneratedPluginRegistrant.registerWith(flutterEngine);
}
}
iOS在你的iOS应用的application:didFinishLaunchingWithOptions:
:
- (BOOL)application:(UIApplication *)application
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
[GeneratedPluginRegistrant registerWithRegistry:self];
// Override point for customization after application launch.
if (@available(iOS 10.0, *)) {
[UNUserNotificationCenter currentNotificationCenter].delegate = (id<UNUserNotificationCenterDelegate>) self;
}
return [super application:application didFinishLaunchingWithOptions:launchOptions];
}
@end
<标题>避免注册:- 停止使用
GeneratedPluginRegistrant
. - 注意:从现在开始,无论何时添加或删除包插件,都需要记住将生成的代码更新为新类。
- 警告:不幸的是,这实际上并没有避免编译/构建步骤。例如,插件的
AndroidManifest.xml
仍然会合并到你的应用程序清单中。 Android
通过复制GeneratedPluginRegistrant.java
的内容来实现PluginRegistrant.java
。叫PluginRegistrant.registerWith(flutterEngine);
.
通过复制GeneratedPluginRegistrant.m
的内容实现PluginRegistrant.m
。叫[PluginRegistrant registerWithRegistry:self];
.
不一定是很难的问题,但我把这个留到以后。:)
GeneratedPluginRegistrant
究竟如何知道哪些插件注册?(读取代码生成器)