自己更新型の iPhone アプリケーションを使用することは可能ですか?
答えはノーだと思いますが、よくわかりません。
事実上製品のカタログであるデータベース駆動型アプリがあります。カタログをすばやく使用できるように、データベースをユーザーの iPhone に配置したいと考えています。ただし、データベースの内容は定期的に変更されます。
データベースの更新の準備ができていることをユーザーに知らせるプッシュ通知を作成することもできますが、アプリ自体が更新された方がよいでしょう。
app-bundle 内で何も変更する必要がない限り、これは可能です。コンテンツをドキュメント ディレクトリに保存するだけです。
もちろん、自分のデータベースを更新することもできます。
fluchtpunkt が答えたように、iOS アプリは新しいデータをダウンロードできますが、新しいコードをダウンロードすることはできません。多くの Twitter クライアントなど、多くの iOS アプリは、主にデータをダウンロードして表示します。
アプリが問題を起こすのは、アプリがデータをダウンロードしていることをインターフェイスが明確に示さない場合です。アプリは、ユーザーの知らないうちに iPhone のデータ プランの割り当てを使い果たすべきではありません。ユーザーへの通知は、ダウンロードをキャンセルするオプションを含む明示的な通知から、アプリのコンセプトをすべてデータのダウンロード (Twitter クライアントなど) にすることまで、さまざまです。
アプリがサーバーと情報を共有している場合は、ユーザーにも通知する必要があります。アプリは、特定のデータを選択的にダウンロードするために、そのようなデータを送信する必要がある場合があります。たとえば、アプリは位置情報を使用してデータベースを調整し、デバイスが存在する地域で利用可能なアイテムのみをダウンロードできます。データがアカウント固有のものである場合は、ログイン プロセスで十分な通知になる場合があります。
リソース バンドルを動的にロードできることは注目に値しますが、実行可能ファイルを iPhone にロードすることはできません。ビューの作成に IB を使用する場合は、まったく新しいビューを作成し、それをクラウドに配置してアプリからロードできます。唯一の注意点は、デザインの更新のみが可能で、機能を拡張できないことです。
XIB を動的にロードするには、次のinitWithNibName
メソッドを使用します。
- (id)initWithNibName:(NSString *)nibName bundle:(NSBundle *)nibBundle
動的にロードされたバンドルを渡します。
Mac では、動的にロードできる実行可能コードを含むバンドルを作成できますが、iPhone では作成できません。Mac 用に名前が付けられた Plist 構成がありますがNSPrincipalClass
、残念ながら iPhone 用はまだありません。
私のアプリは 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;
}
ただし、データベース全体のダウンロードは、データベースがそれほど大きくない場合にのみ有効なソリューションです。さらに、データベースを 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 にこれを示す必要があります。もう 1 つの質問に答えるだけで、暗号化は認証のみに使用すると答えました。アプリは問題なく承認されました。
指定された時間ごとに新しいデータをダウンロードするタイマーを設定できることとは別に、プッシュ通知でそれを行うことができますが、問題はアプリを常に開いておく必要があることです.ios 4では、ユーザーに通知を送信できるローカル通知がありますアプリを閉じたとき