背景:
Flutter項(xiàng)目中使用了好幾個(gè)三方插件來接收并透?jìng)飨到y(tǒng)的universallink
數(shù)據(jù)到Flutter層,期間遇到了各種問題,這里主要針對(duì)知識(shí)盲點(diǎn)和遇到的問題做記錄處理
知識(shí)&問題
知識(shí)1:
app退入后臺(tái)或者在前臺(tái),下面方法發(fā)生調(diào)用
- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray * _Nullable))restorationHandler{
//其他第三方回調(diào):
return [super application:application continueUserActivity:userActivity restorationHandler:restorationHandler];
}
注意:
- 必須調(diào)用super方法,否則很多子插件內(nèi)的
continueUserActivity
方法不會(huì)被調(diào)用
知識(shí)2:
app殺死,universallink發(fā)生調(diào)用,app啟動(dòng),此時(shí)continueUserActivity
不會(huì)調(diào)用,需要從下面方法中獲取跳轉(zhuǎn)地址數(shù)據(jù)
- (BOOL)application:(UIApplication *)application
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
NSURL *url = (NSURL *)launchOptions[UIApplicationLaunchOptionsURLKey];
return [super application:application didFinishLaunchingWithOptions:launchOptions];;
}
注意:
- 上面appDelegate文件中,必須調(diào)用super方法,否則子插件方法不會(huì)被調(diào)用
- 如果有多個(gè)子插件,某個(gè)子插件直接返回了
YES
orNO
會(huì)導(dǎo)致其他插件的方法無法被調(diào)用,也就無法拿到跳轉(zhuǎn)鏈接的數(shù)據(jù),具體處理方法,見下面Flutter 插件內(nèi)生命周期還原
Flutter子插件事件還原
子插件中如果實(shí)現(xiàn)了app的生命周期事件,使用完畢需要還原一下,否則其他子插件無法正常使用生命周期函數(shù)
public class FlSharedLinkPlugin: NSObject, FlutterPlugin {
...
private var lifeCycleDelegate: FlutterPluginAppLifeCycleDelegate
...
init(_ channel: FlutterMethodChannel) {
self.channel = channel
// 初始化Flutter的app生命周期管理
lifeCycleDelegate = FlutterPluginAppLifeCycleDelegate.init()
super.init()
}
}
// 生命周期函數(shù)
public func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [AnyHashable: Any] = [:]) ->
...
// 還原
return lifeCycleDelegate.application(application, didFinishLaunchingWithOptions: launchOptions)
}
Flutter
AppDelegate
文件中的生命周期本質(zhì)上是FlutterAppDelegate
自定義的生命周期函數(shù),所以使用Flutter的方式在插件里還原