Estoy planeando actualizaciones para una aplicación empresarial con distribución ad-hoc.Haga clic en HTML href para actualizar la aplicación
Para actualizaciones, Apple recomienda que tenga el usuario visita una página HTML y pinchar en un enlace:
href="itms-services://?action=download-manifest&url=http://example.com/
manifest.plist"
Ver http://help.apple.com/iosdeployment-apps/#app43ad871e
no quiero hacer esto. Quiero que la aplicación compruebe programáticamente las actualizaciones en el lanzamiento y alertar al usuario con un UIAlertView de que hay una actualización disponible.
Esto es lo que tengo hasta ahora en la aplicación didFinishLaunching. El análisis plist complicado viene de la estructura de un ejemplo plist encontrado aquí: 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];
}
}
}
entonces tengo mi método UIAlertView delegado:
- (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 par de cosas:
- que sé [alert show] no debería llamarse en la aplicación didFinish, pero lo cambiaré más tarde.
- No sé qué tan rápido se descargará plistData y cómo esta descarga afecta a la aplicación.
- Más importante aún, mi método delegado de vista de alerta no funciona y la actualización no se descarga. Incluso cuando introduzco webView con @property (no atómico, fuerte) UIWebView * webView, el método no hace nada.
- Creo que Dropbox tiene el MIME configurado correctamente porque puedo descargar el .ipa a través de Google Chrome.
Así que lo que realmente necesita es una manera usando NSURLConnection (NSURLRequest etc.) para replicar el acto de un usuario tocando en un archivo HTML href. Después de eso, creo que se realizará la actualización completa.
Apple parece haber comenzado a bloquear el uso de servicios de itms de esta manera. Afortunadamente, aún se puede pedir a los usuarios que toquen un enlace href que involucra servicios de itms. –
También he tenido éxito al abrir la URL de itms-services desde la aplicación. Supongo que solo significa unos pocos toques adicionales para que el usuario encuentre y presione un botón de descarga en una página web. Sin embargo, no estoy seguro de por qué bloquearían esto si se puede hacer desde una página web. –
Esto no parece funcionar en el simulador, pero está bien en un dispositivo real. Me confundió por un tiempo. –