【问题标题】:Download .plist from server and save it locally in iPhone application从服务器下载 .plist 并将其保存在本地 iPhone 应用程序中
【发布时间】:2012-06-03 03:57:46
【问题描述】:

我想将应用内购买集成到我的应用程序中,因此我想在用户购买新关卡集时下载 .plist 文件。如何从服务器下载文件并保存它,以便它永远留在我的 iPhone 应用程序中?

编辑

我想实现这样的目标:

  • 由于这些 plist 并不多(从不超过 20 个),我可以将它们包含到应用程序中并使用 isPurchased 左右设置一个布尔值,对吧? 如果用户购买了该类别,则布尔值设置为YES。 每当我添加新类别时,我都会进行全新的更新,例如“割绳子”。这是一个好方法吗?

【问题讨论】:

  • 查看 NSURLConnection 类以了解如何加载 URL 请求以下载数据,然后 NSFileManager 将下载的数据保存到磁盘(应用程序的 Documents 目录)。

标签: iphone objective-c save plist


【解决方案1】:

第一:为什么不使用Apple's 服务进行应用内购买?为什么要使用您自己的实现?我不确定,但是……你认为你会得到苹果的批准吗?据我记得,亚马逊过去做过类似的事情,但他们没有明白这一点。

第二:我不会为此目的使用 NSData。如果您有一个有效的属性列表,那么它是使用的最佳解决方案

NSDictionary *dict = [NSDictionary dictionaryWithContentsOfURL:[NSURL URLWithString:@"foobar.com/plistfile.plist"]];

然后您可以存储此字典。老实说,我不建议使用您的解决方案。如果我对您的理解正确,一段时间后您将拥有数千个 plist。我的建议:例如,使用“全局”可变字典作为 App Delegate 的 ivar。这在开始时应该是空的。然后如上所述下载您的帮助字典并使用

填充您的全局字典
[[delegateInstance globalDictionary] addEntriesFromDictionary:dict];

每次获得新数据时。

用

保存
[[delegateInstance globalDictionary] writeToFile:@"path" atomically:YES];

并在您的应用每次启动时恢复它。

编辑:

你当然可以那样做。如果这些 plist 真的存储信息,那很好。例如,您可以将帐单信息存储在那里,这样它们就不能与其他用户互换(或者至少不应该互换)。但是:如果您只想获取有关用户购买特定级别的问题的信息,或者不考虑将您的信息合并到一个 plist 中(如上所述)。无论如何:考虑让您的用户取回他们的数据的可能性。想想有人不小心删除了你的应用程序。你想如何向他解释他所有的购买都丢失了?应用内购买更安全。

或者至少:在您的服务器上存储一份收据副本,让用户登录以收集他们过去支付的费用;-)

玩得开心,祝你好运! :-)

【讨论】:

  • 顺便说一句:要解决已经提到的问题(请求可能会阻塞),您应该使用异步加载。如果你不知道怎么做,有一个很棒的包装器叫做 ASIHttpRequest。
【解决方案2】:

又快又脏的单线:

[[NSData dataWithContentsOfURL:@"http://<yourfile>.plist"] writeToFile:@"pathforthefile.plist" atomically:YES];

【讨论】:

  • 很脏; dataWithContentsOfURL: 块,这意味着网络问题可能导致应用程序冻结。它不适合本地 URL 以外的任何内容。
  • 所以你想从网上重复下载同一个文件,但每次都在本地给它一个新的唯一名称?
  • 如果锁定应用程序是您唯一担心的事情,请在后台线程上调度它。或者在后台执行选择器,只是说。
  • 您只是想保留服务器上存在的 plist 文件的名称吗?
  • 您可以简单地将其包装在 GCD 调度块中以避免冻结主线程。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-14
  • 2016-08-06
相关资源
最近更新 更多