有可能有一个自我更新的iPhone应用程序吗?

有可能有一个自我更新的iPhone应用程序吗?,iphone,updates,Iphone,Updates,有可能有一个自我更新的iPhone应用程序吗 我相信答案是否定的,但我不确定 我有一个数据库驱动的应用程序,实际上是一个产品目录。我希望数据库位于用户iPhone上,以便目录能够快速使用。但是,数据库中的内容会定期更改 我可以创建一个推送通知,告诉用户有一个数据库更新准备就绪,但是如果应用程序自己更新就更好了。只要你不需要更改应用程序包中的任何内容,这是可能的。只需将内容保存到Documents目录 当然,您可以更新自己的数据库 只要您不需要更改应用程序包中的任何内容,这是可能的。只需将内容保存

有可能有一个自我更新的iPhone应用程序吗

我相信答案是否定的,但我不确定

我有一个数据库驱动的应用程序,实际上是一个产品目录。我希望数据库位于用户iPhone上,以便目录能够快速使用。但是,数据库中的内容会定期更改


我可以创建一个推送通知,告诉用户有一个数据库更新准备就绪,但是如果应用程序自己更新就更好了。

只要你不需要更改应用程序包中的任何内容,这是可能的。只需将内容保存到Documents目录


当然,您可以更新自己的数据库

只要您不需要更改应用程序包中的任何内容,这是可能的。只需将内容保存到Documents目录


当然,您可以更新自己的数据库

正如fluchtpunkt回答的那样,iOS应用程序可以下载新数据,但不能下载新代码。许多iOS应用程序,如众多的Twitter客户端,主要是下载和显示数据

如果一个应用程序的界面没有明确说明该应用程序正在下载数据,那么它就会陷入麻烦。应用程序不应该在用户不知道的情况下用完iPhone的数据计划分配。让用户知道可以从明确的通知(包括取消下载的选项)到让应用程序的概念完全与下载数据有关(例如Twitter客户端)


如果应用程序正在与服务器共享任何信息,还必须通知用户。应用程序可能希望发送此类数据以有选择地下载特定数据。例如,应用程序可以使用位置信息定制数据库,只下载设备所在地区的可用项目。如果数据是特定于帐户的,登录过程可能就足够了。

正如fluchtpunkt回答的那样,iOS应用程序可以下载新数据,但不能下载新代码。许多iOS应用程序,如众多的Twitter客户端,主要是下载和显示数据

如果一个应用程序的界面没有明确说明该应用程序正在下载数据,那么它就会陷入麻烦。应用程序不应该在用户不知道的情况下用完iPhone的数据计划分配。让用户知道可以从明确的通知(包括取消下载的选项)到让应用程序的概念完全与下载数据有关(例如Twitter客户端)


如果应用程序正在与服务器共享任何信息,还必须通知用户。应用程序可能希望发送此类数据以有选择地下载特定数据。例如,应用程序可以使用位置信息定制数据库,只下载设备所在地区的可用项目。登录过程可能是足够的通知,如果数据是特定于帐户的。

您可以使用推送通知来完成此操作,但您可以设置计时器,该计时器将在每个指定时间下载新数据,但问题是应用程序必须始终打开。在ios 4中,有本地通知,即使在应用程序关闭时也可以向用户发送通知。

您可以使用推送来完成此操作除了通知之外,你还可以设置计时器,该计时器将在每个指定时间下载新数据,但问题是应用程序必须始终打开。在ios 4中,有一个本地通知,它可以向用户发送通知,即使在应用程序关闭时。

我的应用程序使用SQLite数据库并对其进行更新。每次启动(或从挂起模式唤醒)时,它都会连接到我的web服务器并检查新数据库。为了验证数据库,它首先只下载一个包含在线数据库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;  
}
#定义块大小16384
#进口
+(NSString*)md5SumForFileAtPath:(NSString*)路径{
NSFileHandle*handle=[NSFileHandle fileHandleForReadingAtPath:path];
CC_MD5_CTX MD5;
CC_MD5_Init(&MD5);
BOOL done=否;
而(!完成)
{
NSData*fileData=[handle readDataOfLength:CHUNK_SIZE];
CC_MD5_Update(&MD5,[fileData字节],[fileData长度]);
如果([fileData length]==0)完成=是;
}
无符号字符结果[CC_MD5_DIGEST_LENGTH];
CC_MD5_最终结果(结果和MD5);
NSString*摘要=[NSString stringWithFormat:@“%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X”,
结果[0]、结果[1]、结果[2]、结果[3]、结果[4],
结果[5],结果[6],结果[7],结果[8],结果[9],
结果[10],结果[11],结果[12],结果[13],
结果[14],结果[15]
];
XLog(“文件%@:%@的校验和”,路径,摘要);
返回摘要;
}
但是,如果数据库不太大,下载整个数据库只是一个好的解决方案。此外,我压缩了数据库,并在下载后将其解压缩

#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);
}
#导入
+(void)gunzipFileAtPath:(NSString*)压缩路径toPath:(NSString*)解压缩路径{
gzFile file=gzopen([zippedPath UTF8String],“rb”);
FILE*dest=fopen([unzippedPath UTF8String],“w”);
无符号字符缓冲区[块大小];
整数解压长度;
while(uncompressedLength=gzread(文件、缓冲区、块大小)){
if(fwrite(缓冲区,1,解压缩长度,dest)!=解压缩长度| | feror(dest)){
NSLog(@“错误写入数据”);
}
}
fclose(dest);
gzclose(文件);
}
只在状态栏中显示网络活动指示器,而不使用进度栏或其他指示器是完全正确的。如果手机的数据库是最新的,我甚至不会通知用户,因为这是不必要的信息,只会分散他的注意力。但是,如果有更新,我会淡入
- (id)initWithNibName:(NSString *)nibName bundle:(NSBundle *)nibBundle