scheme和Universal Link是在iOS中两种可以在网页中点击回跳到自己预定的APP的两种方式。今天主要是说一下在使用过程中SceneDelegate遇到的问题。
SceneDelegate是在iOS13的时候新增的,之前做老项目的迭代更新的时候很少接触这个文件。
对于这次的适配结论是:当AppDelegate和SceneDelegate两个文件共存的时候,我们不仅仅要关注AppDelegate中的回调函数,还要关注SceneDelegate代理的回调函数,因为在不同的iOS系统下走的文件回调是不一样的。
在iOS13之前通通走AppDelegate,iOS13之后就会走SceneDelegate。
上面已经说过在iOS13之前通通走AppDelegate,iOS13之后就会走SceneDelegate。
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary *)options{
}
我们只需要在里面多自己相应的逻辑处理就可以了,并且不用关注是冷启动还是APP已经在后台挂起。都能在这里获取到你想要的参数。
- (void)scene:(UIScene *)scene openURLContexts:(NSSet *)URLContexts{
UIOpenURLContext *urlContext = URLContexts.anyObject
}
这时就会出现问题了,openURLContexts只有在APP在启动并且后台挂起的时候才会走。如果是冷启动的时候,压根不会走这个函数,从而导致我们拿不到那个想要跳转的链接地址。
- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void(^)(NSArray> * __nullable restorableObjects))restorationHandler{
}
我们只需要在里面多自己相应的逻辑处理就可以了,并且不用关注是冷启动还是APP已经在后台挂起。都能在这里获取到你想要的参数。
- (void)scene:(UIScene *)scene continueUserActivity:(NSUserActivity *)userActivity{
}
这时就会出现问题了,continueUserActivity函数只有在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;
自己通过变量保存UIOpenURLContext *urlContext 和 NSUserActivity *userActivity , 然后在合适的时机调用,完成跳转到指定的页面。