背景:
Flutter项目中使用了好几个三方插件来接收并透传系统的universallink数据到Flutter层,期间遇到了各种问题,这里主要针对知识盲点和遇到的问题做记录处理
知识&问题
知识1:
app退入后台或者在前台,下面方法发生调用
- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray * _Nullable))restorationHandler{
//其他第三方回调:
return [super application:application continueUserActivity:userActivity restorationHandler:restorationHandler];
}
注意:
- 必须调用super方法,否则很多子插件内的
continueUserActivity方法不会被调用
知识2:
app杀死,universallink发生调用,app启动,此时continueUserActivity 不会调用,需要从下面方法中获取跳转地址数据
- (BOOL)application:(UIApplication *)application
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
NSURL *url = (NSURL *)launchOptions[UIApplicationLaunchOptionsURLKey];
return [super application:application didFinishLaunchingWithOptions:launchOptions];;
}
注意:
- 上面appDelegate文件中,必须调用super方法,否则子插件方法不会被调用
- 如果有多个子插件,某个子插件直接返回了
YESorNO会导致其他插件的方法无法被调用,也就无法拿到跳转链接的数据,具体处理方法,见下面Flutter 插件内生命周期还原
Flutter子插件事件还原
子插件中如果实现了app的生命周期事件,使用完毕需要还原一下,否则其他子插件无法正常使用生命周期函数
public class FlSharedLinkPlugin: NSObject, FlutterPlugin {
...
private var lifeCycleDelegate: FlutterPluginAppLifeCycleDelegate
...
init(_ channel: FlutterMethodChannel) {
self.channel = channel
// 初始化Flutter的app生命周期管理
lifeCycleDelegate = FlutterPluginAppLifeCycleDelegate.init()
super.init()
}
}
// 生命周期函数
public func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [AnyHashable: Any] = [:]) ->
...
// 还原
return lifeCycleDelegate.application(application, didFinishLaunchingWithOptions: launchOptions)
}
Flutter
AppDelegate文件中的生命周期本质上是FlutterAppDelegate自定义的生命周期函数,所以使用Flutter的方式在插件里还原