Iphone 在我的服务器上检查plist的新版本

Iphone 在我的服务器上检查plist的新版本,iphone,ios,objective-c,Iphone,Ios,Objective C,我已经尝试了几种方法来确定是否只在服务器的UITableView数据源更新时才需要更新用户的UITableView数据源。在过去的几年里,我做过这样的场景:1:使用一个单独的.txt文件,以一个字符作为版本#然后通过代码比较它们并下载新的.plist,然后将该.txt文件与.plist一起保存到用户的NSDocumentDirectory中,以便将来再次比较,和2:实际检查服务器的文件修改日期,这更有效,因为没有.txt文件与.plist一起下载(下载的内容越少越好) 但是,现在我想尝试另一种方

我已经尝试了几种方法来确定是否只在服务器的UITableView数据源更新时才需要更新用户的UITableView数据源。在过去的几年里,我做过这样的场景:1:使用一个单独的.txt文件,以一个字符作为版本#然后通过代码比较它们并下载新的.plist,然后将该.txt文件与.plist一起保存到用户的NSDocumentDirectory中,以便将来再次比较,和2:实际检查服务器的文件修改日期,这更有效,因为没有.txt文件与.plist一起下载(下载的内容越少越好)

但是,现在我想尝试另一种方式来解释我在应用程序包中提供了一个.plist文件这一事实。由于新用户的.plist文件创建日期总是晚于服务器日期,因此他们不会获得新的.plist文件,而应用程序的老用户会获得新文件。当然,在第一次应用发布时,我可以获取服务器的修改日期并覆盖应用,因为我将其从主捆绑包复制到NSDocumentDirectory,但我不想走这条路,因为我从来都不喜欢检查发布计数

基本上,它需要在网络请求时间上继续保持轻量级,并且像我一样可靠。我曾考虑在我的.plist中创建一个版本#键,并简单地将其与本地的.plist进行比较,但我非常怀疑这是否会如此轻量级,因为我必须先将整个.plist下载到NSDictionary中,然后才能比较键值


我真的很抱歉这个帖子太长了,我感谢你的帮助

为什么不在发布应用程序时附带
数据源.plist
文件,并在首次发布时下载,或者在磁盘上不存在应用程序时下载(您永远不知道)。之后,您可以发送HEAD请求并检查修改日期(甚至可能是电子标签),并根据需要下载

更新

根据您对服务器的控制程度,您可以将文件的散列添加到响应头(如注释中所述:MD5,SHA*)以及上次修改的部分

您可以在构建时将
data\u source.plist
last\u modified.plist
一起添加到捆绑包中,您可以在其中设置哈希、last modified和任何其他元数据作为起点

检查更新可能类似于:

  • 发送
    http://server.com/data_source.plist
  • 从响应头中拉取上次修改的
    (和
    散列
    ,如果可以发送)
  • 根据
    last_modified.plist
  • 如果需要,下载更新的
    数据\u source.plist
  • 如果下载成功,请使用新元数据更新
    last_modified.plist
    (last modified and has,请确保从实际下载响应头中提取该元数据)
  • 这样,用户就有了开始,应用程序可以在需要时下载资源


    请求的优点是重量轻,因为没有消息体,但返回与GET请求相同的响应头。这是检查资源是否已更新的常用方法。您的方案的诀窍是在构建时在设备上获得一个起点。

    对于下载应用程序但打开应用程序且没有internet连接的用户来说,没有.plist下载是个坏消息,这意味着没有.plist可下载。请考虑我最初的问题。@ TROOP211也许我早该问,文件有多大?几个条目还是几千条?嘿,迈克,大约90 KB,这看起来不错,但是当你进入像Verizon 3G这样的高潜在网络时,这并不是最好的体验。谢谢迈克,我最后做的是从allHeaderFields的响应中得到ETag,然后用一个本地字符串作为.plist中的键来检查它。非常轻!使用散列-md5或sha1/2/256@Kevin请详细说明,或者你能提供一个SO链接吗?另外,如果它与
    NSData DATA with CONTENTS OFURL
    有关或使用,这是一个不可能的坏消息。计算一个散列,例如服务器和客户端上的plist的散列。让客户端获取服务器的当前哈希值,将其与自己的哈希值进行比较,如果两者不同,则下载文件。计算哈希值是否需要将整个服务器的plist下载到内存中?如果是的话,那不是我想要的方法。