Мое приложение использует базу данных SQLite и обновляет ее.При каждом запуске (или выходе из режима ожидания) он подключается к моему веб-серверу и проверяет наличие новой базы данных.Для аутентификации базы данных сначала загружается только файл, содержащий сумму MD5 онлайн-базы данных, и вычисляется сумма MD5 базы данных на телефоне.Только если суммы различаются, новая база данных будет загружена.У этого есть хороший побочный эффект, который поддерживает низкий трафик.
Пример кода для расчета суммы MD5:
#define CHUNK_SIZE 16384
#import <CommonCrypto/CommonDigest.h>
+ (NSString *)md5SumForFileAtPath:(NSString *)path {
NSFileHandle *handle = [NSFileHandle fileHandleForReadingAtPath:path];
CC_MD5_CTX md5;
CC_MD5_Init(&md5);
BOOL done = NO;
while(!done)
{
NSData* fileData = [handle readDataOfLength:CHUNK_SIZE];
CC_MD5_Update(&md5, [fileData bytes], [fileData length]);
if ([fileData length] == 0) done = YES;
}
unsigned char result[CC_MD5_DIGEST_LENGTH];
CC_MD5_Final(result, &md5);
NSString *digest = [NSString stringWithFormat:@"%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X",
result[0], result[1], result[2], result[3],result[4],
result[5], result[6], result[7], result[8], result[9],
result[10], result[11], result[12], result[13],
result[14], result[15]
];
XLog("Checksum for file %@: %@", path, digest);
return digest;
}
Однако загрузка всей базы данных - это только хорошее решение, если база данных не слишком велика.Кроме того, я распаковал базу данных и распаковал ее после загрузки.
#import <zlib.h>
+ (void)gunzipFileAtPath:(NSString *)zippedPath toPath:(NSString *)unzippedPath {
gzFile file = gzopen([zippedPath UTF8String], "rb");
FILE *dest = fopen([unzippedPath UTF8String], "w");
unsigned char buffer[CHUNK_SIZE];
int uncompressedLength;
while (uncompressedLength = gzread(file, buffer, CHUNK_SIZE) ) {
if(fwrite(buffer, 1, uncompressedLength, dest) != uncompressedLength || ferror(dest)) {
NSLog(@"error writing data");
}
}
fclose(dest);
gzclose(file);
}
Прекрасно показывать только индикатор сетевой активности в строке состояния и не использовать индикатор выполнения или другой индикатор.Если база данных телефона обновлена, я даже не уведомляю пользователя, так как это ненужная информация и будет только отвлекать его.Однако, если есть обновление, я исчезаю в наложении строки состояния и отображаю информацию в течение нескольких секунд.Из отзывов моих пользователей я могу сказать, что они очень ценят это решение.
Не забывайте, что вы добавляете криптографию, вычисляя сумму MD5.Вы должны указать это Apple при загрузке вашего следующего обновления.Мне оставалось ответить только на один вопрос и сказать, что я использую шифрование только для аутентификации.Приложение было одобрено без проблем.