Как обновить корпоративные приложения ios6 в эфире - программирование
Подтвердить что ты не робот

Как обновить корпоративные приложения ios6 в эфире

Здравствуйте, мы недавно разработали наше первое корпоративное приложение. Мы используем опцию "Внутренний" для создания сертификата распространения. Клиент еще не использует приложение. Но он будет использовать его в ближайшее время. Между тем у меня возник вопрос. Он будет использовать приложение и в будущем, если с нашей стороны будут какие-либо обновления приложения, мы хотим, чтобы клиент обновил его на своей стороне. Как сейчас, у меня есть приложения, установленные на моем iPhone. Я получаю обновление от AppStore, заявив, что приложение XYZ обновлено. Поэтому я устанавливаю обновление. Теперь, если наш клиент использует приложение и сохранил некоторые данные на нем (наше приложение использует основные данные, и мы построили его таким образом, чтобы клиент мог хранить некоторые данные на устройстве), мы хотим отправить ему обновление, которое будет устанавливать обновление, но не удалить существующие данные клиента. Возможно ли это? Как мне это сделать? Я использую прямо сейчас, чтобы установить приложение. У нас есть безопасный сервер, где присутствуют файлы .ipa и .plist, и у нас есть страница загрузки html. Клиент нажимает на ссылку и приложение устанавливается. Пожалуйста, дайте мне знать, если вам нужна дополнительная информация. Спасибо.

4b9b3361

Ответ 1

Да, это возможно. При развертывании приложения Enterprise требуется plist, который содержит метаданные о приложении. Эти метаданные включают номер версии, который вы можете использовать для проверки обновлений.

BOOL updateAvailable = NO;
NSDictionary *updateDictionary = [NSDictionary dictionaryWithContentsOfURL:
                                  [NSURL URLWithString:@"http://www.example.com/pathToPlist"]];

if(updateDictionary)
{
    NSArray *items = [updateDictionary objectForKey:@"items"];
    NSDictionary *itemDict = [items lastObject];

    NSDictionary *metaData = [itemDict objectForKey:@"metadata"];
    NSString *newversion = [metaData valueForKey:@"bundle-version"];
    NSString *currentversion = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"];

    updateAvailable = [newversion compare:currentversion options:NSNumericSearch] == NSOrderedDescending;
}

Как только вы обнаружите, что обновление доступно, перейдите к URL-адресу загрузки

itms-services://?action=download-manifest&url=<url-path-to-plist>

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

Ответ 2

Спасибо Джо за фантастический ответ. Вот расширенная версия, переведенная на быстрый. Вы можете поместить его в viewDidLoad вашего основного контроллера представления

let plistUrl = "https://example.com/example.plist"
let installationUrl = "itms-services://?action=download-manifest&amp;url=https://example.com/example.plist"


override func viewDidLoad() {
    super.viewDidLoad()

    //Check for the updates        
    checkForUpdates()
}

func checkForUpdates() {
    let qualityOfServiceClass = QOS_CLASS_BACKGROUND
    let backgroundQueue = dispatch_get_global_queue(qualityOfServiceClass, 0)
    dispatch_async(backgroundQueue, {
        let updateDictionary = NSDictionary(contentsOfURL: NSURL(string: self.plistUrl)!)!

        let items = updateDictionary["items"]
        let itemDict = items?.lastObject as! NSDictionary
        let metaData = itemDict["metadata"] as! NSDictionary
        let serverVersion = metaData["bundle-version"] as! String
        let localVersion = NSBundle.mainBundle().infoDictionary!["CFBundleVersion"] as! String
        let updateAvailable = serverVersion.compare(localVersion, options: .NumericSearch) == .OrderedDescending;

        if updateAvailable {
            self.showUpdateDialog(serverVersion)
        }
    })
}

func showUpdateDialog(serverVersion: String) {
    dispatch_async(dispatch_get_main_queue(), { () -> Void in
        let alertController = UIAlertController(title: "New version of Example available!", message:
            "Example \(serverVersion) has been released. Would you like to download it now?", preferredStyle: UIAlertControllerStyle.Alert)
        alertController.addAction(UIAlertAction(title: "Not now", style: .Cancel,handler: nil))
        alertController.addAction(UIAlertAction(title: "Update", style: .Default, handler: { (UIAlertAction) in
            UIApplication.sharedApplication().openURL(NSURL(string: self.installationUrl)!)
        }))

        self.presentViewController(alertController, animated: true, completion: nil)
    })
}

Ответ 3

Просто распространяйте обновление так же, как вы распространяете оригинал. Пользователь сохраняет данные из более ранней версии.

Ответ 4

Для обновлений приложений существующие данные приложения сохраняются, если идентификатор пакета для приложения остается прежним.

Apple объясняет, что Enterprise App Deployment и обновления приложений здесь: http://help.apple.com/iosdeployment-apps/mac/1.1/#app43ad802c

Я бы также рекомендовал включать проверку обновлений в приложении.

Для этого iVersion - это библиотека ios от Nick Lockwood (также известный как Charcoal Design), которая поможет вам в этом. Он доступен здесь: https://github.com/nicklockwood/iVersion