私のアプリは、一時ファイルまたはキャッシュファイルをドキュメントディレクトリに格納していたため、Appleによって拒否されました。そうです。拒否メッセージには次のように記載されています。
アプリが使用する一時ファイルは、_
/tmp
_ディレクトリにのみ保存する必要があります
アプリケーションのフォルダにDocumentsとLibrary以外にあると思います。
現在、この問題を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シミュレータを使用して別の動作をしていますか?そして、デバッグ時にアプリケーションの一時ディレクトリを追跡することは可能ですか?
更新された2016年の回答:
ユーザーによって個人として明示的に受け入れられ、ユーザーのiCloudスペースにバックアップされる可能性のあるデータは、ユーザーの「ドキュメント」ディレクトリに書き込む必要があります
アプリケーションに属し、拡張するデータ(拡張ユーザーはダウンロードできる...など)ですが、バンドルに含まれていないため、 "Application Support /"のサブフォルダーに書き込む必要がありますappIDのタイトルを持つディレクトリ。 「キャッシュ」ディレクトリにすることもできます。
寿命の短いデータは、アプリケーションのtmpディレクトリに保存できます。この場合、NSTemporaryDirectory()を使用して "tmp"ディレクトリを取得できます。 追加のヘルプについては、 このリンク を確認してください。
これをチェックしてください 公式iOS開発Appleページ セクション「アプリ固有のファイルを保存する場所を決定する "説明。
以下は、Swiftにある3つの関数で、これらのディレクトリにNSURLを返し、好みを簡単にするように設計されています。
スイフト:
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)
}
iOS 9以降•Swift 3以降
let tmpDirURL = URL(fileURLWithPath: NSTemporaryDirectory())
iOS 10.0 + Beta、macOS 10.12 +、tvOS 10.0 + Beta、watchOS 3.0+•Xcode 8•Swift 3以降
let tmpDirURL = FileManager.default.temporaryDirectory
これを実際のデバイスでテストしたところ、「/ private/var/mobile/Applications/C82383-EBD6-4F72-BC16-A865478D27/tmp/tempzip.Zip」が返されました。
したがって、全体的に、 NSTemporaryDirectory()
を使用することは、一時ディレクトリへのパスを見つける正しい方法であり、デバッグして内部で行われた内容を表示するには、それを見つける必要があります。 iPhoneシミュレーターを使用している場合は、Finderで手動で。
以下の新しい回答を確認してください(これは非推奨です)
the docs によると、このアプローチを優先して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;
}
これにより、呼び出すたびにnew一意の一時フォルダーが作成され、クリーンアップするかどうかはユーザー次第です。