ChatGPT解决这个技术问题 Extra ChatGPT

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

我正在运行 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 中发生的情况。每次都改名字。有人见过这种情况吗?这是我误解的“功能”吗?

永远不要存储绝对路径。仅存储相对于 Documents 文件夹的路径。
好吧,我想这是一个教训。
每当用户更新到您的应用程序的较新版本时,路径也会在用户的设备上发生变化。
我发现即使应用程序没有退出(我的意思是强制退出)并被置于后台,值也可能会改变:)
NSString *folder = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject]; 如何被视为“绝对路径”?看起来很动态,我错过了什么?

J
Joseph Toronto

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


不仅仅是 Xcode;当您从商店下载应用程序的更新版本时也会发生同样的情况(十六进制部分更改)。所有路径都应该相对于应用程序文件夹存储,并在运行时重建完整路径(这个实际上咬了我一次!)
Nicolas,自 iOS 8 以来,这种行为(用于设备安装/升级)是新的吗?
我需要一个快捷方式来快速访问这个目录,以便在模拟器上进行调试。我尝试了一些复杂的方法来挖掘 xcodeproj 文件以找到最后一个构建目录。那没有用。我计划让应用程序(仅在模拟器中运行时)将其文档路径缓存到一些易于访问的文件中,然后当我需要在 Finder 中打开我的应用程序的文档目录时,我只需将其链接到文档路径缓存文件它在上次运行时创建。这样,即使应用程序 guid 每次运行都会更改,它也会始终指向应用程序的文档目录。
OTA 安装(通过任何方法、TestFlight、AppStore 或其他方式)总是会更改 UUID。只是 xCode 5 之前的电缆加载保留了相同的 UUID。
@NicholasMiari,那么如何创建相对于 app 文件夹的路径?
b
brian.clear

使用 SIMPHOLDERS

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

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/

打开每个 /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,它很难找到应用程序任何其他选项?
有人知道 Simpholders 的替代品吗?它总是为我挂起:(
C
Community

免费解决方案

使用开源库 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


是的,我一直在使用它,而且它摇滚。我只是希望它也适用于我的 iOS7 模拟器。
你能解释一下这如何修复/帮助解决问题中描述的问题吗?
v
vale4674

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

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

昨天我在一台装有 Xcode 6 的机器上签入了 git 我的源代码。我注意到我的照片不再可见,只有在该应用程序会话期间创建的照片。

经过一点调试,我意识到 file:///var/mobile/Applications/B6A6BAEF-C90C-4A2A-93DB-E6700B88971F/Documents/ 在每次应用程序运行时都会发生变化。

我一直在使用 iOS 7 设备。

我将再次在一台装有 Xcode 5 的机器上进行检查,以确认我什么时候拿到它。


S
Shlomi Fresko

您只需在 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;
}

W
Waaheeda

因为应用程序的 UUID 更改并且不可靠,所以我们不应该存储 url,而是应该只存储文件名并在运行时重建 url,在更新/重新安装时,iOS 会创建新的主目录,将应用程序包存储在其中并复制文档文件,因此 url 会更改


关注公众号,不定期副业成功案例分享
关注公众号

不定期副业成功案例分享

领先一步获取最新的外包任务吗?

立即订阅