iOS开发者能够查看文件系统吗?

11

我想知道开发人员是否有办法在iOS设备上查看文件系统,就像iFile一样,但不需要越狱设备? 这是为了开发目的。

编辑 谢谢你们的回答!我知道应用程序文件夹内部有一个位置可以读取和写入。 但我正在寻找一种快速查看数据的方法,而不需要编码,就像iFile一样。这样我就可以检查我的写入功能是否成功或失败。


请查看以下两个链接:https://dev59.com/7WzXa4cB1Zd3GeqPWbL3 和 https://dev59.com/jV7Va4cB1Zd3GeqPNt26。 - user82216
另请参见https://dev59.com/7Gw15IYBdhLWcg3wpNUB。 - Johann
9个回答

13

尽管iDevice上的文件系统是沙盒化的,但iPhone模拟器中的文件系统却不是。您可以在模拟器上运行应用程序,并通过以下方式检查其中的内容:

~/Library/Application Support/iPhone Simulator/5.0/Applications

它应该符合您的需求。


9
适用于设备:使用桌面应用程序iPhone-Explorer,通过 USB 读取文件系统(它可以读写整个用户指定区域(应用程序、音乐、照片、视频、笔记等),但如果您没有越狱并安装 afc2add,则无法读写整个系统)。
适用于 iPhone 模拟器(像 Liz 提到的那样):~/Library/Application Support/iPhone Simulator/5.0/Applications

有什么猜测 iExplorer 如何能够访问这些文件。我需要从我的 MacOS 应用程序中访问我的应用程序共享文档文件夹。 - Shohrab

6

在iOS设备上,您可以查看文件,但仅限于您的应用程序沙盒中。每个应用程序都有一个DocumentsCachetemp文件夹。我认为前两个文件夹在连接设备时自动备份到iTunes,而后者则不会备份。

例如,要获取缓存目录路径 -

- (NSString *)getCacheDirPath
{
    NSString *path = nil;
    NSArray *myPathList = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
    if([myPathList count])
    {
        NSString *bundleName = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleIdentifier"];
        path = [[myPathList objectAtIndex:0] stringByAppendingPathComponent:bundleName];
    }
    return path;
}

要查看目录中的所有文件 -

- (NSMutableArray *)showFiles
{
    NSError *err        = nil;
    NSArray *myPathList = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
    NSString *myPath    = [myPathList  objectAtIndex:0];
    NSArray *dirContent = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:myPath error:&err];
    if(err) NSLog(@"showFiles() - ERROR: %@",[err localizedDescription]);
    NSMutableArray *filePaths  = nil;

    int count = (int)[dirContent count];
    for(int i=0; i<count; i++)
    {
        [filePaths addObject:[dirContent objectAtIndex:i]];
    }
    return filePaths;
}

2
谢谢你的回答!我知道有一个位置在应用程序文件夹中,可以进行读写。但我正在寻找一种不需要编码就能快速查看数据的方法,就像iFile一样。这样我就可以检查我的写入功能是否成功。 - 巫妖王
很难确定你所说的“快速查看数据而无需编码”的意思,但我猜测你是想能够轻松地将对象存储到内存中并从磁盘中检索。为此,我建议在你的对象上使用NSCoding协议。这使得将对象保存/加载到/从磁盘变得非常容易。 - lmirosevic
如何像Android一样获取文件选择器窗口,就像当我们点击“选择文件”时,窗口会出现供用户选择和上传。 - Eshwar Chaitanya
@巫妖王 如何像在Android中一样获取文件选择器窗口,例如当我们单击“选择文件”时,窗口会出现供用户选择和上传。 - Eshwar Chaitanya
请使用return [dirContent mutableCopy]代替那个愚蠢的循环。 - ardnew

3
是的,您可以访问文件系统。但是,您只能限于自己的应用程序沙盒。您无法更改应用程序包中的内容,也无法更改作为应用程序一部分下载的所有内容(出于安全原因,每个应用程序都已签名)。但是,您可以在应用程序的文档文件夹中存储文件。请参考这个讲座,它解释了您需要知道的一切:http://www.stanford.edu/class/cs193p/cgi-bin/drupal/system/files/lectures/09_Data.pdf

我相当确定苹果这里的动机不是安全。 - Erik Reppen

1
当您的iOS设备连接到计算机并正确配置为开发时,您可以使用Xcode 4下载自己项目中的文件,而不仅仅是“文档”目录中的文件。
请参考这个答案:Xcode 4.2中如何下载应用数据

1
如果在您的 plist 中设置 UIFileSharingEnabled 键为 true,则可以使用 Mac 上的 iTunes 查看应用程序沙盒文档目录中的文件系统,而无需进行其他编码。但是,如果您想要查看缓存目录或者查看应用程序沙盒之外的内容,则无法使用此方法。

0

iTools是一个小工具,可以绕过苹果保护iPhone的努力。因此,它可能会侵犯一些苹果政策,但能够完成工作。


0

是的,lms是正确的。苹果已经限制了文件访问权限,只有应用程序本身的(文档目录)。所以没有其他访问方式。我在我的一个项目中遇到了这个问题,然后开始开发完整的文件访问系统。所有操作都像iFile一样支持。你可以通过类似iFile应用程序的可视化界面进行相似的操作。

https://github.com/CianApple/FileSystem

我已经在Github上公开发布了这个项目。请随意使用它,它可能会帮助您解决问题。


0

可以,这里有一个示例,你可以看一下。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接