Sto pianificando aggiornamenti per un'app aziendale con distribuzione ad-hoc.Toccare a livello di codice HTML href per aggiornare l'app
Per aggiornamenti, Apple raccomanda di avere l'utente visita una pagina HTML e toccare su un link:
href="itms-services://?action=download-manifest&url=http://example.com/
manifest.plist"
Vedi http://help.apple.com/iosdeployment-apps/#app43ad871e
Io non voglio fare questo. Voglio che l'app controlli a livello di programmazione gli aggiornamenti all'avvio e avvisa l'utente con UIAlertView che è disponibile un aggiornamento.
Ecco cosa ho fatto finora in applicazione, FinishLaunching. L'analisi plist complicato deriva dalla struttura di un esempio plist trovato qui: http://help.apple.com/iosdeployment-apps/#app43ad78b3
NSLog(@"checking for update");
NSData *plistData = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://example.com/MyApp.plist"]];
if (plistData) {
NSLog(@"finished checking for update");
NSError *error;
NSPropertyListFormat format;
NSDictionary *plist = [NSPropertyListSerialization propertyListWithData:plistData options:NSPropertyListImmutable format:&format error:&error];
if (plist) {
NSArray *items = [plist valueForKey:@"items"];
NSDictionary *dictionary;
if ([items count] > 0) {
dictionary = [items objectAtIndex:0];
}
NSDictionary *metaData = [dictionary objectForKey:@"metadata"];
float currentVersion = [[[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"] floatValue];
float newVersion = [[metaData objectForKey:@"bundle-version"] floatValue];
NSLog(@"newVersion: %f, currentVersion: %f", newVersion, currentVersion);
if (newVersion > currentVersion) {
NSLog(@"A new update is available");
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Update available" message:@"A new update is available." delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"UPDATE", nil];
[alert show];
}
}
}
allora ho il mio metodo UIAlertView delegato:
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
if (buttonIndex == 1) {
NSLog(@"downloading full update");
UIWebView *webView = [[UIWebView alloc] init];
[webView loadRequest:[[NSURLRequest alloc] initWithURL:[NSURL URLWithString:@"itms-services://?action=download-manifest&url=http://example.com/MyApp.plist"] cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:10.0]];
}
}
Un paio di cose:
- lo so [alert show] non dovrebbe essere chiamato nell'applicazione didFinish, ma lo cambierò più tardi.
- Non so quanto velocemente verranno scaricati i dati plistData e come questo download influisce sull'app.
- Ancora più importante, il mio metodo di segnalazione dei delegati non funziona e l'aggiornamento non viene scaricato. Anche quando introduco webView con @property (nonatomic, strong) UIWebView * webView, il metodo non fa nulla.
- Penso che Dropbox abbia configurato correttamente il MIME perché posso scaricare il .ipa tramite google Chrome.
Che cosa ho veramente bisogno è un modo utilizzando NSURLConnection (NSURLRequest ecc) per replicare l'atto di un utente toccando un HTML href. Dopo di ciò, penso che si verificherà l'aggiornamento completo.
Apple sembra aver iniziato a bloccare utilizzando itms-services in questo modo. Fortunatamente agli utenti può ancora essere chiesto di toccare un link href che coinvolge i servizi itms. –
Ho anche fallito l'apertura dell'URL dei servizi itms dall'interno dell'app. Immagino che significhi solo qualche tocco in più per l'utente per trovare e premere un pulsante di download su una pagina web. Non sono sicuro del motivo per cui lo bloccherebbero se fosse possibile farlo da una pagina web. –
Questo non sembra funzionare nel simulatore, ma va bene su un dispositivo reale. Mi sono confuso per un po '. –