2009-08-16 2 views
3

문자열에서 XML 파일을 저장하는 것과 관련하여 문제가 발생했습니다.이 작업은 iPhone에서 수행됩니다. 파일 자체가 존재하며 프로젝트에 포함되어 있습니다 (따라서 작업 공간 내에서) 그리고 내가 따라 오는 코드 스 니펫에서 얻은 모든 표시는 에뮬레이터에서 오류없이 전달되고 iPhone (오류 513)에서 실패하지만 두 경우 모두 파일이 저장되지 않습니다! 파일에Objective-C (iPhone)의 파일에 문자열 저장

{ 
Hits = config->Hits; 

NSString* filenameStr = [m_FileName stringByAppendingFormat: @".xml" ]; 
NSString* pData = [self getDataString]; // write xml format - checked out ok 
NSError  *error; 

/* option 2 - does not work as well 
NSBundle  *mainBundle = [NSBundle mainBundle]; 
NSURL   *xmlURL = [NSURL fileURLWithPath:[mainBundle pathForResource: m_FileName ofType: @"xml"]]; 

if(![pData writeToURL: xmlURL atomically: true encoding:NSUTF8StringEncoding error:&error]) 
{ 
NSLog(@"Houston - we have a problem %[email protected]\n",[error localizedFailureReason]); 
return false; 
} 
*/ 

if(![pData writeToFile: filenameStr atomically: FALSE encoding:NSUTF8StringEncoding error:&error]) 
{ 
    NSLog(@"Houston - we have a problem %[email protected]\n",[error localizedFailureReason]); 
    return false; 
} 
return true; 

}

어떤 도움을 주시면 감사하겠습니다, -A

+1

오류 513이 무엇인지 설명 할 수있는 문자열을 제공 할 수 있습니까? 사이드 노트 : localizedFailureReason을 인쇄 할 때 NSLog 문에서 % s 대신 % @을 사용하는 것이 좋습니다. % @ 형식 지정자는 NSString *을 사용하고 % s는 null로 끝나는 char * 문자열을 필요로합니다. – Tyler

+1

기술적으로 % @는 모든 NSObject 유형을 취하고 문자열의 경우 자체 인 [object description]을 호출합니다. 하지만 다른 기본 NSObject 유형 (예 : 배열, 집합 등)에서도 작동합니다. – AlBlue

답변

19

당신은 쓸해야 응용 프로그램 패키지에 포함되어 있습니다. 실제 iPhone에서는 디지털 서명 된 파일이므로이 작업을 수행하지 못할 수 있습니다.

패키지 파일을 수정할 수있는 경우에도 데이터를 저장하기에는 적합하지 않습니다. App Store 업그레이드 또는 Xcode 빌드에서 응용 프로그램을 다시 설치하면 파일이 원본으로 덮어 씁니다.

대신 XML을 Documents 디렉토리에 저장하십시오. 파일이 코드에서 생성하지 않는 일부 초기 상태를 필요로하는 경우는 문서 디렉토리 처음이에 있는지 앱 수표를 가지고

NSArray* paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, 
    NSUserDomainMask, YES); 
NSString* documentsDirectory = [paths objectAtIndex:0];  
NSString* leafname = [m_FileName stringByAppendingFormat: @".xml" ]; 
NSString* filenameStr = [documentsDirectory 
    stringByAppendingPathComponent:leafname]; 

:이 같은 경로를 얻을 수 있습니다 누락 된 경우 패키지의 템플리트에서 복사하십시오.

구조화 된 데이터를 저장하는 대신 사용자 기본값을 사용하는 것이 좋습니다. 예 :

[[NSUserDefaults standardUserDefaults] setObject:foo forKey:FOO_KEY]; 
+1

+1 사용자 기본값 방식. 그러나 파일은 디지털 서명 되었기 때문에 덮어 쓰기를 방지하지 않고 읽기 전용이므로 덮어 쓸 수 없습니다. 그것들은 디지털 방식으로도 서명되었지만, 이것이 쓰여지는 것을 방해하지는 않습니다. – AlBlue