35

私のアプリは、ドキュメントディレクトリに一時ファイルまたはキャッシュファイルを保存していたため、Appleによって拒否されました。右。彼らの拒否メッセージは次のように述べています。

アプリで使用される一時ファイルは、/tmpディレクトリにのみ保存する必要があります

アプリケーションのフォルダにあるドキュメントライブラリのほかにあると思います。

現在、iPhoneシミュレーターでこの問題をデバッグしようとしています。を使用するNSTemporaryDirectory()と、Xcodeデバッガーで取得する値は/var/folders/yj/gnz1c7156c7d6d4fj429yms40000gn/T/tempzip.zipであり、ではありません/Users/me/Library/Application Support/iPhone Simulator/5.1/Applications/8F71AB72-598C-427A-A116-36833D3209F7/tmp/tempzip.zip

つまりNSTemporaryDirectory()、iPhoneシミュレーターを使用して異なる動作をしているのですが、デバッグ時にアプリケーションの一時ディレクトリを追跡することは可能ですか?

4

4 に答える 4

44

iOS9以降•Swift3以降

let tmpDirURL = URL(fileURLWithPath: NSTemporaryDirectory())

iOS 10.0 +ベータ版、macOS 10.12 +、tvOS10.0+ベータ版およびwatchOS3.0+•Xcode8•Swift3以降

let tmpDirURL = FileManager.default.temporaryDirectory
于 2016-09-04T15:28:43.893 に答える
26

2016年の回答を更新:

  • ユーザーが個人として明示的に受け入れ、iCloudスペースにバックアップされる可能性のあるデータは、ユーザーの「ドキュメント」ディレクトリに書き込む必要があります。

  • アプリケーションに属し、アプリケーションを拡張するデータ(たとえば、拡張ユーザーはダウンロードできます...)がバンドルに含まれていないデータは、appIDのタイトルを持つ「ApplicationSupport/」ディレクトリのサブフォルダーに書き込む必要があります。「キャッシュ」ディレクトリにすることもできます。

  • 寿命の短いデータは、アプリケーションのtmpディレクトリに保存できます。この場合、NSTemporaryDirectory()を使用して「tmp」ディレクトリを取得できます。さらにヘルプが必要な場合は、このリンクを確認してください。

説明については、「アプリ固有のファイルを保存する場所の決定」のセクションにあるこの公式iOS開発Appleページを確認してください。

以下は、NSURLをこれらのディレクトリに返し、あなたのようなものをより簡単にするように設計されたSwiftの3つの関数です。

Swift

func GetDocumentsDirectory()->NSURL{
    //returns User's "Documents" directory
    //something like this on a real device : file:///private/var/mobile/Containers/Data/Application/APPID/Documents/
    //something like this on the simulator : file:///Users/MACUSERID/Library/Developer/CoreSimulator/Devices/SIMDEVICEID/data/Containers/Data/Application/APPUUID/Documents/
    let filemgr = NSFileManager.defaultManager()
    let docsDirURL = try! filemgr.URLForDirectory(.DocumentDirectory, inDomain: .UserDomainMask, appropriateForURL: nil, create: true)
    return docsDirURL
}

func GetApplicationSupportDirectory()->NSURL{
    //returns Application's support directory
    //something like this on a real device : file:///private/var/mobile/Containers/Data/Application/APPID/Library/Application%20Support/YOURAPPBUNDLEID/
    //something like this on the simulator : file:///Users/MACUSERID/Library/Developer/CoreSimulator/Devices/SIMDEVICEID/data/Containers/Data/Application/APPUUID/Library/Application%20Support/YOURAPPBUNDLEID/
    let AllDirectories : [NSURL]
    var ApplicationSupportDirectory : NSURL=NSURL.init()
    var ApplicationDirectory : NSURL=NSURL.init()
    AllDirectories=NSFileManager.defaultManager().URLsForDirectory(.ApplicationSupportDirectory, inDomains: .UserDomainMask)
    if AllDirectories.count>=1{
        ApplicationSupportDirectory=AllDirectories[0]
    }
    if !ApplicationSupportDirectory.isEqual(nil) {
        ApplicationDirectory=ApplicationSupportDirectory.URLByAppendingPathComponent(NSBundle.mainBundle().bundleIdentifier!)
    }
    return ApplicationDirectory
}

func GetTemporaryDirectory()->NSURL{
    //returns Application's temporary directory
    //something like this on a real device : file:///private/var/mobile/Containers/Data/Application/APPID/tmp/
    //something like this on the simulator : file:///Users/MACUSERID/Library/Developer/CoreSimulator/Devices/SIMDEVICEID/data/Containers/Data/Application/APPUUID/tmp/
    return NSURL(fileURLWithPath: NSTemporaryDirectory(), isDirectory: true)
}
于 2016-05-10T23:55:07.423 に答える
12

これを実際のデバイスでテストしたところ、「/ private / var / mobile / Applications / C82383-EBD6-4F72-BC16-A865478D27 / tmp/tempzip.zip」が返されました。

したがって、全体として、を使用NSTemporaryDirectory()することが一時ディレクトリへのパスを見つける正しい方法であり、デバッグして内部で行われていることを表示する場合、iPhoneシミュレータを使用している場合はFinderで手動で見つける必要があります。

以下の新しい回答を確認してください(これは非推奨です)

于 2012-08-10T08:16:42.367 に答える
9

ドキュメントによると、NSTemporaryDirectory()このアプローチを支持することは避けるべきです

- (NSURL)URLForTemporaryFolder
{
    // Get a parent folder, trying user folder (fails iOS) and falling back to AppSupport and Docs
    NSURL *parentFolderURL = [NSURL URLForDirectory:NSUserDirectory domainMask:NSUserDomainMask];
    if (!parentFolderURL) parentFolderURL = [NSURL URLForDirectory:NSApplicationSupportDirectory domainMask:NSUserDomainMask];
    if (!parentFolderURL) parentFolderURL = [NSURL URLForDirectory:NSDocumentDirectory domainMask:NSUserDomainMask];

    // Get the temp folder URL using approach outlined in the docs
    NSURL *tmpURL = [[NSFileManager defaultManager]
     URLForDirectory:NSItemReplacementDirectory
     inDomain:NSUserDomainMask
     appropriateForURL:parentFolderURL
     create:YES
     error:NULL];

    return tmpURL;
}

これにより、呼び出すたびに新しい一意の一時フォルダーが作成され、クリーンアップするのはユーザーの責任であることに注意してください。

于 2013-09-21T20:24:37.943 に答える