【Universallink】问题记录

背景:
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方法,否则子插件方法不会被调用
  • 如果有多个子插件,某个子插件直接返回了 YES or NO 会导致其他插件的方法无法被调用,也就无法拿到跳转链接的数据,具体处理方法,见下面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的方式在插件里还原

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容