我正在运行 Xcode 6 Beta 5,但这从第一个 Beta 版开始就一直在发生。每次运行后,我在模拟器中的应用程序目录都会不断重命名。我花了一段时间才弄清楚这一点。我正在使用它来获取文档的目录参考。
NSString *folder = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
NSUserDomainMask,
YES) lastObject];
NSLog(@"Documents Dir: %@",folder);
现在例如在第一次运行时它将是:
/Users/Joey/Library/Developer/CoreSimulator/Devices/5B9930EE-A9B4-4B36-BABB-AA864ACAF2DE/data/Containers/Data/Application/4B10C2E4-A5C3-4C64-93B1-4069FCCB9C46/Documents
第二次运行现在是:
/Users/Joey/Library/Developer/CoreSimulator/Devices/5B9930EE-A9B4-4B36-BABB-AA864ACAF2DE/data/Containers/Data/Application/7E9EB62D-115A-4092-AD23-CB6BA3E5E10F/Documents
第三轮:
/Users/Joey/Library/Developer/CoreSimulator/Devices/5B9930EE-A9B4-4B36-BABB-AA864ACAF2DE/data/Containers/Data/Application/EC8F41E8-52ED-4B10-9808-B3ACC46FC6AA/Documents
这对我的应用程序造成了严重破坏,因为它存储了应用程序内某些文件的路径引用。并不是我的 NSLog 语句返回了不正确的结果,我验证了 Finder 中发生的情况。每次都改名字。有人见过这种情况吗?这是我误解的“功能”吗?
NSString *folder = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
如何被视为“绝对路径”?看起来很动态,我错过了什么?
事实证明,Xcode 6 实际上每次运行都会更改应用程序的 UUID,而我存储绝对路径是错误的。
使用 SIMPHOLDERS
我在 Xcode 5 上使用了这个应用程序,在 Finder 中打开 Documents 文件夹,用于模拟器中当前正在运行的应用程序。
尚未为 Xcode 6 做好准备(截至 2014 年 9 月 24 日),但省去了所有这些麻烦。
在 Xcode 6 / iOS8 中,捆绑包现在与数据分离。/应用程序 GUID 在 Xcode 中的运行之间重新生成(不知道为什么)
DOCUMENTS DIR:/Users/gbxc/Library/Developer/CoreSimulator/Devices/AC79941F-EC56-495E-A077-773EEE882732/data/Containers/Data/Application/C220D351-0BE7-46BA-B35E-D16646C61A3F/Documents
mainBundlePath_:/Users/gbxc/Library/Developer/CoreSimulator/Devices/AC79941F-EC56-495E-A077-773EEE882732/data/Containers/Bundle/Application/12200D1D-9B67-408B-BCF7-38206CBE0940/myappname.app/BLANK_BLOG_SCALED.jpg
1.在模拟器中找到设备文件夹
/Users/gbxc/Library/Developer/CoreSimulator/Devices/
打开每个 /device.plist 以查看哪个 GUID 是 XCode 中的哪个设备 - 我认为这是静态的
3. 找到您在 iPad 2 上运行的设备 - 我认为这是静态的
/Devices/AC79941F-EC56-495E-A077-773EEE882732
4. 找到您的应用程序 /Documents 文件夹
/AC79941F-EC56-495E-A077-773EEE882732/data/Containers/Data/Application/C220D351-0BE7-46BA-B35E-D16646C61A3F/Documents
注意每次在 XCode 6 中运行应用程序时都会重新生成 GUID C220D351-0BE7-46BA-B35E-D16646C61A3F
NSArray *paths_ = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
if(paths_){
_docsDir = [paths_ firstObject];
DebugLog(@"DOCUMENTS DIR:%@",_docsDir);
}else{
ErrorLog(@"paths_ is nil - cant get Documents directory");
}
主捆绑包路径
NSString *mainBundlePath_ = [[NSBundle mainBundle] pathForResource:@"someimageinyourbundle" ofType:@"jpg"];
/AC79941F-EC56-495E-A077-773EEE882732/data/Containers/Bundle/Application/12200D1D-9B67-408B-BCF7-38206CBE0940/clarksonsiq.app/BLANK_BLOG_SCALED.jpg
永远不要在运行之间缓存 /Documents 的路径,它会改变。
我正在将它序列化为一个 plist 并且无法弄清楚为什么它们一直消失
/Documents 上方的 GUID 在运行之间不断变化,但如果您在 Finder 中打开了 /Documents,则文件夹保持打开状态。
https://devforums.apple.com/thread/235911?tstart=0
https://devforums.apple.com/thread/238754?tstart=0
免费解决方案
使用开源库 OpenSim。 OpenSim 是 SimPholders 的开源替代品,用 Swift 编写。
付费解决方案
使用 SimPholder 应用程序了解当前应用程序位置。
https://i.stack.imgur.com/MYgIy.png
对于 xcode 6.0 >
下载 SimPholder 2.0 alpha 2
对于 xcode 5.1 <
下载 SimPholders 1.5
我可以确认这是 Xcode 6 相关而不是 iOS 8。
我有两台开发机器。其中一个我有 Xcode 5。我一直在那台机器上工作,我的 URL 很好(照片应用程序,照片可见)。
昨天我在一台装有 Xcode 6 的机器上签入了 git 我的源代码。我注意到我的照片不再可见,只有在该应用程序会话期间创建的照片。
经过一点调试,我意识到 file:///var/mobile/Applications/B6A6BAEF-C90C-4A2A-93DB-E6700B88971F/Documents/ 在每次应用程序运行时都会发生变化。
我一直在使用 iOS 7 设备。
我将再次在一台装有 Xcode 5 的机器上进行检查,以确认我什么时候拿到它。
您只需在 DocumentDirectory(目录/文件名)中保存路径,并在每次加载文件时将其添加到 DocumentDirectory...
-(void)saveImage:(UIImage *)image{
NSData *pngData = UIImagePNGRepresentation(image);
NSString *pathInDocumentDirectory = [APP_DocumentDirectory stringByAppendingPathComponent:PROFILE_IMAGE_NAME];
NSString *filePath = [self documentsPathForFileName:pathInDocumentDirectory];
//Save pic file path - DirName/Filename.png
[XYZPreferencesHelper setUserImageFilePath:pathInDocumentDirectory];
//Write the file
[[NSFileManager defaultManager] createFileAtPath:filePath contents:pngData attributes:nil];
}
-(void)loadSavedUserPicture{
//Load saved DirName/Filename.png
NSString *pathInDocumentDirectory = [XYZPreferencesHelper getUserImageFilePath];
if (pathInDocumentDirectory != nil){
//Full path with new app Document Directory
NSString *filePath = [self documentsPathForFileName:pathInDocumentDirectory];
if ([[NSFileManager defaultManager] fileExistsAtPath:filePath]){
NSData *pngData = [NSData dataWithContentsOfFile:filePath];
UIImage *image = [UIImage imageWithData:pngData];
if (image != nil){
userPicImageView.image = image;
}
}
}
}
- (NSString *)documentsPathForFileName:(NSString *)name
{
NSString *documentsPath = [self createRestcallDirectoryIfNotExist];
return [documentsPath stringByAppendingPathComponent:name];
}
-(NSString *)createRestcallDirectoryIfNotExist{
NSString *path;
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsPath = [paths objectAtIndex:0];
path = [documentsPath stringByAppendingPathComponent:APP_DocumentDirectory];
NSError *error;
if (![[NSFileManager defaultManager] fileExistsAtPath:path]) //Does directory already exist?
{
if (![[NSFileManager defaultManager] createDirectoryAtPath:path
withIntermediateDirectories:NO
attributes:nil
error:&error])
{
NSLog(@"Create directory error: %@", error);
}
}
return documentsPath;
}
因为应用程序的 UUID 更改并且不可靠,所以我们不应该存储 url,而是应该只存储文件名并在运行时重建 url,在更新/重新安装时,iOS 会创建新的主目录,将应用程序包存储在其中并复制文档文件,因此 url 会更改