Я планирую обновления для корпоративного приложения со специализированным распространением.
В качестве обновлений Apple рекомендует, чтобы пользователь посетил страницу HTML и нажал на ссылку:
href="itms-services://?action=download-manifest&url=http://example.com/
manifest.plist"
См. http://help.apple.com/iosdeployment-apps/#app43ad871e
Я не хочу этого делать.Я хочу, чтобы приложение программно проверяло наличие обновлений при запуске и уведомляло пользователя с помощью UIAlertView, что обновление доступно.
Вот что у меня есть в приложениифиниш.Сложный анализ 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] не должно вызываться в приложении didFinish, но я изменю его позже.
- Я не знаю, как быстро будет загружаться plistData и как этозагрузка влияет на приложение.
- Что еще более важно, мой метод делегирования представления предупреждений не работает, и обновление не загружается.Даже когда я представляю webView с @property (неатомным, сильным) UIWebView * webView, метод ничего не делает.
- Я думаю, что Dropbox настроил MIME правильно, потому что я могу загрузить .ipa через Google Chrome.
Так что мне действительно нужен способ , использующий NSURLConnection (NSURLRequest и т. Д.) Для воспроизведения действия пользователя, касающегося HTML href .После этого я думаю, что произойдет полное обновление.