我有一个带有静态(用户无法编辑)的coredata文件的iOS 7应用。偶尔这个文件必须更新。比如更新食谱中的食谱或地址簿中的电话号码。
应用程序本身(二进制文件)保持不变。
我从未做过这样的事情。我正在寻找一个起点(指南或谷歌搜索术语)来学习而不是具体的解决方案。
可能我必须向应用发送通知告诉它从某个地方下载数据?我应该在应用程序中对服务器地址进行硬编码,从哪里下载数据?
答案 0 :(得分:2)
我正在使用一个简单的网站。我在网站上有一个带有版本号(或日期)的文本文件。我的代码只是下载文件,用我的数据库中的版本字段检查版本或日期。如果它更新,它会激活下载按钮。
下载按钮下载一个zip文件(不一定是zip),提取它们并用新的onen替换现有的核心数据文件。到目前为止,它一直没有任何问题(自2012年起)。
虽然推荐的方法是逐个删除核心数据库中的所有数据并使用远程源更新数据,但我使用的方法是简单地替换核心数据库的sqlite文件和相关文件。这是代码片段: -
//removing the core data files
NSString *finalPath = [NSHomeDirectory()
stringByAppendingPathComponent:@"Documents/NTTimeTable.sqlite"];
[[NSFileManager defaultManager] removeItemAtPath:finalPath error:nil];
finalPath = [NSHomeDirectory()
stringByAppendingPathComponent:@"Documents/NTTimeTable.momd/NTTimeTable.mom"];
[[NSFileManager defaultManager] removeItemAtPath:finalPath error:nil];
finalPath = [NSHomeDirectory()
stringByAppendingPathComponent:@"Documents/NTTimeTable.momd/NTTimeTable.omo"];
[[NSFileManager defaultManager] removeItemAtPath:finalPath error:nil];
finalPath = [NSHomeDirectory()
stringByAppendingPathComponent:@"Documents/NTTimeTable.momd/VersionInfo.plist"];
[[NSFileManager defaultManager] removeItemAtPath:finalPath error:nil];
// Unzipping downloaded file
finalPath = [NSHomeDirectory()
stringByAppendingPathComponent:@"Documents"];
[SSZipArchive unzipFileAtPath:tempFilePath toDestination:finalPath];
[[NSFileManager defaultManager] removeItemAtPath:tempFilePath error:nil];
如果您需要更多信息,请与我们联系。请注意,我已将核心数据库文件移至Documents目录,因为我们无权在原始位置替换它们。
Q / A
如上所示,我只是使用网络服务器并在我的网站上留下更新文件。
我认为拥有自己的网络服务器会更好。你可以在互联网上找到一个便宜的。你可以使用免费的,但你必须考虑速度,带宽,可用性等。
您可以使用校验和来验证文件是否完整。为了确保文件正确,您可以进行检查,例如读取文件大小,内容等。在我的情况下,我没有做任何事情,因为我已经硬编码文件网址。这取决于您的数据的敏感程度。我非常喜欢公共事物。
为了确保只有您的应用程序请求数据,您可以使用一些简单的身份验证。也许让应用程序使用用户名和/或密码/哈希发布帖子请求,并让Web服务器检查它们。我会在服务器中使用一个小的PHP文件,因为大多数廉价的虚拟主机提供商支持PHP。我会在web服务器的php文件中硬编码用户名和密码/ hash。如果您真的很认真,可能需要查看非对称加密等身份验证机制。
这是一个难点。即使您在应用程序中对下载URL进行了硬编码,人们仍然可以通过更改DNS或执行各种操作来制作虚假的Web服务器来发送文件/数据。在一天结束时,你只会让事情变得更难闯入,而不是100%安全。