Отправка обновлений в App Store неизбежна, если вы хотите добавить значительные улучшения в приложение. Тем не менее, это простой и трудоемкий процесс проверки App Store для простых изменений. В этой статье я покажу вам, как обновить приложение удаленно с помощью проекта GroundControl .
Вступление
Идея, лежащая в основе GroundControl, проста: приложение извлекает список удаленных свойств и обновляет свои NSUserDefaults
содержимым списка свойств. Несмотря на то, что многие приложения загружают данные из выделенного бэкэнда для динамического обновления своего содержимого, стратегия, которую я изложу в этой статье, идеальна, если выделенный бэкэнд не подходит или превышает требования вашего приложения.
Настройка, обсуждаемая в этом руководстве, легкая и недорогая. Он не только недорогой, но и прост в обслуживании, что часто упускается из виду как клиентами, так и разработчиками.
Важно подчеркнуть, что списки свойств идеально подходят для небольших порций данных и не должны использоваться в качестве замены для выделенного бэкэнда. Если приложение нуждается в ежедневном обновлении новым контентом, стратегия, описанная в этом руководстве, не приведет к его снижению.
Чтобы проиллюстрировать, как все эти части сочетаются друг с другом, мы создадим приложение для iOS с соответствующим названием Remote Control Несмотря на то, что само приложение мало что даст, благодаря интеграции GroundControl для обновления NSUserDefaults приложения станет понятно, насколько легко удаленно обновить приложение с минимальными издержками. Давайте начнем.
Шаг 1: Настройка проекта
Создайте новый проект в Xcode, выбрав шаблон приложения Single View Application из списка шаблонов (рисунок 1). Назовите приложение Remote Control , введите идентификатор компании, установите iPhone для семейства устройств и установите флажок « Использовать автоматический подсчет ссылок» . Не забудьте снять остальные флажки для этого проекта. Сообщите Xcode, где вы хотите сохранить свой проект, и нажмите кнопку « Создать» (рисунок 2).
Шаг 2: GroundControl
Имя Мэтт Томпсон может показаться вам знакомым. Он является одним из создателей и движущей силой 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 в ваш проект.
Шаг 3: Добавление AFNetworking и GroundControl
GroundControl построен на основе AFNetworking, что означает, что вам нужно добавить AFNetworking в ваш проект Xcode. Хотя мы могли бы добавить AFNetworking и GroundControl с помощью CocoaPods, мы добавим обе библиотеки вручную, поскольку некоторые из вас могут быть не знакомы с CocoaPods. Загрузите последнюю версию AFNetworking и GroundControl и перетащите каждую библиотеку в свой проект Xcode. Обязательно скопируйте содержимое папки в проект, установив флажок « Копировать элементы в папку целевой группы (если необходимо)», и не забудьте добавить обе библиотеки в целевой объект «Удаленное управление» (рисунки 3 и 4).
Для некоторых своих функций AFNetworking использует инфраструктуру System Configuration и Mobile Core Services . Поэтому необходимо связать ваш проект с этими структурами. Выберите ваш проект в Навигаторе проектов и выберите цель Remote Control из списка целей. Выберите « Фазы сборки» вверху, откройте блок «Связать двоичные файлы с библиотеками» и добавьте обе платформы в свой проект (рисунок 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
|
Шаг 4: Интеграция GroundControl
Мы начнем с добавления двух операторов 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.
Шаг 5: Создайте список свойств
Создайте новый файл в XCode, выбрав вкладку Resource слева и выбрав Property List справа (рисунок 6). Назовите файл RemoteControl и сохраните его на рабочем столе вашего компьютера. Нет необходимости добавлять его в ваш проект Xcode. Самый простой способ редактировать список свойств в Xcode. Посмотрите на скриншот ниже, чтобы увидеть, как выглядит список свойств и как его можно редактировать в Xcode (рисунок 7). Помните, что список свойств может содержать только логические значения, даты, числа, двоичные данные, строки, массивы и словари. Рекомендуется использовать пространство имен для ключей (например, с префиксом класса проекта), чтобы убедиться, что они не конфликтуют с другими записями, хранящимися в NSUserDefaults
.
Шаг 6: Загрузить список свойств
Чтобы использовать веб-сервисы Amazon, вам нужна учетная запись Amazon. Затраты, связанные с Amazon S3, чрезвычайно низки, и есть вероятность, что вы даже не будете платить в течение достаточно долгого времени, так как список свойств имеет размер всего несколько килобайт.
Вы можете загрузить список свойств в Amazon S3 с помощью Amazon AWS Console или с помощью приложения, поддерживающего Amazon S3, например фантастической Transmit от Panic .
После загрузки списка свойств осталось сделать три вещи: (1) копирование URL-адреса списка свойств, (2) предоставление открытого доступа к списку свойств и (3) установка правильного типа контента.
Скопируйте URL
В консоли AWS выберите список свойств и нажмите кнопку « Свойства» в правом верхнем углу. Выберите вкладку с именем Details на панели свойств (рисунок 8). Скопируйте ссылку в списке свойств и обновите метод initializeGroundControl
в initializeGroundControl
приложения, указав правильный URL-адрес.
Предоставить публичный доступ
Выберите вкладку « Разрешения» на панели свойств и добавьте новый набор разрешений в список свойств, нажав кнопку « Добавить дополнительные разрешения» . Установите грантополучателя « Все» и ограничьте права на « Открыть / Загрузить» . Это гарантирует, что ваше приложение может загрузить список свойств. Не забудьте нажать кнопку сохранения, чтобы распространить изменения.
Установить тип контента
Выберите вкладку с именем Метаданные на панели свойств и установите значение ключа Content-Type равным application / x-plist . Не забудьте нажать кнопку сохранения, чтобы распространить изменения.
Шаг 7: Сборка и запуск
Ваша заявка готова к удаленному обновлению. То, как ваше приложение реагирует на изменения, внесенные в список свойств, зависит от вашего приложения. Эта статья только показывает, как легко обновлять приложение удаленно, не отправляя новую версию в 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
Огромный успех и быстрое внедрение 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 «слишком много», если все, что вы хотите сделать, это обновить несколько настроек.