是否有可能擁有自我更新的iPhone應用程序?是否有可能擁有自我更新的iPhone應用程序?
我相信答案是否定的,但我不確定。
我有一個數據庫驅動的應用程序,實際上是一個產品目錄。我希望數據庫位於用戶iPhone上,因此目錄可以快速使用。但是,數據庫中的內容會定期更改。
我可以創建一個推送通知來告訴用戶有一個數據庫更新就緒,但如果應用程序自我更新會更好。
是否有可能擁有自我更新的iPhone應用程序?是否有可能擁有自我更新的iPhone應用程序?
我相信答案是否定的,但我不確定。
我有一個數據庫驅動的應用程序,實際上是一個產品目錄。我希望數據庫位於用戶iPhone上,因此目錄可以快速使用。但是,數據庫中的內容會定期更改。
我可以創建一個推送通知來告訴用戶有一個數據庫更新就緒,但如果應用程序自我更新會更好。
正如fluchtpunkt回答,iOS應用程序可以下載新的數據,它只是不能下載新的代碼。許多iOS應用程序(例如衆多的Twitter客戶端)主要下載並顯示數據。
應用程序會遇到麻煩的地方在於它的界面沒有說明應用程序正在下載數據。如果用戶不知道,應用程序不應使用iPhone的數據計劃分配。讓用戶知道的範圍可以從顯式通知(包括取消下載的選項)到使應用程序的概念全部關於下載數據(例如Twitter客戶端)。
如果應用程序與服務器共享任何信息,還必須通知用戶。該應用可能希望發送這樣的數據以選擇性地下載特定數據。例如,應用程序可以使用位置信息來定製數據庫,只下載該設備恰好在該區域中可用的項目。如果數據是賬戶特定的,則登錄過程可能是充分的通知。
只要你不需要改變應用程序包內的任何東西,這是可能的。只需將您的內容保存到文檔目錄。
當然,您可以更新自己的數據庫。
你可以通過推送通知來做到這一點除了你可以設置定時器,它會在每個指定的時間下載新的數據,但問題是應用程序必須一直打開。在ios 4中有本地通知可以發送即使應用程序關閉,也會通知用戶
我的應用程序使用SQLite數據庫並進行更新。隨着每次開始(或從暫停模式喚醒),它會連接到我的Web服務器並檢查新的數據庫。爲了驗證數據庫,它首先下載一個包含在線數據庫MD5總和的文件,並計算手機上數據庫的MD5總和。只有和數不同時,新的數據庫纔會被下載。這具有很好的副作用,它可以保持低流量。
爲calculatimg 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;
}
然而,在下載整個數據庫僅僅是一個很好的解決方案,如果數據庫不是很大。另外,我在下載後將gzip數據庫提取出來。
#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表明這一點。我只需要回答一個問題,並說我只使用加密進行身份驗證。該應用程序被批准沒有任何問題。
不可能在iPhone上加載可執行文件,但值得注意的是可以動態加載資源包。如果您使用IB來創建視圖,那麼您可以創建一個全新的視圖,將其放置在雲上並從應用中加載它。唯一需要注意的是,你只能更新設計,而不能擴展功能。
動態地加載一個XIB,使用initWithNibName
方法,
- (id)initWithNibName:(NSString *)nibName bundle:(NSBundle *)nibBundle
,並通過在動態加載的束。
在Mac上,可能有捆綁包包含可動態加載的可執行代碼,但不能在iPhone上運行。 Mac上有一個名爲NSPrincipalClass
的Plist配置,但不幸的是,它並不適用於iPhone。