Программно нажмите на HTML href, чтобы обновить приложение

Я планирую обновления для корпоративного приложения со специальным распространением.

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

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

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

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

Вот что я до сих пор в приложении делал FinishLaunching. Сложный синтаксический анализ списка составлен из структуры приведенного здесь примера списка: http://help.apple.com/iosdeployment-apps/

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

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

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

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

1 ответ

Решение

Вы можете открыть URL автоматически, используя

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

Я не знаю, работает ли он для itms-services: urls, но он работает для других индивидуальных схем URL, таких как tel:, fb: и т. Д., Так что должно быть, если Apple специально не заблокировала его.

Другие вопросы по тегам