2009-03-27 2 views
27

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

Каковы хорошие инструменты для чтения и начала думать о планировании автономных операций с синхронизацией для вашего iPhone?

Какие инструменты мне нужно создавать самостоятельно, а также инструменты, которые уже предусмотрено яблоком для этой конкретной проблемы?

+3

Я второй этот вопрос, и добавить, что я хотел бы услышать о стратегиях слияния данные вне синхронизации. Обращение к серверу на синхронизацию не вызывает затруднений. Жесткая часть - это выяснить, как объединить данные сервера с локальными данными. – Alex

ответ

14

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

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

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

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

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

в iphone os 3.0 apple предлагает услуги push - где вы можете просто «PUSH» ваши данные вместо того, чтобы делать «PULL», однако это недоступно в текущем iPhone OS (2.xx)

+0

В случае нескольких устройств вы получаете требование репликации главного мастера. Удостоверьтесь, что вы учитываете конфликты. Подумайте об использовании GUID, чтобы избежать столкновений с идентификаторами новых записей. – jchook

2

Я бы сохранил всю информацию, которую я собираю, находясь в автономном режиме в базе данных SQLite. Затем, по просьбе пользователя, вы можете СИНХРОНИРОВАТЬ всю сохраненную информацию с сервера с помощью HTTP или настраиваемого протокола TCP/IP, с которым вы можете столкнуться.

Я использую этот подход в приложениях Palm OS уже почти 10 лет, и они работают очень эффективно.

Насколько я знаю, единственным «инструментом», который вам нужно будет выполнить, является простой старый объект OBJECTIVE-C с Touch Cocoa. Хотя вы можете использовать некоторые библиотеки TCP/IP C++, которые облегчат вам жизнь, если вы решите реализовать свой собственный протокол.

+0

Пожалуйста, не перечитайте «Objective-C». –

4

Push, вероятно, не является жизнеспособным вариантом здесь, так как объем данных, которые вы можете нажимать, является незначительным и в основном возвращается, чтобы «сказать моему приложению, чтобы сделать вызов сервера». Мы используем онлайн-модель в Satchel. Всякий раз, когда нам приходится общаться с сервером, мы связываем это сообщение (URL и, возможно, некоторые данные POST) и храним его в базе данных. Если мы в сети, мы вытаскиваем его обратно, отправляем его, и когда мы получаем правильный ответ, мы удаляем запись из базы данных. Если мы в автономном режиме, эти строки создаются, и в следующий раз, когда мы в сети, они будут отправлены. Это не работоспособная модель во всех ситуациях, но она может быть адаптирована к большинству.

В 3.0 у вас есть доступ к CoreData, который является отличным инструментом управления данными. Кроме того, семья NSURLXXX - ваш друг.

3

http://blog.webscale.co.in/?p=159 В этой статье перечислены подходы к обработке автономной/онлайн-синхронизации данных. Он может помочь вам, если вы хотите создать свою собственную инфраструктуру.

+1

Страница не найдена –

16

Я работаю над приложением, которое обрабатывает это точное поведение в течение последних двух месяцев или около того. Он имеет небольшое подмножество функций, которые доступны только в Интернете, и большой набор функций, которые находятся в автономном режиме/онлайн.

Я использую sqlite для локального хранилища, как предлагается здесь, с модифицированной версией библиотеки sqlitepersistentobjects. Базовая версия sqlitepersistentobjects не является потокобезопасной, поэтому следите, если вы ее используете. (ознакомьтесь с objectiverecord в: objectivesync для альтернативы поточной безопасностью, но будьте готовы копаться в коде). Если вы захотите разработать для 3.0 sdk, то основные данные - это еще одна возможность для библиотеки sqlite.

Общая архитектура достаточно проста. Я смоделировал локальное хранилище с использованием sqlite и удаленного взаимодействия, используя objective resource против приложения rails и REST api. Он может использовать xml или json для сериализации данных.

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

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

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

Приятная вещь в использовании NSOperationQueue и NSOperation заключается в том, что они обрабатывают фоновый поток для вас, поэтому я настоятельно рекомендую взглянуть на документы яблока для этих классов, а также на apple threading guide.

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

Это краткий обзор того, с чем мне пришлось иметь дело до сих пор ... надеюсь, что это поможет немного.

1

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

  • двухсторонней
  • одностороннюю клиент
  • односторонний устройство
  • начального пуск

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

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

Вот ссылка на проект с открытым исходным кодом: http://openmobster.googlecode.com

Вот ссылка на iPhone App Sync,: http://code.google.com/p/openmobster/wiki/iPhoneSyncApp

Смежные вопросы