Xcode 6在每次运行后都会在 iOS8模拟器中重命名我的应用程序的目录。

我正在运行 Xcode 6 Beta 5,但是从第一个 Beta 版本开始就出现了这种情况。模拟器中的应用程序目录在每次运行后都会被重命名。我花了很长时间才想明白。我要用这个找到医生的参考资料。

NSString *folder = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
NSUserDomainMask,
YES) lastObject];


NSLog(@"Documents Dir: %@",folder);

举个例子,第一次运行时:

/Users/Joey/Library/Developer/CoreSimulator/Device/5B9930EE-A9B4-4B36-BABB-AA864ACAF2DE/Data/Container/Data/Application/4B10C2E4-A5C3-4C64-93B1-4069FCCB9C46/document/用户/Joey/库/开发人员/CoreSimulator/设备/5B9930EE-A9B4-4B36-BABB-AA864ACAF2DE/数据/容器/数据/应用程序/4B10C2E4-A5C3-4C64-93B1-4069FCCB9C46/文

第二轮是:

/Users/Joey/Library/Developer/CoreSimulator/Device/5B9930EE-A9B4-4B36-BABB-AA864ACAF2DE/Data/Container/Data/Application/7E9EB62D-115A-4092-AD23-CB6BA3E5E10F/document/用户/Joey/库/开发人员/CoreSimulator/设备/5B9930EE-A9B4-4B36-BABB-AA864ACAF2DE/数据/容器/数据/应用程序/7E9EB62D-115A-4092-AD23-CB6BA3E5E10F/文

第三次:

/Users/Joey/Library/Developer/CoreSimulator/Device/5B9930EE-A9B4-4B36-BABB-AA864ACAF2DE/Data/Container/Data/Application/EC8F41E8-52ED-4B10-9808-B3ACC46FC6AA/document/用户/Joey/库/开发人员/CoreSimulator/设备/5B9930EE-A9B4-4B36-BABB-AA864ACAF2DE/数据/容器/数据/应用程序/EC8F41E8-52ED-4B10-9808-B3ACC46FC6AA/文

这对我的应用程序造成了严重破坏,因为它在应用程序中存储了某些文件的路径引用。这并不是因为我的 NSLog 语句返回了不正确的结果,而是因为我在 Finder 中验证了这一点。每次都改名字。有人看到过吗?这是我误解的“特写”吗?

10979 次浏览

事实证明,Xcode 6确实在每次运行时都会更改应用程序的 UUID,而我存储绝对路径的做法是错误的。

使用手提桶

我在 Xcode 5上使用这个应用程序,在 Finder 中为当前在模拟器中运行的应用程序打开“文档”文件夹。

Http://simpholders.com/

还没有为 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/

打开 each/device.plist 查看 XCode 中哪个 GUID 是哪个设备-我认为这是静态的

3. 找到你在 iPad 2上运行的设备——我认为这是静电干扰

/Devices/AC79941F-EC56-495E-A077-773EEE882732

4. 查找应用程序/文档文件夹

/AC79941F-EC56-495E-A077-773EEE882732/data/Containers/Data/Application/C220D351-0BE7-46BA-B35E-D16646C61A3F/Documents

当心 GUID C220D351-0BE7-46BA-B35E-D16646C61A3F 在 XCode 6中每次运行都会重新生成

 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

永远不要缓存运行之间的路径/文档,它将改变。

我把它连载到一个列表上,想不通为什么它们总是消失

上面的 GUID/Document 在运行之间不断变化,但是如果您在 Finder 中打开了/Document,那么文件夹将保持打开状态。

https://devforums.apple.com/thread/235911?tstart=0


https://devforums.apple.com/thread/238754?tstart=0

免费解决方案

使用开源库 OpenSim.OpenSim 是 SimP 持有者的一个开源替代品,用 Swift 编写。

付费解决方案

使用 SimPholder 应用程序了解当前应用程序的位置。

enter image description here

对于 xcode 6.0 >

下载 SimPholder 2.0 alpha 2


对于 xcode 5.1 <

下载 辛普森持有人1.5

我可以确认这是 Xcode 6而不是 iOS 8。

我有两台显影机。其中一个上面有 Xcode 5。我一直在那台机器上工作,我的网址也很好(照片应用程序,照片是可见的)。

昨天我用 Xcode 6在一台机器上检查了我的源代码。我注意到我的照片不再可见,只有照片是在应用程序会议期间创建的。

经过小小的调试,我意识到文件://var/mobile/Applications/B6A6BAEF-C90C-4A2A-93DB-E6700B88971F/Document/在每次运行应用程序时都在变化。

这段时间我一直在使用 iOS7设备。

我将再次检查机器上的 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 变化和不可靠,所以我们不应该存储网址,我们应该只存储文件名,并在运行时重建网址,在更新/重新安装 iOS 创建新的主目录,存储应用程序包,并复制文档文件,使网址变化