【问题标题】:How to load image in a directory different than NSBundle?如何在不同于 NSBundle 的目录中加载图像?
【发布时间】:2010-07-15 14:06:24
【问题描述】:

超级难的问题

这是我的项目:

我在一个 iPhone 项目中使用 3000 个 jpeg。正常情况下,3000个文件加载在'NSBundle'(与App封装)中,然后加载到iPhone上。问题是应用程序大约是 500 个月。

所以我想将图像复制到与捆绑包不同的目录(例如“文档”)中,然后从捆绑包中删除所有 jpeg。我的想法是,应用第一次启动后,应用只有 2Mo,下次启动会非常快。


我的第一个想法是:

file in Bundle:Bundle中文件的路径 文件目标:我要放置文件的路径

 if([manager copyItemAtPath:fileInBundle toPath:fileDestination error:&error])
    if([manager removeItemAtPath:fileInBundle error:&error])

当然我试过'moveItemToPath' ^^

如果您在“NSBundle”之外复制,则该副本可以正常工作,但无法删除:

  NSFilePath = "/var/mobile/Applications/4A173D2E-5CFC-4D12-978C-68CF5C0ED352/myLovelyApp.app/Main.jpg";
  NSUnderlyingError = Error Domain=NSPOSIXErrorDomain Code=1 "Operation could not be completed. Operation not permitted";

显然,我通过“[manager fileExistsAtPath:fileInBundle]”检查 main.jpg 是否存在,并通过“[manager isDeletableFileAtPath:fileInBundle]”检查可删除的可能性(不!)

之后,我检查了文件和目录的 POSIX 权限属性:
NSDictionary* whatPermissions=[manager attributesOfItemAtPath:fileInBundle error:&error];
NSLog(@"文件 POSiX 权限:%@",[whatPermissions objectForKey:@"NSFilePosixPermissions"]);

我得到一个 493 --> Chmod 755 -> read-Write-Exe/read-Exe/read-Exe。 所以不可能删除或写入该 NSBundle 中的文件。

我试图通过切换属性 POSIX PERMISSION 来强制: [manager setAttributes:permission ofItemAtPath:fileInBundle error:&error] // 将posix权限设置为511(chmod 777)

但它没有工作。


第二个想法: 所以 Xcode Building Setting 可能是我使用 INSTALL PERMISSION 标志的解决方案:
'u+w,go-w,a+rX'

但我尝试了很多可能性,但没有任何效果(也许我没有找到好的可能性) 我试过:'u+rwx,go+rwx,a+rwx', 'u+rw,go-rw,a+rwX'...

但是什么也没发生 我找到了带有“ALTERNATE_MODE”的“ALTERNATE_PERMISSIONS_FILES”,但似乎我必须在 xcode 参数中一个一个地用我的 3000 jpg 填充列表。当我尝试只使用 10 个文件时。
它没有用。我必须说我从来没有找到任何关于这些主题的教程或博客文章。因此,如果您知道其中之一。请随时分享。

在 XCode 构建系统指南中,没有帮助!!!!


第三个想法:

我试图更改目标:我在目标系统中添加了一个复制文件阶段。然后把所有的图片都放进去,但是好像没有效果,而且文件没有加载到iPhone上。

如何将 3000 个图像文件直接放入目录中,然后将其删除。

这是 iPhone 目录的样子:

"private/var/mobile/Applications/4A173D2E-5CFC-4D12-978C-68CG5C0ED245/myLovelyApp.app/number7_S.png",
"private/var/mobile/Applications/4A173D2E-5CFC-4D12-978C-68CG5C0ED245/myLovelyApp.app/number8_N.png",
"private/var/mobile/Applications/4A173D2E-5CFC-4D12-978C-68CG5C0ED245/myLovelyApp.app/number8_S.png",
"private/var/mobile/Applications/4A173D2E-5CFC-4D12-978C-68CG5C0ED245/myLovelyApp.app/number9_N.png",
"private/var/mobile/Applications/4A173D2E-5CFC-4D12-978C-68CG5C0ED245/myLovelyApp.app/number9_S.png",
"private/var/mobile/Applications/4A173D2E-5CFC-4D12-978C-68CG5C0ED245/Documents",
"private/var/mobile/Applications/4A173D2E-5CFC-4D12-978C-68CG5C0ED245/Library",
"private/var/mobile/Applications/4A173D2E-5CFC-4D12-978C-68CG5C0ED245/Library/Caches",
"private/var/mobile/Applications/4A173D2E-5CFC-4D12-978C-68CG5C0ED245/Library/Preferences",
"private/var/mobile/Applications/4A173D2E-5CFC-4D12-978C-68CG5C0ED245/Library/Preferences/.GlobalPreferences.plist",
"private/var/mobile/Applications/4A173D2E-5CFC-4D12-978C-68CG5C0ED245/Library/Preferences/com.apple.PeoplePicker.plist",
"private/var/mobile/Applications/4A173D2E-5CFC-4D12-978C-68CG5C0ED245/tmp",

我想将文件从 NSBundle 移动到 Documents 目录。

感谢您的帮助

【问题讨论】:

  • 我倾向于认为这是一个最重要的超长问题

标签: iphone xcode permissions compilation target


【解决方案1】:

永远不要在运行时修改您的 NSBundle,因为应用程序是由 Apple 进行代码签名的。如果您编辑捆绑包,您将面临应用崩溃的风险:

这是捆绑目录 包含应用程序本身。 因为必须签署申请, 您不得更改 此目录在运行时的内容。 这样做可能会阻止您的申请 稍后启动。

(Source - '文件系统'下的表 1-1)

此外,更小的捆绑包不会减少加载时间 - 拥有更小的捆绑包的主要原因是可以更快地从应用商店下载。您总是可以做的是将图像托管在某个地方,然后在首次启动时将图像下载到文档目录中。

【讨论】:

  • 有没有办法在 iPhone 上安装 NSBundle 之外的图像?
  • 不打开应用程序从网络下载文件。 App Store 仅在设备上安装捆绑包。
  • 实际上它是一个“仅发布一次”的应用程序。所以我没有任何应用商店验证或流程。我只是注意到,当我在 App 中让 3000 jpg 的引用时。启动需要很长时间。
  • 不管怎样,它必须是代码签名的,所以如果你尝试编辑包它会崩溃。
【解决方案2】:

我的想法是,应用第一次启动后,应用只有 2Mo,下次启动会非常快。

那么构建和部署此应用程序的开发版本需要很长时间的问题是什么?还是您的问题是在最终用户设备上开始生产构建需要很长时间?

最新的 Xcode 在增量复制仅更改的资源方面确实要好得多。更改一张图片应该只生成一个快速副本,当然不是全部 3000 个。

【讨论】:

  • 事实上它是一个“仅发布一次”的应用程序。所以我没有任何应用商店验证或流程。我只是注意到,当我在 App 中让 3000 jpg 的引用时。启动需要很长时间。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-07
  • 2014-06-14
  • 1970-01-01
  • 2018-05-17
  • 2016-08-19
  • 2014-03-18
相关资源
最近更新 更多