2012-02-03 2 views
5

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.

risposta

5

È possibile aprire un URL utilizzando automaticamente

[[UIApplication sharedApplication] openURL:...]; 

Non so se funziona per ITMS-servizi: gli URL, ma funziona per altri schemi URL su misura come tel :, fb: ecc così dovrebbe fare a meno che Apple non l'abbia specificamente bloccato.

+1

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. –

+0

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. –

+0

Questo non sembra funzionare nel simulatore, ma va bene su un dispositivo reale. Mi sono confuso per un po '. –