2012-06-05 1 views
0

샌드 박스에서 실행하기위한 요구 사항을 충족하도록 CoreData 기반 응용 프로그램을 업데이트하려고합니다. 그러나 마이그레이션은 어렵다고 판명되었습니다. NSPersistentDocument는 적절한 위치에서 마이그레이션을 시도하고 사용자의 허가없이 디스크에 저장하려고합니다. 따라서 가벼운 마이그레이션은 실패합니다.앱 샌드 박스 내에서 CoreData 문서를 어떻게 마이그레이션해야합니까?

필자는 디스크에서 마이그레이션하는 것을 피할 필요가있는 사람을 상상할 수 있지만 NSPersistentDocument에서이를 수행하는 방법을 알 수는 없습니다. NSDocumentController를 하위 클래스로 만들고 makeDocumentForURL : ...을 재정 의하여 마이그레이션이 필요한지 확인하는 것이 좋습니다. 그 시점에서 논리는 새로운 제목없는 문서를 작성하여 데이터를 마이그레이션하는 것이지만, 이것이 최선의 접근 방식인지 또는 다른 접근 방식을 고려해야하는지 잘 모르겠습니다.

샌드 박스 기반 코어 데이터 응용 프로그램의 마이그레이션은 어떻게 수행해야합니까?

답변

0

솔루션이 상상했던 것보다 더 복잡한 것으로 나타났습니다. 많은 저널이 있기 때문에 저널에 대답을 썼습니다 : http://www.codeotaku.com/blog/2012-06/sandboxing-core-data-and-migrations

그러나 여기에 간략한 요약이 있습니다. 핵심 데이터는 데이터를 마이그레이션하고 그 자리에서 파일에 쓰려고합니다. 파일에 대한 읽기 전용 액세스 만 있기 때문에 샌드 박스에서 작동하지 않습니다. 따라서 핵심 데이터 마이그레이션이 실패합니다. 필자의 경우 문서 생성 프로세스를 납치하여 마이그레이션이 필요한지 확인하고, 그렇다면 사용자에게 마이그레이션 된 데이터의 위치를 ​​선택하도록 (NSSavePanel 제시) 요청합니다. 그런 다음 적절한 임시 디렉토리에서 이주를 수행하여 이주 타스크를 특수 클래스로 전달합니다. 최종 데이터는 사용자가 지정한 위치로 다시 복사되고 대신 해당 문서가 열립니다.

1

임시 자격으로이 문제를 해결할 수있었습니다.

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> 
<plist version="1.0"> 
<dict> 
    <key>com.apple.security.app-sandbox</key> 
    <true/> 
    <key>com.apple.security.files.user-selected.read-write</key> 
    <true/> 
    <key>com.apple.security.network.client</key> 
    <true/> 
    <key>com.apple.security.temporary-exception.files.absolute-path.read-write</key> 
    <string>/Volumes/</string> 
    <key>com.apple.security.temporary-exception.files.home-relative-path.read-write</key> 
    <string>/</string> 
</dict> 
</plist> 

샌드 박스를 사용하지 않으면 자동 마이그레이션이 작동합니다.

하지만 본질적으로 샌드 박스의 상당 부분을 사용할 수 없으므로 앱 스토어 승인을 받기 위해 사과가 어떻게 반응 할 것인지 잘 모르겠습니다.

developer.apple.com에서 임시 자격을 사용해야 할 때 버그를 제출하는 것이 좋습니다.

+0

비 문서 앱에서 비슷한 문제가 발생했습니다. 2 일 동안 이전 데이터베이스를 가져올 수 없었습니다. sandboxing을 해제하고 마이그레이션 작업을 다시 시작한 다음 sandboxing을 다시 켜고 Xcode 4의 Target Summary 화면에서 읽기/쓰기 액세스 권한이 있는지 확인합니다. 그리고 헤이 - 피 묻은 presto 그것은 모든 피의 - 잘 일했다! 위에서 설명한 임시 자격은 필요하지 않았습니다. 나는 네가 틀렸다고 말하는 것이 아니고 .entitlements 파일의 상쾌함이 누군가에게 유용 할 때를 대비해서 ... – Todd