アプリの実行ごとに単純なログ ファイルを書き込もうとしています。ログファイル名は現在の時刻に基づいており、アプリ ディレクトリに保存されます。以下のコードは私が試しているもので、シミュレーターで動作しますが、iPad で実行すると「操作が許可されていません」(errno.h の EPERM) で失敗します。
-(BOOL)CreateLogFile
{
mLogFilePath = [self GetLogFileNameForTimeNow];
BOOL Success = [[NSFileManager defaultManager] createFileAtPath:mLogFilePath contents:nil attributes:nil];
/*BOOL Success = [[NSFileManager defaultManager] createFileAtPath:mLogFilePath contents:nil attributes:[NSDictionary dictionaryWithObject:NSFileProtectionComplete
forKey:NSFileProtectionKey]];*/
if ( Success )
{
NSLog( @"Successfully created file: %@", mLogFilePath );
mLogFileHandle = [NSFileHandle fileHandleForWritingAtPath:mLogFilePath];
[self WriteInstanceInformationToLog];
}
else
{
NSLog( @"Failed to create file: %@ %s", mLogFilePath, strerror(errno) );
}
return Success;
}
コメントアウトされたコードも試しましたが、それも失敗します。私はiOSプログラミングに慣れていないので、基本的なものが欠けている可能性があります。とにかく、上記の出力フォームは iPad で次のように表示されます。
2013-05-10 14:54:51.794 RichTest1[128:907] Failed to create file:
/var/mobile/Applications/XXXX/RichTest1.app/20130510145451.log Operation not permitted
しかし、シミュレータでは動作します:
2013-05-10 15:07:14.696 RichTest1[1604:c07] Successfully created file:
Users/abruce/Library/Application Support/iPhone Simulator/6.1/Applications/XXXX/RichTest1.app/20130510150714.log
どこが間違っていますか?
--edit ここにコードがありますGetLogFileNameForTimeNow
-(NSString*)GetLogFileNameForTimeNow
{
NSString* FileName = [NSString stringWithFormat:@"%@.log", [self GetTimeAsString] ];
NSString* AppFolderPath = [[NSBundle mainBundle] resourcePath];
return [NSString stringWithFormat:@"%@/%@", AppFolderPath, FileName];
}
-(NSString*)GetTimeAsString
{
return [mDateFormatter stringFromDate:[NSDate date]];
}
日付フォーマッターは、クラスのコンストラクターで次のように設定されます。
mDateFormatter = [[NSDateFormatter alloc] init];
NSString* DateFormat = @"yyyyMMddHHmmss";
[mDateFormatter setDateFormat:DateFormat];