Domanda

E 'possibile avere un auto-aggiornamento di un'applicazione per iPhone?

Credo che la risposta è no, ma non sono sicuro.

Ho un'applicazione di database driven che è in effetti un catalogo di prodotti. Voglio il database di essere sulla utenti iPhone in modo che il catalogo è veloce da usare. Tuttavia, periodicamente il contenuto delle modifiche del database.

ho potuto creare una notifica push per dire all'utente che c'è un aggiornamento del database pronto, ma sarebbe meglio se l'applicazione si aggiorna.

È stato utile?

Soluzione

Come Fluchtpunkt rispose, un app iOS possibile scaricare i nuovi dati, semplicemente non può scaricare nuovo codice. Molte applicazioni iOS, come ad esempio la moltitudine di client Twitter, principalmente download e visualizzazione dei dati.

Quando un app otterrà nei guai è se la sua interfaccia non chiarisce l'applicazione sta scaricando dati. Un'applicazione non dovrebbe utilizzare fino piano dati assegnazione di un iPhone senza che l'utente sappia. Lasciando il know utente può variare da notifiche esplicite tra cui la possibilità di annullare il download a rendere il concetto di app tutto di download di dati (ad esempio client Twitter).

L'utente deve anche essere notificata se l'applicazione è la condivisione di informazioni con il server. L'applicazione può decidere di trasmettere tali dati al download dei dati specifici in modo selettivo. Per esempio l'applicazione potrebbe utilizzare le informazioni sulla posizione per adattare il database scaricando solo gli elementi disponibili nella regione del dispositivo sembra essere. Un processo di accesso può essere sufficiente la notifica, se i dati sono account specifico.

Altri suggerimenti

finché non hai bisogno di cambiare nulla all'interno della app-fascio questo è possibile. Basta salvare i contenuti per i documenti Directory.

E, naturalmente, si è permesso di aggiornare il proprio database.

Non è possibile caricare un file eseguibile su iPhone, anche se vale la pena notare che è possibile caricare risorsa bundle in modo dinamico. Se si utilizza IB per la creazione di punti di vista, quindi è possibile creare una vista del tutto nuovo, metterlo sulla nuvola e caricarlo dal app. L'unica avvertenza è che è possibile aggiornare solo il design, ma non estendere la funzionalità.

Per caricare un XIB dinamicamente, utilizzare il metodo initWithNibName,

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

e passare il fascio caricato dinamicamente.

Su Mac, è possibile avere bundle che contengono codice eseguibile che può essere caricato in modo dinamico, ma non su iPhone. C'è una configurazione di nome Plist NSPrincipalClass per il Mac, ma purtroppo non per l'iPhone di sempre.

u può fare con notifica push a parte che u possibile impostare il timer che scarica i nuovi dati ogni volta specificato, ma il problema è l'applicazione deve essere aperta tutto il time.in iOS 4 v'è la notifica locale che può inviare notificationn all'utente anche quando applicazione è chiusa

La mia applicazione utilizza un database SQLite e l'aggiorna. Con ogni avvio (o svegliarsi dalla modalità sospesa) si connette al server web e controlli per un nuovo database. Per autenticare il database, scarica prima solo un file contenente la somma MD5 del database on-line e calcola la somma MD5 del database al telefono. Solo se le somme sono diverse, il nuovo database verrà scaricato. Questo ha l'effetto collaterale che mantiene il basso traffico.

Codice di esempio per calculatimg la somma 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;  
}

Tuttavia, scaricando l'intero database è solo una buona soluzione se il database non è di grandi dimensioni. Inoltre, ho gzipped il database ed estrarlo dopo il download.

#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);
}

E 'perfettamente bene per mostrare solo l'indicatore di attività di rete nella barra di stato e non utilizzare una barra di avanzamento o di altro indicatore. Se il database del telefono è fino ad oggi, non ho neanche informare l'utente, in quanto si tratta di informazioni non necessarie e sarà solo distrarlo. Tuttavia, se c'è un aggiornamento, I fade in una sovrapposizione della barra di stato e visualizzare le informazioni per alcuni secondi. Dal feedback dei miei utenti, posso dire che più o meno apprezzare questa soluzione.

Non dimenticate di aggiungere la crittografia calcolando la somma MD5. Bisogna indicare questo per Apple quando caricare il tuo prossimo aggiornamento. Ho solo dovuto rispondere a un'altra domanda e dire che io uso la crittografia solo per l'autenticazione. L'applicazione è stata approvata senza problemi.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top