iPhone автономное приложение с синхронизацией - PullRequest
28 голосов
/ 27 марта 2009

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

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

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

Ответы [ 6 ]

16 голосов
/ 14 апреля 2009

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

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

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

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

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

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

Хорошая особенность использования NSOperationQueue и NSOperation заключается в том, что они обрабатывают фоновую многопоточность для вас, поэтому я настоятельно рекомендую взглянуть на документы Apple для этих классов, а также на руководство по apple *1018*.

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

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

14 голосов
/ 27 марта 2009

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

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

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

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

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

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

4 голосов
/ 13 апреля 2009

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

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

2 голосов
/ 13 апреля 2009

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

2 голосов
/ 27 марта 2009

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

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

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

1 голос
/ 18 марта 2012

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

  • двусторонний
  • односторонний клиент
  • одностороннее устройство
  • 1010 * Bootup *

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...