插件开发:仅为特定平台使用flutter包插件(例如Android而不是iOS)?



是否有一种方法可以只在一个(或特定的)平台上使用包插件,例如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

在你的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);.

iOS

通过复制GeneratedPluginRegistrant.m的内容实现PluginRegistrant.m。叫[PluginRegistrant registerWithRegistry:self];.

不一定是很难的问题,但我把这个留到以后。:)

  • GeneratedPluginRegistrant究竟如何知道哪些插件注册?(读取代码生成器)

相关内容

  • 没有找到相关文章

最新更新