【问题标题】:Write a File into the App Bundle将文件写入 App Bundle
【发布时间】:2013-04-15 00:19:30
【问题描述】:

我有一个 Web 服务来下载一些新闻并将它们写入 NSLibraryDirectory 某处的 plist 文件中,这很好。但是,如果用户没有 Internet 连接或 web 服务处于脱机状态或其他情况,我会从 AppBundle 中加载一个 Default-Newsfile。

目前我必须在每次 AppStoreUpdate 之前手动替换默认文件以使其保持最新。

我的问题:有没有一种简单的方法可以在通过模拟器调试的同时写入 App Bundle,这样 Default-File 将每次都是最新的。

我对这样的事情很感兴趣:

#ifdef SIMULATOR
   //Write to AppBundle
#endif

注意: 这都是关于我使用 Mac 和模拟器的时间,我不想在已发布的应用程序中这样做! 是的,我已经在我的 Bundle 中替换了 Ressource,但是是手动替换的,我希望它能够自动实现。 在为任何设备或 AppStore 编译之前,我想保持我的 Projectfolder 是最新的。

【问题讨论】:

  • 问题不清楚。这是您想要的 - 在调试模式下运行时,从 Internet 下载新闻并将其保存到一个文件中,以后可以作为应用程序包的一部分运送
  • 没错,但我不想将任何内容从 Documents 复制到我的项目文件夹中,因此我可以与我的同事共享项目而无需任何解释。以后没有人会忘记更新新闻文件。

标签: iphone ios xcode nsbundle


【解决方案1】:

好的,根据您的评论,这就是您所需要的(我认为 - 仍然不完全清楚这个问题,但如果这对您有用,请告诉我)。

  • 在您的项目文件夹 (SRCROOT) 中创建一个空文件(例如 news.plist)。将此添加到您的存储库中。
  • 将此文件添加到您的项目资源中,并将其添加到Copy Bundle Resources 步骤中Build Phases
  • 当您从 Internet 下载内容时,将其保存到项目的临时文件夹,然后将其复制到 SRCROOT/news.plist 覆盖现有文件(可选地添加检查文件校验和以避免不必要的更改)。仅当在模拟器上运行时才需要执行此步骤。
  • 每当开发人员签入时,更新后的 news.plist 都应签入到 repo。

要使 SRCROOT 在代码中可用,请将 SRCROOT=\"${SRCROOT}\" 添加到 GCC_PREPROCESSOR_DEFINITIONS。

除了最后一步之外,其他开发人员无需执行任何操作 - 每次更改时检查更新的文件。

这有帮助吗?

【讨论】:

  • 在您的第 3 点中:“然后将其复制到 SRCROOT/news.plist”,这就是我正在努力解决的问题。如何自动执行此操作?如何在函数中访问 SRCROOT 或者需要什么其他的魔法来做到这一点?
  • 就是这样,谢谢。这么大的麻烦,答案就这么简单。
【解决方案2】:

AppBundleRead-only,您不能以编程方式向其写入任何内容,但是如果您通过Xcode 更新您的Project 中的资源,您将在AppBundle 中自动获得更新的文件..

【讨论】:

  • 在带有模拟器的 Mac 上,我应该能够在任何我想写的地方写,或者不写?我不说发布的App!
  • 不,你不能在任何设备上写。AppBundle是只读的。它只会失败。顺便说一下,你可以把你的默认文件放在Documents Directory它是读写的,您可以轻松地以编程方式更新该文件夹中的文件..
  • 我从未说过我想在设备上写作。
  • 是的,我认为您可以在 Mac 的 DesktopDocuments 文件夹中写入文件,然后访问它们。但请确保创建一个单独的文件夹来写入数据,这样无论如何它不会损坏您的根文件夹..
  • 这就是我正在做的事情,但我想要的不是Documets,而是像${SRCROOT} 这样的项目文件夹。
【解决方案3】:

不,您也许可以让模拟器向您写入 App Bundle,但这并不意味着您的项目文件(为应用商店构建时编译的文件)将被更新。

为什么不直接将新文件保存到文档目录中,然后始终加载此文件。应用启动后,启动后台线程并尝试更新 plist 文件。你成功地通过在文档目录中写入 plist 文件来检索新闻。 这样,用户将拥有上次设备能够获取文件时检索到的文件。

您可以在应用程序包中添加一个文件,在应用程序首次启动时将其复制到文档目录中,以确保用户在应用程序中有数据。

【讨论】:

  • 是的,这就是我已经在做的。我在应用程序包中有一个“默认”-Plist,我或多或少像你说的那样做,但我更愿意在调试时自动将文件写入或复制到正确的文件夹,所以我不会忘记它.
  • 那么你将不得不使用某种预编译脚本。
猜你喜欢
  • 1970-01-01
  • 2023-03-19
  • 2016-11-21
  • 1970-01-01
  • 2019-09-14
  • 2012-01-02
  • 1970-01-01
  • 1970-01-01
  • 2012-09-12
相关资源
最近更新 更多