Статьи

Обновление iOS-приложений с GroundControl

Отправка обновлений в App Store неизбежна, если вы хотите добавить значительные улучшения в приложение. Тем не менее, это простой и трудоемкий процесс проверки App Store для простых изменений. В этой статье я покажу вам, как обновить приложение удаленно с помощью проекта GroundControl .


Идея, лежащая в основе GroundControl, проста: приложение извлекает список удаленных свойств и обновляет свои NSUserDefaults содержимым списка свойств. Несмотря на то, что многие приложения загружают данные из выделенного бэкэнда для динамического обновления своего содержимого, стратегия, которую я изложу в этой статье, идеальна, если выделенный бэкэнд не подходит или превышает требования вашего приложения.

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

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

Чтобы проиллюстрировать, как все эти части сочетаются друг с другом, мы создадим приложение для iOS с соответствующим названием Remote Control Несмотря на то, что само приложение мало что даст, благодаря интеграции GroundControl для обновления NSUserDefaults приложения станет понятно, насколько легко удаленно обновить приложение с минимальными издержками. Давайте начнем.


Создайте новый проект в Xcode, выбрав шаблон приложения Single View Application из списка шаблонов (рисунок 1). Назовите приложение Remote Control , введите идентификатор компании, установите iPhone для семейства устройств и установите флажок « Использовать автоматический подсчет ссылок» . Не забудьте снять остальные флажки для этого проекта. Сообщите Xcode, где вы хотите сохранить свой проект, и нажмите кнопку « Создать» (рисунок 2).

Обновите свои приложения с помощью Dropbox или GroundControl: Настройка проекта - рисунок 1
Обновите свои приложения с помощью Dropbox или GroundControl: Настройка проекта - рисунок 2

Имя Мэтт Томпсон может показаться вам знакомым. Он является одним из создателей и движущей силой AFNetworking, самой популярной сетевой библиотеки для iOS и OS X. GroundControl построен на основе AFNetworking и предоставляет простое решение для удаленной настройки приложения путем обновления NSUserDefaults приложения. Это делается через категорию NSUserDefaults , которая позволяет NSUserDefaults асинхронно обновлять себя с помощью списка удаленных свойств.

Неважно, где находится список свойств, если к нему можно обратиться по протоколу HTTP (S), а тип содержимого ответа установлен на application/x-plist .

На странице GitHub GroundControl Мэтт приводит два примера реализации серверной части истории: одну реализацию Ruby и одну реализацию Python. Тем не менее, я обещал вам, что установка будет легкой и недорогой. Вместо того, чтобы использовать сервер, который вам нужен, мы будем использовать Amazon Simple Storage Service или S3 . Как я объяснил ранее, требования просты, то есть (1) файл должен быть списком свойств и (2) тип содержимого ответа должен быть application / x-plist . Amazon S3 идеально подходит.

AWS S3 не только идеально подходит для обслуживания статических файлов, но и заслужил отличные результаты за последние годы. Даже если ваше приложение достигнет топ-10 в App Store, S3 продолжит обслуживать список свойств, это без проблем. Прежде чем перейти на консоль AWS (Amazon Web Services), сначала необходимо интегрировать GroundControl в ваш проект.


GroundControl построен на основе AFNetworking, что означает, что вам нужно добавить AFNetworking в ваш проект Xcode. Хотя мы могли бы добавить AFNetworking и GroundControl с помощью CocoaPods, мы добавим обе библиотеки вручную, поскольку некоторые из вас могут быть не знакомы с CocoaPods. Загрузите последнюю версию AFNetworking и GroundControl и перетащите каждую библиотеку в свой проект Xcode. Обязательно скопируйте содержимое папки в проект, установив флажок « Копировать элементы в папку целевой группы (если необходимо)», и не забудьте добавить обе библиотеки в целевой объект «Удаленное управление» (рисунки 3 и 4).

Обновите свои приложения с помощью Dropbox или GroundControl: добавление AFNetworking и GroundControl - рисунок 3
Обновите свои приложения с помощью Dropbox или GroundControl: добавление AFNetworking и GroundControl - рисунок 4

Для некоторых своих функций AFNetworking использует инфраструктуру System Configuration и Mobile Core Services . Поэтому необходимо связать ваш проект с этими структурами. Выберите ваш проект в Навигаторе проектов и выберите цель Remote Control из списка целей. Выберите « Фазы сборки» вверху, откройте блок «Связать двоичные файлы с библиотеками» и добавьте обе платформы в свой проект (рисунок 5).

Обновите свои приложения с помощью Dropbox или GroundControl: добавление необходимых фреймворков - рисунок 5

Прежде чем мы сможем начать работать с AFNetworking и GroundControl, нам нужно обновить файл Prefix.pch проекта, добавив оператор импорта для фреймворков, которые мы только что добавили в проект. Посмотрите на фрагмент ниже для уточнения.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
//
// Prefix header for all source files of the ‘Remote Control’ target in the ‘Remote Control’ project
//
 
#import <Availability.h>
 
#ifndef __IPHONE_4_0
#warning «This project uses features only available in iOS SDK 4.0 and later.»
#endif
 
#ifdef __OBJC__
    #import <UIKit/UIKit.h>
    #import <Foundation/Foundation.h>
    #import <MobileCoreServices/MobileCoreServices.h>
    #import <SystemConfiguration/SystemConfiguration.h>
#endif

Мы начнем с добавления двух операторов import в файл реализации делегата приложения, один для AFNetworking, а другой для GroundControl. Если вы в конечном итоге используете AFNetworking в разных местах вашего проекта, то было бы неплохо добавить оператор импорта для AFNetworking в файл Prefix.pch вашего проекта.

1
2
#import «AFNetworking.h»
#import «NSUserDefaults+GroundControl.h»

Интеграция GroundControl — это простая часть, так как она требует только двух строк кода. В applicationDidBecomeActive: метод делегата applicationDidBecomeActive: мы вызываем вспомогательный метод для инициализации GroundControl.

1
2
3
4
— (void)applicationDidBecomeActive:(UIApplication *)application {
    // Initialize GroundControl
    [self initializeGroundControl];
}

Вспомогательный метод не может быть проще благодаря категории на NSUserDefaults предоставленной GroundControl. Мы создаем URL для списка свойств и передаем его в качестве аргумента в registerDefaultsWithURL: Это обеспечит асинхронную загрузку списка свойств. После загрузки NSUserDefaults автоматически обновляется содержимым списка свойств.

1
2
3
4
— (void)initializeGroundControl {
    NSURL *url = [NSURL URLWithString:@»https://www.example.com/RemoteControl.plist»];
    [[NSUserDefaults standardUserDefaults] registerDefaultsWithURL:url];
}

Другой вариант — вызывать registerDefaultsWithURL:success:failure: вместо этого, если вы предпочитаете работать с обратными вызовами success и fail. Для еще большего контроля GroundControl предоставляет третий метод, registerDefaultsWithURLRequest:success:failure: fail registerDefaultsWithURLRequest:success:failure: Этот метод принимает экземпляр NSURLRequest а также блок успеха и сбоя.

Это может вас удивить, но интеграция GroundControl была сложной частью. Последние два шага: (1) создание списка свойств и (2) загрузка его в Amazon S3.


Создайте новый файл в XCode, выбрав вкладку Resource слева и выбрав Property List справа (рисунок 6). Назовите файл RemoteControl и сохраните его на рабочем столе вашего компьютера. Нет необходимости добавлять его в ваш проект Xcode. Самый простой способ редактировать список свойств в Xcode. Посмотрите на скриншот ниже, чтобы увидеть, как выглядит список свойств и как его можно редактировать в Xcode (рисунок 7). Помните, что список свойств может содержать только логические значения, даты, числа, двоичные данные, строки, массивы и словари. Рекомендуется использовать пространство имен для ключей (например, с префиксом класса проекта), чтобы убедиться, что они не конфликтуют с другими записями, хранящимися в NSUserDefaults .

Обновите свои приложения с помощью Dropbox или GroundControl: создайте список свойств - рисунок 6
Обновите свои приложения с помощью Dropbox или GroundControl: создайте список свойств - рисунок 7

Чтобы использовать веб-сервисы Amazon, вам нужна учетная запись Amazon. Затраты, связанные с Amazon S3, чрезвычайно низки, и есть вероятность, что вы даже не будете платить в течение достаточно долгого времени, так как список свойств имеет размер всего несколько килобайт.

Вы можете загрузить список свойств в Amazon S3 с помощью Amazon AWS Console или с помощью приложения, поддерживающего Amazon S3, например фантастической Transmit от Panic .

После загрузки списка свойств осталось сделать три вещи: (1) копирование URL-адреса списка свойств, (2) предоставление открытого доступа к списку свойств и (3) установка правильного типа контента.

В консоли AWS выберите список свойств и нажмите кнопку « Свойства» в правом верхнем углу. Выберите вкладку с именем Details на панели свойств (рисунок 8). Скопируйте ссылку в списке свойств и обновите метод initializeGroundControl в initializeGroundControl приложения, указав правильный URL-адрес.

Обновите свои приложения с помощью Dropbox или GroundControl: скопируйте URL-адрес в консоли AWS - рисунок 8

Выберите вкладку « Разрешения» на панели свойств и добавьте новый набор разрешений в список свойств, нажав кнопку « Добавить дополнительные разрешения» . Установите грантополучателя « Все» и ограничьте права на « Открыть / Загрузить» . Это гарантирует, что ваше приложение может загрузить список свойств. Не забудьте нажать кнопку сохранения, чтобы распространить изменения.

Обновите свои приложения с помощью Dropbox или GroundControl: предоставление публичного доступа к списку свойств - рисунок 9

Выберите вкладку с именем Метаданные на панели свойств и установите значение ключа Content-Type равным application / x-plist . Не забудьте нажать кнопку сохранения, чтобы распространить изменения.

Обновите свои приложения с помощью Dropbox или GroundControl: установите тип содержимого ответа - рисунок 10

Ваша заявка готова к удаленному обновлению. То, как ваше приложение реагирует на изменения, внесенные в список свойств, зависит от вашего приложения. Эта статья только показывает, как легко обновлять приложение удаленно, не отправляя новую версию в App Store.

Вы можете проверить, все ли работает, немного изменив метод initializeGroundControl . Вместо того, чтобы вызывать registerDefaultsWithURL: мы используем registerDefaultsWithURL:success:failure: fail registerDefaultsWithURL:success:failure: предоставлено GroundControl. Если вы правильно реализовали GroundControl, словарь блока успеха должен содержать данные списка свойств. NSUserDefaults вашего приложения будут обновлены автоматически.

1
2
3
4
5
6
7
8
9
— (void)initializeGroundControl {
    NSURL *url = [NSURL URLWithString:@»https://s3.amazonaws.com/com.mobiletuts.bartjacobs/RemoteControl.plist»];
    [[NSUserDefaults standardUserDefaults] registerDefaultsWithURL:url success:^(NSDictionary *defaults) {
        NSLog(@»Defaults > %@», defaults);
 
    } failure:^(NSError *error) {
        NSLog(@»Error > %@ with user info %@.», error, [error userInfo]);
    }];
}

Огромный успех и быстрое внедрение Dropbox привели к появлению множества умных и полезных приложений. Для людей, не знакомых с AWS и Xcode, было бы проще работать с Dropbox. Хотя Dropbox является отличным решением и предоставляет возможность сделать файл общедоступным, поместив его в общую папку Dropbox, Dropbox нельзя использовать с текущей версией GroundControl. Причина в том, что тип содержимого списка свойств, обслуживаемого Dropbox, автоматически устанавливается на text / plain вместо требуемого application / x-plist . AFNetworking выдает ошибку из-за того, что требуемый тип контента не соответствует application / x-plist .

Тем не менее, можно использовать Dropbox для удаленного обновления приложения. Предостережение заключается в том, что вам придется выполнять некоторые тяжелые действия самостоятельно, то есть асинхронно загружать список свойств и обновлять NSUserDefaults приложения.

Несмотря на полезность публичной папки Dropbox, ее будущее неясно. Также неясно, существует ли ограничение полосы пропускания для файлов в общедоступной папке Dropbox. Другими словами, если вы хотите использовать Dropbox для удаленного обновления приложения iOS или OS X, имейте в виду, что в какой-то момент оно может сломаться или ваша учетная запись Dropbox может быть заблокирована из-за превышения определенных ограничений.


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

Конечно, есть несколько других возможностей для удаленного обновления приложения. Например, можно использовать такой сервис, как Parse . Тем не менее, я считаю, что даже Parse «слишком много», если все, что вы хотите сделать, это обновить несколько настроек.