web-dev-qa-db-ja.com

アプリケーションの再構築時のドキュメントディレクトリパスの変更

ビデオファイルをurlからダウンロードし、次のパスでドキュメントディレクトリに保存します。

  let destination: DownloadRequest.DownloadFileDestination = { _, _ in
      let pathComponent = "pack\(self.packID)-\(selectRow + 1).mp4"
      let directoryURL: URL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0]
      let folderPath: URL = directoryURL.appendingPathComponent("Downloads", isDirectory: true)
      let fileURL: URL = folderPath.appendingPathComponent(pathComponent)
      return (fileURL, [.removePreviousFile, .createIntermediateDirectories])
    }

ビデオがダウンロードされ、正常に再生されます。しかし、Xcodeでアプリケーションを再構築して、最後にダウンロードしたビデオを再生しようとすると、ビデオが表示されず、新しいビデオをダウンロードすると、保存して正常に再生されるという問題があります。

私は各ビデオバンドルパスを見てきましたが、それらは異なります。

1-file:/// Users/myMac/Library/Developer/CoreSimulator/Devices/EAC2F4CE-EA09-46C0-B403-1CE9E24B6822/data/Containers/Data/Application/1D2C1F7B-E627-4898- 91C1-D0AF8D5E0F1E/Documents/Downloads/pack7-1.mp4

2-file:/// Users/myMac/Library/Developer/CoreSimulator/Devices/EAC2F4CE-EA09-46C0-B403-1CE9E24B6822/data/Containers/Data/Application/F950E9A5-C9F3-4B8C-BCF5-647EEC233CEE/Documents/Downloads/pack7-3.mp4

さて、私の質問は、App Storeからアプリを更新する場合、それは再インストールを意味するのですか?このパスは変わりますか?

この問題を解決するにはどうすればよいですか?

14
ava

iOS 8以降、アプリを再起動するたびに、アプリのサンドボックスへの絶対URLが変更されます。したがって、絶対にビデオの絶対URLを保存しないでください。ビデオの名前を保存し、アプリを再起動するたびにURLを再作成します。

  let pathComponent = "pack\(self.packID)-\(selectRow + 1).mp4"
  let directoryURL: URL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0]
  let folderPath: URL = directoryURL.appendingPathComponent("Downloads", isDirectory: true)
  let fileURL: URL = folderPath.appendingPathComponent(pathComponent)

fileURLを取得したら、ファイルを検索すると、前回の起動時にダウンロードされたファイルが見つかります。

iOSは、ユーザーがアプリを起動するたびにアプリの新しいサンドボックスを作成します。したがって、絶対URLは非常に役立ちます。ただし、iOSは、以前と同じように、サンドボックス内のすべてのフォルダーとコンテンツをセットアップします。したがって、SandBoxのベースURLは変更されますが、すべてのコンテンツの相対URLはそのまま残ります。

したがって、絶対URLをフォルダに保存しないことをお勧めします:)

35

ブックマークを使用することをお勧めします。次の記事のセクションブックマークを使用したファイルの検索を確認してください。 https://developer.Apple.com/library/archive/documentation /FileManagement/Conceptual/FileSystemProgrammingGuide/AccessingFilesandDirectories/AccessingFilesandDirectories.html#//Apple_ref/doc/uid/TP40010672-CH

編集:

念のため、リンクされたドキュメントのいくつかの関連部分:

重要:アプリの実行中に安全に使用できますが、ファイル参照URLは、アプリの起動間で保存して再利用するのは安全ではありません。システムを再起動するとIDが変わる場合があります。アプリの起動間でファイルの場所を永続的に保存する場合は、ブックマークを使用したファイルの検索の説明に従ってブックマークを作成します。

多くのファイル処理を使用するアプリがあるので、NSURLカテゴリに次のメソッドを作成して、特定のURLのブックマークデータを返します。

- (NSData*)defaultBookmark
{
    NSError* error = nil;
    NSData* bookmarkData =  [self bookmarkDataWithOptions:NSURLBookmarkCreationSuitableForBookmarkFile
                           includingResourceValuesForKeys:nil
                                            relativeToURL:nil
                                                    error:&error];
    if (error != nil)
    {
        NSLog(@"error creating bookmark for url '%@': %@", self, error);
    }
    return bookmarkData;
}

ブックマークデータからNSURLオブジェクトを作成するには、次のようにします。

    NSError* error = nil;
    BOOL isStale = NO;
    NSURL* url = [NSURL URLByResolvingBookmarkData:bookmarkData
                                           options:NSURLBookmarkResolutionWithoutUI
                                     relativeToURL:nil
                               bookmarkDataIsStale:&isStale
                                             error:&error];
    if (error != nil || url == nil)
    {
        NSLog(@"Error restoring url from bookmark: %@", error);
    }
    else
    {
        // use url to load file
        ...
    }
4
D. Mika