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


71

我正在运行Xcode 6 Beta 5,但是自从第一个Beta版以来,这种情况一直在发生。每次运行后,模拟器中我应用程序的目录都会不断重命名。我花了一段时间才弄清楚这一点。我正在使用它来获取文档的目录参考。

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

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

现在以第一次运行为例:

/用户/乔伊/库/开发人员/ CoreSimulator /设备/ 5B9930EE-A9B4-4B36-BABB-AA864ACAF2DE /数据/容器/数据/应用/ 4B10C2E4-A5C3-4C64-93B1-4069FCCB9C46 /文档

现在第二次运行是:

/用户/乔伊/库/开发人员/ CoreSimulator /设备/ 5B9930EE-A9B4-4B36-BABB-AA864ACAF2DE /数据/容器/数据/应用/ 7E9EB62D-115A-4092-AD23-CB6BA3E5E10F /文档

第三轮:

/用户/乔伊/库/开发人员/ CoreSimulator /设备/ 5B9930EE-A9B4-4B36-BABB-AA864ACAF2DE /数据/容器/数据/应用程序/ EC8F41E8-52ED-4B10-9808-B3ACC46FC6AA /文档

这对我的应用造成了严重破坏,因为它在应用中存储了某些文件的路径引用。不是我的NSLog语句返回错误的结果,而是我验证了这是在Finder中发生的情况。每次都在更改名称。有人见过这种情况吗?这是我误会的“特征”吗?


11
切勿存储绝对路径。仅存储相对于Documents文件夹的路径。
rmaddy14年

1
好吧,我想这是一个教训。
约瑟夫·多伦多

2
每当用户的设备更新到较新版本的应用程序时,其路径也会更改。
rmaddy14年

1
我发现即使该应用程序也没有退出(我是指要退出),并且进入了后台,该值也可能会发生变化:)
ikzjfr0 2014年

1
如何被NSString *folder = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];视为“绝对路径”?看起来很动态,我想念什么?
inorganik

Answers:


50

事实证明,Xcode 6实际上确实在每次运行时都会更改应用程序的UUID,而且我在存储绝对路径方面错了。


9
不只是Xcode;从商店下载应用程序的更新版本时,也会发生相同的情况(十六进制部分会更改)。所有路径都应相对于app文件夹存储,并在运行时重建完整路径(这实际上一次让我
难过

Nicolas,此行为(用于设备安装/升级)自iOS 8以来是新的吗?
史蒂文·克雷默2014年

我需要一个快捷方式来快速访问此目录,以便在模拟器上进行调试。我尝试了几种复杂的方法来挖掘xcodeproj文件,以查找最后的构建目录。那没用。我计划让该应用程序(仅在模拟器中运行时)将其文档路径缓存到一些易于访问的文件中,然后当我需要在Finder中打开我的应用程序的文档目录时,我将其链接到该文档路径缓存文件中它是在上次运行时创建的。这样,即使每次运行的应用程序guid都会更改,它也始终指向应用程序的文档目录。
鲈鱼

1
OTA安装(通过任何方法,TestFlight,AppStore或其他方法)始终会更改UUID。只是在xCode 5保留相同的UUID之前加载电缆。
Airsource Ltd 2014年

@NicholasMiari,那么如何创建相对于应用程序文件夹的路径?
Shabarinath Pabba 2015年

8

使用SIMPHOLDERS

我在Xcode 5上使用此应用程序在Finder中为模拟器中当前正在运行的应用程序打开了Documents文件夹。

http://simpholders.com/

尚未准备好使用Xcode 6(截至2014年9月24日),但省去了所有麻烦。

在Xcode 6 / iOS8中,捆绑包现在与数据分开了。/在Xcode中运行之间会重新生成应用程序GUID(不确定原因)

  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

我使用的是simPholders,但是对于xcode 6来说,找到应用程序还有其他选择吗?
Paresh Navadiya 2014年

有人知道Simpholders的替代方案吗?它总是对我来说挂起了:(
jamone 2015年

7

免费解决方案

使用开源库OpenSim。OpenSim是使用Swift编写的SimPholders的开源替代方案。

付费解决方案

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

在此处输入图片说明

对于xcode 6.0>

下载SimPholder 2.0 alpha 2


对于xcode 5.1 <

下载SimPholders 1.5


是的,我一直在使用它,而且效果还不错。我只是希望它也可以与我的iOS7模拟器一起使用。
约瑟夫·多伦多

1
您能否解释一下如何解决/帮助解决问题中所述的问题?
Ixx

1

我可以确认这与Xcode 6相关,而不与iOS 8相关。

我有两台开发机器。其中有一个我有Xcode5。我一直在那台机器上工作,我的URL很好(照片应用程序,照片可见)。

昨天,我在使用Xcode 6的计算机上从git表单中检入了源代码。我注意到我的照片不再可见,只有在该应用会话期间创建的照片才可见。

经过少量调试后,我意识到file:/// var / mobile / Applications / B6A6BAEF-C90C-4A2A-93DB-E6700B88971F / Documents /在每次运行的应用程序中都在变化。

一直以来,我都在使用iOS 7设备。

我将再次在装有Xcode 5的计算机上进行检查,以确认何时可以使用它。


1

您只需要在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;
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.