1

自己更新型の iPhone アプリケーションを使用することは可能ですか?

答えはノーだと思いますが、よくわかりません。

事実上製品のカタログであるデータベース駆動型アプリがあります。カタログをすばやく使用できるように、データベースをユーザーの iPhone に配置したいと考えています。ただし、データベースの内容は定期的に変更されます。

データベースの更新の準備ができていることをユーザーに知らせるプッシュ通知を作成することもできますが、アプリ自体が更新された方がよいでしょう。

4

5 に答える 5

2

app-bundle 内で何も変更する必要がない限り、これは可能です。コンテンツをドキュメント ディレクトリに保存するだけです。

もちろん、自分のデータベースを更新することもできます。

于 2010-10-20T11:33:38.773 に答える
2

fluchtpunkt が答えたように、iOS アプリは新しいデータをダウンロードできますが、新しいコードをダウンロードすることはできません。多くの Twitter クライアントなど、多くの iOS アプリは、主にデータをダウンロードして表示します。

アプリが問題を起こすのは、アプリがデータをダウンロードしていることをインターフェイスが明確に示さない場合です。アプリは、ユーザーの知らないうちに iPhone のデータ プランの割り当てを使い果たすべきではありません。ユーザーへの通知は、ダウンロードをキャンセルするオプションを含む明示的な通知から、アプリのコンセプトをすべてデータのダウンロード (Twitter クライアントなど) にすることまで、さまざまです。

アプリがサーバーと情報を共有している場合は、ユーザーにも通知する必要があります。アプリは、特定のデータを選択的にダウンロードするために、そのようなデータを送信する必要がある場合があります。たとえば、アプリは位置情報を使用してデータベースを調整し、デバイスが存在する地域で利用可能なアイテムのみをダウンロードできます。データがアカウント固有のものである場合は、ログイン プロセスで十分な通知になる場合があります。

于 2010-10-20T12:35:06.520 に答える
1

リソース バンドルを動的にロードできることは注目に値しますが、実行可能ファイルを iPhone にロードすることはできません。ビューの作成に IB を使用する場合は、まったく新しいビューを作成し、それをクラウドに配置してアプリからロードできます。唯一の注意点は、デザインの更新のみが可能で、機能を拡張できないことです。

XIB を動的にロードするには、次のinitWithNibNameメソッドを使用します。

- (id)initWithNibName:(NSString *)nibName bundle:(NSBundle *)nibBundle

動的にロードされたバンドルを渡します。

Mac では、動的にロードできる実行可能コードを含むバンドルを作成できますが、iPhone では作成できません。Mac 用に名前が付けられた Plist 構成がありますがNSPrincipalClass、残念ながら iPhone 用はまだありません。

于 2010-10-21T07:36:03.447 に答える
0

私のアプリは 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 つの質問に答えるだけで、暗号化は認証のみに使用すると答えました。アプリは問題なく承認されました。

于 2010-10-21T07:18:23.323 に答える
0

指定された時間ごとに新しいデータをダウンロードするタイマーを設定できることとは別に、プッシュ通知でそれを行うことができますが、問題はアプリを常に開いておく必要があることです.ios 4では、ユーザーに通知を送信できるローカル通知がありますアプリを閉じたとき

于 2010-10-21T06:58:08.327 に答える