踢到我你算是踢到棉花啦 發表於 2023-1-18 11:22:20

iOS schem与Universal Link 调试时踩坑解决记录

<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li>简介</li><li>AppDelegate和SceneDelegate</li><li>问题:在iOS13以上冷启动的时候不会走代理函数!</li><li>如果你用了Scheme方式:</li><ul class="second_class_ul"><li>iOS13之前会走这个代理函数</li><li>iOS13之后会走</li></ul><li>如果你用了Universal Link方式:</li><ul class="second_class_ul"><li>iOS13之前会走这个代理函数</li><li>iOS13之后会走</li></ul><li>总结</li><ul class="second_class_ul"></ul></ul></div><p class="maodian"></p><h2>简介</h2>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202301/20230118084545028.jpg" /></p>
<p>scheme和Universal Link是在iOS中两种可以在网页中点击回跳到自己预定的APP的两种方式。至于这两种方式需要怎么配置,这里就不做详细的介绍了。网上的文章一搜一大堆。今天主要是说一下这次的配置过程中遇到的问题。</p>
<p class="maodian"></p><h2>AppDelegate和SceneDelegate</h2>
<p>SceneDelegate是在iOS13的时候新增的,之前做老项目的迭代更新的时候很少接触这个文件。这回就简单的和它交流一下。</p>
<p>对于这次的交流结论是:当AppDelegate和SceneDelegate两个文件共存的时候,我们不仅仅要关注AppDelegate中的回调函数,还要关注SceneDelegate代理的回调函数,因为在不同的iOS系统下走的文件回调是不一样的。</p>
<p>在iOS13之前通通走AppDelegate,iOS13之后就会走SceneDelegate。</p>
<p class="maodian"></p><h2>问题:在iOS13以上冷启动的时候不会走代理函数!</h2>
<p>上面已经说过在iOS13之前通通走AppDelegate,iOS13之后就会走SceneDelegate。</p>
<p class="maodian"></p><h2>如果你用了Scheme方式:</h2>
<p class="maodian"></p><p class="maodian"></p><h3>iOS13之前会走这个代理函数</h3>
<div class="jb51code"><pre class="brush:cpp;">- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary&lt;UIApplicationOpenURLOptionsKey,id&gt; *)options{
}
</pre></div>
<p>我们只需要在里面多自己相应的逻辑处理就可以了,并且不用关注是冷启动还是APP已经在后台挂起。都能在这里获取到你想要的参数。</p>
<p class="maodian"></p><p class="maodian"></p><h3>iOS13之后会走</h3>
<div class="jb51code"><pre class="brush:cpp;">- (void)scene:(UIScene *)scene openURLContexts:(NSSet&lt;UIOpenURLContext *&gt; *)URLContexts{
    UIOpenURLContext *urlContext = URLContexts.anyObject
}
</pre></div>
<p>这时就会出现问题了,这个函数只有在APP在后台挂起的时候才会走。如果是冷启动的时候,压根不会走这个函数,从而导致我们拿不到那个想要跳转的链接地址。</p>
<p class="maodian"></p><h2>如果你用了Universal Link方式:</h2>
<h3>iOS13之前会走这个代理函数</h3>
<div class="jb51code"><pre class="brush:cpp;">- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void(^)(NSArray&lt;id&lt;UIUserActivityRestoring&gt;&gt; * __nullable restorableObjects))restorationHandler{
}
</pre></div>
<p>我们只需要在里面多自己相应的逻辑处理就可以了,并且不用关注是冷启动还是APP已经在后台挂起。都能在这里获取到你想要的参数。</p>
<h3>iOS13之后会走</h3>
<div class="jb51code"><pre class="brush:cpp;">- (void)scene:(UIScene *)scene continueUserActivity:(NSUserActivity *)userActivity{
}
</pre></div>
<p>这时就会出现问题了,这个函数只有在APP在后台挂起的时候才会走。如果是冷启动的时候,压根不会走这个函数,从而导致我们拿不到那个想要跳转的链接地址。</p>
<p class="maodian"></p><h2>总结</h2>
<p>在你使用SceneDelegate的时候不管你是scheme还是Universal Link 都会在冷启动的时候不走代理函数。解决办法有两种:<br />1.你可以不用SceneDelegate这个文件。这样就可以避免问题的出现。毕竟现在的APP好像并没有强制开发者只用SceneDelegate;<br />2.在无数次的测试的时候我们会发现在APP冷启动的时候都会走SceneDelegate的</p>
<div class="jb51code"><pre class="brush:cpp;">- (void)scene:(UIScene *)scene willConnectToSession:(UISceneSession *)session options:(UISceneConnectionOptions *)connectionOptions
</pre></div>
<p>我们可以对这个函数做做文章。 在<code>connectionOptions</code>中有两个属性,一个是<code>URLContexts</code>另一个是<code>userActivities</code>,你再看看对应在SceneDelegate的函数都有对应的形参,所以我们可以在冷启动的时候获取一下相应的参数然后从而达到获取链接参数的目的;</p>
<div class="jb51code"><pre class="brush:cpp;">scheme:
UIOpenURLContext *urlContext = connectionOptions.URLContexts.anyObject;
Universal Link:
NSUserActivity *userActivity =connectionOptions.userActivities.anyObject;</pre></div>
<p>以上就是iOS schem与Universal Link 调试时踩坑解决记录的详细内容,更多关于iOS schem Universal Link调试的资料请关注琼殿技术社区其它相关文章!</p>
                           
                            <div class="art_xg">
                              <b>您可能感兴趣的文章:</b><ul><li>vue3不能使用history.pushState修改url参数踩坑</li><li>Storybook 7.0 Beta Vue3踩坑解决记录</li><li>Android界面一键变灰开发深色适配模式编程示例</li><li>Android编程开发从零开始编写一个轻量级浏览器</li><li>编程开发中99%的研发者都踩过的误区</li></ul>
                            </div>

                        </div>
                        <!--endmain-->
頁: [1]
查看完整版本: iOS schem与Universal Link 调试时踩坑解决记录