今回、開発を行ったアプリをswift2.3からswift4へアップデートする作業を行いました。
このアプリでは、ダウンロード最中にアプリを落としたら次に起動したときに、次の起動時に途中からダウンロードを再開するという機能があります。
その機能のテスト中に、発見したので紹介します。
ダウンロードを再開するための方法
アプリが落ちるタイミングでNSURLSessionDownloadTaskのcancelByProducingResumeDataを呼び出すことでplistファイルが取得できるので、これを保存します。このplistはダウンロード途中のファイルではなく、ダウンロード途中のファイルのパスやNSURLRequest、ファイルサイズ等のデータを持っています。
アプリが起動されたらこのファイルをdownloadTaskWithResumeDataの引数に使うことで、ダウンロードが途中から再開されます。
iOS11でダウンロードを再開するとファイルが破損する
バグってます。
iOS10のときもplistのデータが壊れていたので、OSがメジャーアップデートされた際は今後も気をつける必要がありそうです。
対応
フォーラムのコメントに従って
plistから「NSURLSessionResumeByteRange」を消すだけで、正常にダウンロードできました。
理由はわかりません...。