简介

iOS schem 和 Universal Link 在调试时的踩坑记录
scheme和Universal Link是在iOS中两种能够在网页中点击回跳到自己预订的APP的两种方法。至于这两种方法需要怎么装备,这儿就不做详细的介绍了。网上的文章一搜一大堆。今天主要是说一下这次的装备过程中遇到的问题。

AppDelegate和SceneDelegate

SceneDelegate是在iOS13的时分新增的,之前做老项意图迭代更新的时分很少触摸这个文件。这回就简略的和它交流一下。
对于这次的交流结论是:当AppDelegate和SceneDelegate两个文件共存的时分,咱们不仅仅要重视AppDelegate中的回调函数,还要重视SceneDelegate署理的回调函数,因为在不同的iOS系统下走的文件回调是不一样的。在iOS13之前统统走AppDelegate,iOS13之后就会走SceneDelegate。

问题:在iOS13以上冷启动的时分不会走署理函数!

上面现已说过在iOS13之前统统走AppDelegate,iOS13之后就会走SceneDelegate。

如果你用了Scheme方法:
iOS13之前会走这个署理函数
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options{
}

咱们只需要在里面多自己相应的逻辑处理就能够了,并且不必重视是冷启动仍是APP现已在后台挂起。都能在这儿获取到你想要的参数。

iOS13之后会走
- (void)scene:(UIScene *)scene openURLContexts:(NSSet<UIOpenURLContext *> *)URLContexts{
    UIOpenURLContext *urlContext = URLContexts.anyObject
}

这时就会出现问题了,这个函数只要在APP在后台挂起的时分才会走。如果是冷启动的时分,压根不会走这个函数,然后导致咱们拿不到那个想要跳转的链接地址。

如果你用了Universal Link方法:
iOS13之前会走这个署理函数
- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void(^)(NSArray<id<UIUserActivityRestoring>> * __nullable restorableObjects))restorationHandler{
}

咱们只需要在里面多自己相应的逻辑处理就能够了,并且不必重视是冷启动仍是APP现已在后台挂起。都能在这儿获取到你想要的参数。

iOS13之后会走
- (void)scene:(UIScene *)scene continueUserActivity:(NSUserActivity *)userActivity{
}

这时就会出现问题了,这个函数只要在APP在后台挂起的时分才会走。如果是冷启动的时分,压根不会走这个函数,然后导致咱们拿不到那个想要跳转的链接地址。

总结

在你运用SceneDelegate的时分不管你是scheme仍是Universal Link 都会在冷启动的时分不走署理函数。解决办法有两种:
1.你能够不必SceneDelegate这个文件。这样就能够防止问题的出现。究竟现在的APP如同并没有强制开发者只用SceneDelegate;
2.在无数次的测试的时分咱们会发现在APP冷启动的时分都会走SceneDelegate的

- (void)scene:(UIScene *)scene willConnectToSession:(UISceneSession *)session options:(UISceneConnectionOptions *)connectionOptions

咱们能够对这个函数做做文章。 在connectionOptions中有两个属性,一个是URLContexts另一个是userActivities,你再看看对应在SceneDelegate的函数都有对应的形参,所以咱们能够在冷启动的时分获取一下相应的参数然后然后达到获取链接参数的意图;

scheme:
UIOpenURLContext *urlContext = connectionOptions.URLContexts.anyObject;
Universal Link:
NSUserActivity *userActivity =connectionOptions.userActivities.anyObject;