iOS schem与Universal Link 调试时踩坑解决记录
馋嘴的张先生 人气:0简介
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;
加载全部内容