【问题标题】:Transfer file to physical iOS device将文件传输到物理 iOS 设备
【发布时间】:2015-12-03 13:44:54
【问题描述】:

我已设置配置文件以在连接的物理设备上调试我的应用程序(通过 Xcode)。

问题是这个应用程序需要某些支持文件。使用 Mac 上的模拟器,我只需导航到模拟器目录下的应用程序的 Documents 目录并将文件放在那里。

有没有办法将这些相同的文件放到物理设备上?

【问题讨论】:

  • 你不能让它们成为目标资源的一部分吗?然后,您可以在运行时使用 [[NSBundle mainBundle] pathForResource:ofType:] 加载它们。
  • 对于某些事情我可以,但对于不属于程序本身的文件更是如此,因此不应该是捆绑包的一部分。想想 iTunes 和下载的歌曲。
  • 嗯,我记得您可以使用 iTunes 从Documents 文件夹中提取文件(如果您的应用设置允许的话),但不确定您是否可以放入.
  • 如果在现实生活中,它们将是您的应用从远程服务器下载的文件,也许您应该首先实现该功能(即虚拟服务器)。

标签: ios xcode ipad


【解决方案1】:

将文件放置在您的项目文件结构中。 因此它们会被复制到您的 App Bundle 中,并可通过文档目录访问。

要将文件正确添加到您的 iOS 项目:

  1. 右键单击左侧文件列表顶部的项目图标。
  2. 选择Add files to <YourProjectName>
  3. 选择要包含的文件夹/文件,然后单击添加。
    • 不要忘记从给定列表中选择正确的target。请参考截图。
  4. 如果您的资源不是单个文件而是目录结构,并且您希望复制所有目录树,请记住选择添加的文件夹:创建组

在 XCode 6.x 中添加弹出窗口的文件如下所示:

构建目标后,打开捆绑包,您的目录结构将完整地存在于其中。不仅如此,这些文件还可以通过 iOS SDK 访问,如下所示。

因此,您可能需要将它们复制到应用内的文档/库目录,因为您可能希望在应用内访问它们。

使用以下代码复制它们。

// Check if the file has already been saved to the users phone, if not then copy it over
BOOL success;
NSString *fileName = @"test.jpg";
NSString *LIBRARY_DIR_PATH = [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) objectAtIndex:0];

NSString *filePath = [LIBRARY_DIR_PATH stringByAppendingPathComponent:fileName];
NSLog(@"%@",filePath);

// Create a FileManager object, we will use this to check the status
// of the file and to copy it over if required
NSFileManager *fileManager = [NSFileManager defaultManager];

// Check if the file has already been created in the users filesystem
success = [fileManager fileExistsAtPath:filePath];

// If the file already exists then return without doing anything
if(success) return;

// Else,
NSLog(@"FILE WASN'T THERE! SO GONNA COPY IT!");

// then proceed to copy the file from the application to the users filesystem
// Get the path to the files in the application package
NSString *filePathFromApp = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:fileName];

// Copy the file from the package to the users filesystem
[fileManager copyItemAtPath:filePathFromApp toPath:filePath error:nil];

希望上面的代码示例对你来说是清楚的。

因此,无论何时您想在您的应用程序中访问该文件,您都可以通过获取该文件的路径来获得对该文件的引用,如下所示:

    NSString *sqliteDB = [LIBRARY_DIR_PATH stringByAppendingPathComponent:fileName];

注意:在任何情况下,如果您需要将文件复制到用户应用安装位置内的Documents 目录,请将LIBRARY_DIR_PATH 替换为以下内容:

NSString *DOCUMENTS_DIR_PATH = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];

希望这个回答对你有帮助!

干杯!

【讨论】:

  • 这是一个很好的解决方案。一个小细节:我认为他希望它进入Documents,而不是Library
  • 是的,没错。实际上,这可能必须与苹果指南保持一致,对吗?否则以后会出问题的。
  • 太棒了!我会试试这个,看看效果如何。似乎它可以满足我的需求。
  • @KasunRandika 是的;必须小心您在 Documents 中存储的内容,除非您将其标记为“无备份”。
  • @Kasun 工作就像一个魅力!不得不进行一些小的改动以适应我预期的工作流程,但是是的,这个想法是完美的。应该有一本书叫做“黑客的苹果政策指南”,这绝对应该在里面:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多