如何在不同于NSBundle的目录中加载图像?

时间:2010-07-15 14:06:24

标签: iphone xcode permissions compilation target

超级难题

这是我的项目:

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

所以我想将图像复制到不同的目录(例如'Documents')而不是捆绑包然后从捆绑中删除所有jpeg。我的想法是,在第一次推出该应用程序后,该应用程序将只有2Mo,下一次发布将非常快。


我的第一个想法是:

Bundle中的

文件:Bundle中文件的路径 file目的地:我想放置文件的路径

 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";

显然,我检查main.jpg是否存在'[manager fileExistsAtPath:fileInBundle]'并且我通过以下方式检查删除的可能性:'[manager isDeletableFileAtPath:fileInBundle]'(NO!)

之后,我检查文件和目录的POSIX Permission属性:
    NSDictionary * whatPermissions = [manager attributesOfItemAtPath:fileInBundle error:& error];

    NSLog(@“文件POSiX权限:%@”,[whatPermissions objectForKey:@“NSFilePosixPermissions”]);

我得到493 - > Chmod 755 - >读 - 写 - 埃克/读取的Exe /读EXE。 因此无法在NSBundle中删除或写入文件。

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

但它没有用。


第二个想法: 因此,Xcode Building Setting可能是我的解决方案,带有INSTALL PERMISSION标志:
'U + W,去-W,A + RX'

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

但什么都没发生 我找到'ALTERNATE_PERMISSIONS_FILES'和'ALTERNATE_MODE',但似乎我必须在xcode参数中逐一填充我的3000 jpg列表。当我尝试只有10个文件时 它没用。我必须说,我从未找到任何有关该主题的教程或博客文章。所以,如果你知道其中之一。请随意分享。

在XCode Build System指南中,没有帮助!!!!


第三个想法:

我尝试更改目标目标:我在目标系统中添加了“复制文件”阶段。然后将所有图像放在里面,但似乎它没有效果,并且文件没有加载到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目录。

感谢您的帮助

2 个答案:

答案 0 :(得分:0)

您的NSBundle绝不应在运行时进行修改,因为Apple会对应用程序进行代码签名。如果您编辑捆绑包,则可能会导致应用崩溃:

  

这是捆绑目录   包含应用程序本身。   因为申请必须签名,   你不能改变   运行时此目录的内容。   这样做可能会妨碍您的申请   从稍后发布。

Source - “文件系统”下的表1-1)

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

答案 1 :(得分:0)

  

我的想法是,在第一次推出应用程序后,该应用程序将只有2Mo,下一次启动将非常快。

问题是构建和部署此应用程序的开发版本需要很长时间吗?或者您的问题是生产构建需要很长时间才能在最终用户设备上启动吗?

通过逐步复制仅更改的资源,最新的Xcode实际上要好得多。更改一个图像应该只产生一个快速复制,当然不是所有3000个。