菜鸟教程小白 发表于 2022-12-12 13:10:32

ios - NSURLSession 下载重新启动而不调用任何委托(delegate)


                                            <p><p>我注意到我的应用程序出现了与 NSURLSession 相关的奇怪行为。</p>

<p>我使用带有后台配置的 NSURLSession 开始下载,下载开始时没有任何问题,但在某些时候,显然是随机的,它会停止几秒钟,然后在不调用任何委托(delegate)以外的情况下重新启动 </p>

<pre><code>-URLSession: downloadTask: didWriteData: totalBytesWritten: totalBytesExpectedToWrite:
</code></pre>

<p>具有重置的字节数。</p>

<p>谁能告诉我发生了什么?</p>

<p>这是我初始化 session 的方式</p>

<pre><code>if([[systemVersion] compare:@&#34;8.0&#34; options:NSNumericSearch] != NSOrderedAscending)
{
    sessionConfiguration = ;
}
else
{
    sessionConfiguration = ;
}

sessionConfiguration.HTTPMaximumConnectionsPerHost = kSimultaneousDownloads;
;
sessionConfiguration.discretionary = NO;

self.session = ;
</code></pre>

<p>--编辑--</p>

<p>我按照 Rob 的建议,使用 Charles 和 xCode 调试器发现事情发生的顺序是:</p>

<ol>
<li>创建 session </li>
<li>调用<code>getTasksWithCompletionHandler</code>, session 上没有任务</li>
<li>开始下载任务</li>
<li>调用<code>URLSession:didReceiveChallenge:completionHandler:</code>,我调用完成处理程序<code>completionHandler(NSURLSessionAuthChallengePerformDefaultHandling,nil);</code></li>
<li>来自 <code>didWriteData:</code> 委托(delegate)的日志显示 id 为 1 的下载任务正在下载数据,下载显示在 Charles 上,状态为 Receiving response body</li>
<li>在某个随机时间点,我可以看到 Charles 上的下载状态更改为 Complete,并开始了新的下载</li>
<li>调用<code>URLSession:didReceiveChallenge:completionHandler:</code>,我调用完成处理程序<code>completionHandler(NSURLSessionAuthChallengePerformDefaultHandling,nil);</code></li>
<li>来自 <code>didWriteData:</code> 委托(delegate)的日志显示 id 为 2 的下载任务正在下载数据,新的下载显示在 Charles 上,状态为 Receiving response body</li>
</ol></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>几个建议:</p>
<ul>
<li><p>您在此处是否有任何重定向或身份验证挑战?您是否实现了这些委托(delegate),看看那里是否发生了什么有趣的事情?</p>
</li>
<li><p>你试过用 <a href="http://charlesproxy.com" rel="noreferrer noopener nofollow">Charles</a> 看这个吗?看看连接到底发生了什么?</p>
<p>这对于诊断行为是由于连接中实际发生的事情而不是由我们的客户端代码引起的某些症状时很有用。</p>
</li>
<li><p>最后,您的 <code>didWriteData</code> 是否记录了任务 ID(因为使用后台 session 可能会让人感到困惑,因为在应用程序的上一次运行中启动的下载可能会在您下次运行时完成应用程序)。</p>
</li>
</ul>
<p>就我个人而言,最后一期是我第一次开始使用后台 session 时最让我感动的一期。我们非常习惯于在调试器中运行应用程序,稍后停止并重新运行应用程序,而之前 session 的残余影响很小。但是后台 session 很麻烦,因为除非您真正从设备/模拟器中删除应用程序,否则这些旧请求会一直存在。</p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - NSURLSession 下载重新启动而不调用任何委托(delegate),我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/27275702/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/27275702/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - NSURLSession 下载重新启动而不调用任何委托(delegate)