2012-02-03 1 views
5

Я планирую обновления для корпоративного приложения с распределением ad-hoc.Программно нажмите на HTML href, чтобы обновить приложение

Для обновления, Apple рекомендует иметь пользователь посетить страницу HTML и нажмите на ссылку:

href="itms-services://?action=download-manifest&url=http://example.com/
manifest.plist" 

См http://help.apple.com/iosdeployment-apps/#app43ad871e

Я не хочу, чтобы это сделать. Я хочу, чтобы приложение программно проверяло наличие обновлений при запуске и предупреждало пользователя с UIAlertView о том, что обновление доступно.

Вот что у меня есть до сих пор в приложении didFinishLaunching. Сложная PLIST разбор исходит из структуры примера PLIST здесь: 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]; 
     }  
    } 
} 

Тогда у меня есть свой метод UIAlertView делегат:

- (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]]; 
    } 
} 

несколько вещей:

  • Я знаю [alert show] не следует вызывать в приложении didFinish, но я изменю его позже.
  • Я не знаю, как быстро будет загружаться plistData и как эта загрузка влияет на приложение.
  • Что еще более важно, метод делегата представления моего предупреждения не работает, и обновление не загружается. Даже когда я представляю webView с @property (неатомным, сильным) UIWebView * webView, метод ничего не делает.
  • Я думаю, что Dropbox имеет MIME правильно настроен, потому что я могу загрузить .ipa через Google Chrome.

Так что мне действительно нужно, это способ использования NSURLConnection (NSURLRequest и т.д.), чтобы повторить действие пользователя, постукивания на HTML HREF. После этого я думаю, что полное обновление произойдет.

ответ

5

Вы можете открыть URL автоматически с помощью

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

Я не знаю, если это работает для ITMS-услуг: URLS, но это работает для других заказных схем URL, как :, тел фб: и т.д., так он должен делать, если Apple специально заблокировала его.

+1

Apple, похоже, начала блокировать использование itms-сервисов таким образом. К счастью, пользователям все равно может быть предложено использовать ссылку href, в которой задействованы itms-сервисы. –

+0

Я также не смог открыть URL-адрес itms-services из приложения. Я думаю, это просто означает несколько дополнительных кранов для пользователя, которые можно найти и нажмите кнопку загрузки на веб-странице. Не уверен, почему они заблокировали бы это, хотя в любом случае это можно сделать с веб-страницы. –

+0

Это не похоже на работу в Simulator, но отлично работает на реальном устройстве. Некоторое время я смущался. –

Смежные вопросы