Как мне создать приложение для iPhone, чтобы общаться с моим сайтом? - PullRequest
19 голосов
/ 15 октября 2010

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

Я бы хотел, чтобы веб-платформа была центральной (данные размещались в базе данных mySQL) и имела бы клиенты iPhone общаются с ним и используют REST'ful методы для выполнения функций сайта (выборка последнего контента, размещение контента, голосование, управление аккаунтом в качестве примеров).

Я бы хотел, чтобы клиенты получали локальную копию данных в базе данных SQLite, но обновлялся, чтобы получить последнюю версию канала (аналогично приложению Twitter).

Пара мыслей, которые у меня сейчас есть:

  • Используйте что-то вроде ASIHTTPRequest для отправки / получения данных в файлы PHP на сервере, прослушивающем запросы

  • JSON - лучше ли мне отправлять GET / POSTS на PHP, который возвращает объекты JSON, и работать с какой-то оболочкой, которая управляет данными и передает изменения в локальную базу данных SQLite?

  • Полностью ли я не согласен с тем, как мне строить эту штуку для общения с сетью? Является есть лучшая практика для этого?

Я бы очень признателен за любую информацию о том, как вы будете проектировать такую ​​установку.

Спасибо,

РЕДАКТИРОВАТЬ : После прочтения моего собственного поста я знаю, что он звучит как клиент Twitter, но это НЕ, хотя он имеет схожие функции / структуру настройки типа Twitter. Спасибо!

Ответы [ 6 ]

17 голосов
/ 20 октября 2010

Как вы уже указали в своем плане, XML и REST - отличный способ взаимодействия с веб-приложением. Я хочу предложить несколько деталей о том, как на самом деле спроектировать и построить его, или что вы должны иметь в виду.

Прежде всего, я считаю, что важно придерживаться MVC. Я видел людей, создающих HTTP-соединения в контроллерах представления, контроллеры - это делегат NSXMLParser, контроллеры, содержащие данные в переменных-членах. Я даже видел UITableCells, устанавливающий HTTP-соединения. Не делай этого!

Ваша модель и ее базовый код манипуляции должны быть максимально извлечены из пользовательского интерфейса. Поскольку вы уже создали модель в своем веб-приложении, попробуйте воссоздать сущности в вашем проекте iPhone. Не бойтесь иметь некоторые простые методы в классах сущностей, но не заставляйте их использовать внешние ресурсы, особенно соединения tcp. В качестве примера методов в классе сущностей у вас могут быть методы, которые форматируют данные особым образом (даты в качестве примера или возвращают полное имя как объединение имени и фамилии), или вы даже можете иметь метод, подобный - (void)update, который будет действовать как обертка для вызова класса, ответственная за обновление модели.

Создайте еще один класс для обновления модели - извлечения XML-файлов из веб-приложения. Даже не рассматривайте возможность использования синхронных соединений, даже из выделенного потока. Асинхронные соединения с делегатом - путь. Иногда нужно сделать несколько запросов, чтобы получить все необходимые данные. Возможно, вы захотите создать какой-то конечный автомат, чтобы хранить информацию о том, на какой стадии загрузки вы находитесь, и переходить от этапа к этапу, пропуская до конца, если возникнет ошибка, и через несколько секунд повторно выполнить этап сбоя.

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

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

Чтобы сэкономить время и пропускную способность, рассмотрите возможность использования заголовков HTTP If-Modified-Since и / или ETag. Запомните время или тег, когда вы запрашивали данные в последний раз, и в следующий раз отправляйте их в заголовке HTTP. Ваше веб-приложение должно вернуть HTTP-код 304, если содержимое не было изменено. Приложение iPhone должно реагировать на этот код соответственно в connection:didReceiveResponse:.

Создайте специальный класс для анализа XML и обновления модели. Вы можете использовать NSXMLParser, но если ваши файлы не очень большие, я настоятельно рекомендую TouchXML, так приятно работать с XML в качестве документа (он также поддерживает XPath) вместо API, основанного на событиях. Вы также можете использовать этот синтаксический анализатор, когда файлы загружаются, чтобы проверить их действительность - повторно загружать, если синтаксический анализ не удался. Вот тогда пригодится специальный класс для разбора.

Если ваш набор данных невелик, если вам не нужно постоянно сохранять загруженные данные на iPhone, вам, вероятно, не нужно хранить их в базе данных SQLite, вы можете просто сохранить их в формате XML - просто простое кэширование. По крайней мере, так может быть в приложении для Twitter. Это становится проще, но для больших наборов данных XML потребляет много памяти и вычислительной мощности - в этом случае SQLite лучше.

Я бы предложил использовать Core Data, но вы упомянули, что это ваше первое приложение для iPhone, поэтому я советую вам не использовать его. Тем не менее.

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

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

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

Это не связано с архитектурой приложения, но я хочу напомнить, что Objective-C - это очень выразительный язык.Код должен читаться так же, как предложение.Расширить классы с помощью протоколов.Как пример на днях мне нужна была первая строка строки.Конечно, вы можете написать однострочник, где вы найдете первое вхождение новой строки, и получить подстроку от начала до конца.Но это не выглядит правильно.Я добавил - (NSString*)firstLine в протокол NSString.Таким образом, код выглядит намного лучше, он не нуждается в комментариях.

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

3 голосов
/ 25 октября 2010

У Apple есть совершенно новый фрагмент кода - MVCNetworking , который подробно показывает, как использовать подклассы NSHTTPRequests и NSOperationQueues.

3 голосов
/ 18 октября 2010

В настоящее время я работаю над приложением, которое звучит похоже на ваше. Я бы также предложил ASIHTTPRequest и, возможно, что-то вроде TouchJSON для анализа JSON или расширение / создание делегата NSXMLParser, если вы хотите анализировать XML.

Как предполагает JosephH, в зависимости от того, как работает ваше приложение, вы можете рассмотреть альтернативные методы аутентификации: я бы взглянул на что-то на основе токенов, например OAuth, в котором есть готовых библиотек для люди, чтобы копаться.

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

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

В общем, вы, кажется, на правильном пути, просто убедитесь, что вы все спланировали заранее:)

2 голосов
/ 25 октября 2010

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

Независимо от того, какой метод / библиотеку вы выберете для общения с вашими веб-сервисами, я думаю, что важно четко разделить ваш дизайн.Ваша модель данных на телефоне VS.модель данных в вашем веб-приложении.У вас есть три основных отличия, которые следует учитывать при разработке:

  1. Модель данных в веб-приложении (отраженная вашей существующей базой данных MySQL)

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

  2. Модель данных в приложении iPhone (отражается в информации, которую необходимо отобразить в iPhoneприложение)

    Здесь начинается самое интересное.Во-первых, вам нужно хорошо понять, какие данные вам нужно отобразить в приложении телефона.Поэтому сначала создайте хороший дизайн вашего приложения на высоком уровне (используйте ручку и бумагу, нарисуйте макеты каждого представления и взаимодействия между ними, смоделируйте навигацию между контроллерами представления и т. Д.).Это действительно помогает понять взаимодействие между вашими контроллерами представления и различными частями данных, которые вы хотите показать в приложении.Это поможет вам создать требования к модели данных на телефоне.Исходя из этих требований, сопоставьте существующую (веб-модель) модель данных с новой моделью, подходящей для вашего приложения для iPhone.Эта новая модель может включать или не включать все таблицы и поля, найденные в вашем веб-приложении.Но общее представление двух моделей должно быть очень схожим (например, отношения, типы данных и т. Д.)

  3. Модель данных, используемая для связи между двумя выше (это ваш обмен данными)протокол ')

    Когда у вас есть 2 представления ваших данных выше, вам нужно «перевести» из одного в другое в обе стороны .Разработайте свой протокол обмена данными, чтобы он был максимально простым и компактным.Вы не хотите тратить байты на бесполезную информацию, так как передача по сети обходится дорого.(В качестве примечания вы можете подумать о сжатии передаваемых данных позже, но так же важно иметь хороший дизайн с самого начала).Вероятно, лучше всего начать с протокола, в котором метаданные такие же, как и в модели веб-приложения (например, те же отношения, имена таблиц, атрибуты и т. Д.).Но помните, вам нужно будет только сериализовать / десериализовать те сущности и отношения, которые вы перечислили в пункте 2) выше.Так что дизайн соответственно.Ваш протокол обмена может также включать токены сеанса, информацию об аутентификации, номер версии или другие метаданные, если вам это нужно.

    Помните: ваш протокол обмена данными - это то, что разъединит ваше веб-приложение имодели приложений для iPhone.Я обнаружил, что лучше разлучить их, потому что они оба могут развиваться со временем.Например, модель данных на iPhone может сильно эволюционировать, особенно когда вы обнаружите, что вам нужно изменить модель некоторых отношений или добавить / удалить атрибуты из ваших сущностей, чтобы улучшить отзывчивость приложения или пользовательский интерфейс, навигацию,или что угодно.

    Поскольку это само по себе большое беспокойство, вам необходимо разработать общий механизм сериализации / десериализации поверх вашего (JSON / XML / любого парсера по вашему выбору), который достаточно гибок, чтобы поддерживать потенциалразличия между вашими 2 моделями данных.Эти различия могут быть следующими: имена сущностей / атрибутов / отношений, имена идентификаторов первичных ключей, типы данных, атрибуты, которые следует игнорировать, и этот список можно продолжить.Я бы определенно реализовал класс утилиты serializer / de-serializer в приложении iPhone, опираясь на файл конфигурации .plist, содержащий все поддерживаемые объекты, проблемы, псевдонимы, которые могут у вас возникнуть.Конечно, каждый объект модели должен «знать», как сериализовать, десериализовать себя и свои отношения (т. Е. Требуемую глубину графа объекта).

    Последнее замечание, так как в итоге вы получите 2 представления вашегоДля данных вам понадобится способ однозначно идентифицировать объект с обеих сторон.Так, например, подумайте о добавлении атрибута uuid ко всем данным, которые необходимо обменять, или используйте любой другой подход, который соответствует вашим потребностям.

Я создаю приложение, которое имеетсхожие с вашими требованиями, и эти подходы я считаю наилучшими на сегодняшний день.Кроме того, это видео может оказаться полезным (оно вдохновило меня на реализацию некоторых из упомянутых выше проблем и особенно интересно, если вы используете CoreData):

http://itunes.apple.com/ca/podcast/linkedin-important-life-lessons/id384233225?i=85092597 (см. лекцию под названием «LinkedIn: важные жизненные уроки по CoreData & GameKit (12 марта 2010 г.)»)

Удачи!

1 голос
/ 18 октября 2010

Это довольно широкий вопрос, и я думаю, что вы все равно идете правильным путем, однако я сделаю все возможное, чтобы дать несколько советов:

JSON, ASIHTTPRequest и сценарии POST в PHP звучат какотличный способ.

Если данные не очень чувствительны, я бы использовал http большую часть времени и использовал бы https только для страницы входа, которая либо устанавливает cookie, либо возвращает «токен», которыйвы используете в последующих запросах.(HTTPS может быть довольно медленным по соединению 3G, поскольку накладные расходы с точки зрения количества пакетов для установки SSL-соединения выше, чем обычного TCP-соединения.)

Вы должны убедиться, что правильно передаете любые данные изввод PHP-сценариев в базу данных, чтобы избежать любых атак SQL-инъекций - т.е.используется параметризованный SQL, не создавать SQL-запросы, выполняя "SELECT * from users where username="+$_GET['username']"

0 голосов
/ 16 октября 2010

Я бы сделал это так, как сделал бы со многими вещами на веб-страницах AJAX. i.e.:

  1. У вас должен быть URL на стороне сервера, чтобы упаковать информацию для передачи в формате XML. (Это может быть через скрипт CGI / PHP или что-то еще). Вы передаете XML в теле сообщения - так что его легко читать и отлаживать с помощью стандартного веб-браузера.

  2. Используйте стандартные методы iPhone NSXMLParser, чтобы проанализировать отдельные поля данных из документа XML и записать их обратно в базу данных. Этот метод предназначен для извлечения данных с URL-адреса и для их анализа в одном вызове, например:

NSURL *xmlURL = [NSURL URLWithString:@"http://www.example.com/livefeed.cgi"];
NSXMLParser *myParser = [[NSXMLParser alloc] initWithContentsOfURL:xmlURL];
  1. Пройдите по иерархии данных с помощью методов NSXMLParser и соответственно заполните свою базу данных.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...