封装Plugin组件注意事项
iOS组件可能要用到appdelegate
中的相关的回调方法。此时针对具有bool
返回值会有的回调方法会有问题:
- 如果返回
YES
,则先调用的组件会导致后调用的组件相同的回调方法无法执行
- 如果返回
NO
,在冷启动的时候,回调方法不会被吊起。
处理方法
可以通过统一返回FlutterPluginAppLifeCycleDelegate
调用方法来处理
1.声明FlutterPluginAppLifeCycleDelegate
1 2 3 4 5 6
| @interface YochatsharePlugin() @property FlutterMethodChannel *methodChannel;
@property (nonatomic, strong) NSMutableDictionary *shareDataSource; @property (nonatomic, strong) FlutterPluginAppLifeCycleDelegate* lifeCycleDelegate; @end
|
2.初始化FlutterPluginAppLifeCycleDelegate
1 2 3 4 5 6
| - (instancetype)init { if (self = [super init]) { _lifeCycleDelegate = [[FlutterPluginAppLifeCycleDelegate alloc] init]; } return self; }
|
3.通过FlutterPluginAppLifeCycleDelegate
返回
1 2 3 4 5 6 7 8 9 10 11 12 13
| - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary<UIApplicationLaunchOptionsKey,id> *)launchOptions { [MCShareConfig shareInstance].groupId = @"group.com.atomcloudstudio.splashchat"; [MCShareConfig shareInstance].containAppScheme = @"yochatshare://"; __weak typeof(self) weakSelf = self; if (self.shareDataSource.count == 0) return YES; [self.shareDataSource removeAllObjects]; [self.methodChannel invokeMethod:@"sendPhoto" arguments:self.shareDataSource result:^(id _Nullable result) { [weakSelf.shareDataSource removeAllObjects]; [MCShareTool mcs_clearData]; }];
return [_lifeCycleDelegate application:application didFinishLaunchingWithOptions:launchOptions]; }
|
其他所有方法的处理
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103
| @interface AppDelegate () @property (nonatomic, strong) FlutterPluginAppLifeCycleDelegate* lifeCycleDelegate; @end
@implementation AppDelegate
- (instancetype)init { if (self = [super init]) { _lifeCycleDelegate = [[FlutterPluginAppLifeCycleDelegate alloc] init]; } return self; }
- (BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary<UIApplicationLaunchOptionsKey, id>*))launchOptions { self.flutterEngine = [[FlutterEngine alloc] initWithName:@"messageFlutter" project:nil]; [self.flutterEngine runWithEntrypoint:nil]; [GeneratedPluginRegistrant registerWithRegistry:self.flutterEngine]; return [_lifeCycleDelegate application:application didFinishLaunchingWithOptions:launchOptions]; }
- (FlutterViewController*)rootFlutterViewController { UIViewController* viewController = [UIApplication sharedApplication].keyWindow.rootViewController; if ([viewController isKindOfClass:[FlutterViewController class]]) { return (FlutterViewController*)viewController; } return nil; }
- (void)touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event { [super touchesBegan:touches withEvent:event];
if (self.rootFlutterViewController != nil) { [self.rootFlutterViewController handleStatusBarTouches:event]; } }
- (void)application:(UIApplication*)application didRegisterUserNotificationSettings:(UIUserNotificationSettings*)notificationSettings { [_lifeCycleDelegate application:application didRegisterUserNotificationSettings:notificationSettings]; }
- (void)application:(UIApplication*)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData*)deviceToken { [_lifeCycleDelegate application:application didRegisterForRemoteNotificationsWithDeviceToken:deviceToken]; }
- (void)application:(UIApplication*)application didReceiveRemoteNotification:(NSDictionary*)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult result))completionHandler { [_lifeCycleDelegate application:application didReceiveRemoteNotification:userInfo fetchCompletionHandler:completionHandler]; }
- (BOOL)application:(UIApplication*)application openURL:(NSURL*)url options:(NSDictionary<UIApplicationOpenURLOptionsKey, id>*)options { return [_lifeCycleDelegate application:application openURL:url options:options]; }
- (BOOL)application:(UIApplication*)application handleOpenURL:(NSURL*)url { return [_lifeCycleDelegate application:application handleOpenURL:url]; }
- (BOOL)application:(UIApplication*)application openURL:(NSURL*)url sourceApplication:(NSString*)sourceApplication annotation:(id)annotation { return [_lifeCycleDelegate application:application openURL:url sourceApplication:sourceApplication annotation:annotation]; }
- (void)application:(UIApplication*)application performActionForShortcutItem:(UIApplicationShortcutItem*)shortcutItem completionHandler:(void (^)(BOOL succeeded))completionHandler NS_AVAILABLE_IOS(9_0) { [_lifeCycleDelegate application:application performActionForShortcutItem:shortcutItem completionHandler:completionHandler]; }
- (void)application:(UIApplication*)application handleEventsForBackgroundURLSession:(nonnull NSString*)identifier completionHandler:(nonnull void (^)(void))completionHandler { [_lifeCycleDelegate application:application handleEventsForBackgroundURLSession:identifier completionHandler:completionHandler]; }
- (void)application:(UIApplication*)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult result))completionHandler { [_lifeCycleDelegate application:application performFetchWithCompletionHandler:completionHandler]; }
- (void)addApplicationLifeCycleDelegate:(NSObject<FlutterPlugin>*)delegate { [_lifeCycleDelegate addDelegate:delegate]; } @end
|