gpt4 book ai didi

iphone - 我可以从服务器下载更新文件并替换支持文件夹中的文件吗?

转载 作者:行者123 更新时间:2023-11-28 20:37:18 24 4
gpt4 key购买 nike

我正在做 iPhone 应用开发。通常,我将图像(照片)文件和一些其他配置文件放在支持文件夹中。

  1. 我可以从服务器更新支持文件夹中的那些文件吗?如果可以,怎么做?

  2. 如果没有,是否可以将需要上传的文件预先存储到文件夹中,然后在文件夹中下载更新的文件来替换旧文件?

最佳答案

我们在当前的应用程序中遇到了同样的问题。我们的 final方法是:

1) 我们要与应用程序一起交付的 Assets 存储在 Resources 下的文件夹中。 screenshot xcode

2) 另外还有一个 XML 文件告诉我们哪个 Assets 属于哪里以及它有多旧(时间戳)。 xml snippet

3) 当应用程序第一次启动时,我们将所有文件(除了 xml)从 Rescources 复制到应用程序的 Cache 文件夹:

// get the app's cache folder

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
_cachesDirectory = [paths objectAtIndex:0];
_assetDirectory = [NSString stringWithFormat:@"%@/assets", _cachesDirectory];

// copy everything

_fmngr = [NSFileManager defaultManager];

- (void) copyAllFilesFromInitialFolder:(NSString*)path
{
NSArray *files = [_fmngr contentsOfDirectoryAtPath:path error:nil];
for (NSString *file in files)
{
if ([file isEqualToString:[NSString stringWithFormat:@"%@.xml", kDefaultXMLFileName]])
{
continue;
}

NSString *fpath = [NSString stringWithFormat:@"%@/%@", path, file];
BOOL isDir;
if ([_fmngr fileExistsAtPath:fpath isDirectory:&isDir])
{
if (isDir)
{
[self copyAllFilesFromInitialFolder:fpath];
}
else
{
NSString *relPath = [fpath substringFromIndex:[_initialLangDeviceContentPath length]+1];
NSString *fileName = [self convertFilePathToName:relPath];
NSString *tpath = [NSString stringWithFormat:@"%@/%@", _assetDirectory, fileName];

NSError *error;
BOOL success = [_fmngr copyItemAtPath:fpath toPath:tpath error:&error];
if (!success || error)
{
NSLog(@"INFO: copy %@ to CACHES failed ... file may already be there.", file);
}
}
}
}
}

4) 在下次启动应用程序时,我们在线检查更新服务器上是否有更新的文件。来自步骤 2) 的 XML 也驻留在服务器上,当 JPG/PNG/... 在服务器上更新/替换时必须更新。
如果没有任何变化,我们的 PHP 脚本将返回 304“未修改”——否则它将输出 XML 的更新版本。

PHP 脚本看起来像这样:

$doc = new DOMDocument();
@$doc->load($filename);
$xpath = new DOMXPath($doc);

$assets = $xpath->query('//asset');
if ($assets->length > 0)
{
foreach ($assets as $asset)
{
$assetPath = $asset->getAttribute('path');
if (file_exists($assetPath))
{
$atime = filemtime($assetPath);
$asset->setAttribute('modified', $atime);
}
else
{
// file not found - link broken
$asset->setAttribute('modified', '0');
}
}
}

$output = $doc->saveXML();
header('Content-type: text/xml');
echo $output;

应用下载并解析生成的 XML,比较所有修改值。
当 Assets 具有更新的修改时间戳时,它会在本地删除并重新下载。只有在完成此检查后,应用程序才会启动 - 您会在设备上获得新 Assets 。

希望这对您有所帮助。我们在与应用程序一起交付的文件的 last modified 属性方面遇到了一些问题。当将文件包含到应用程序包中并在运行时复制它们时,文件 last modified 始终是应用程序首次启动的时间。有时你已经更新了服务器上的一些文件——但是因为应用程序认为设备上的文件更新(因为它们是刚刚复制的)所以它们没有从服务器重新下载:(
因此您不能使用真实文件的属性,而必须在 XML 文件中包含实际的文件日期。

关于iphone - 我可以从服务器下载更新文件并替换支持文件夹中的文件吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9953542/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com