Bt-teh.ru

БТ Тех
0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Построить службу синхронизации для android / ios

Построить службу синхронизации для android / ios?

В настоящее время я создаю приложение для android/ios. Это приложение написано на языке C++/QML и подключается через PHP к серверу базы данных MySQL.

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

Мой вопрос заключается в том, является ли это лучшим подходом и возможно ли вообще написать такой сервис (с необходимыми правами для запуска с boot) для android/ios в соответствии с их политикой?

Я уже много читал об этом предмете, но есть много противоречивых ответов. Вот почему я сейчас немного растерян.

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

2 ответа

  • Альтернативы iCloud + Core Data для синхронизации данных между iOS и OS X

Я разрабатываю приложение для iOS / OS X и хочу синхронизировать данные между ними. на данный момент я использую Core Data для постоянных данных. Я читал, что iCloud недостаточно зрел для использования с core data. Это правда ? поэтому я стараюсь использовать новые DropBox API синхронизации(для.

Я хочу создать службу windows для синхронизации местоположения удаленной папки с локальной PC. удаленная папка находится в форме web URL и может получить доступ через HTTP REST . Может ли кто-нибудь подсказать мне, как это реализовать? Спасибо

Вы, конечно, не можете сделать это на iOS. Существует режим ‘background fetch’, который позволит вашему приложению периодически получать обновления, но для этого приложение должно быть запущено, т. Е. Активно запущено пользователем.

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

Ответы противоречат друг другу, потому что на iOS и Android все работает по-разному (к сожалению).

На Android вы можете написать службу, заставить ее работать независимо от приложения и даже запустить ее в boot раз.

Однако на iOS вы не можете написать службу, которая работает независимо от вашего приложения (если только вы не сделаете джейлбрейк). Apple предоставит вашему приложению фоновое CPU время для выполнения определенных задач, таких как VOIP, GPS выборки и даже фоновая выборка, но у вас нет такого контроля, который вы имели бы над своим собственным сервисом.

Мне пришлось создать приложение для Android и iOS, которое опиралось на что-то вроде фоновой службы, и эти разные парадигмы были серьезным препятствием.

EDIT

Вот скриншот фоновых режимов , поддерживаемых на iOS 8.2 (текущая версия на момент этого ответа):

enter image description here

EDIT 2

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

Похожие вопросы:

Я пытаюсь начать использовать React-Native для некоторых моих мобильных разработок. Большая часть этого кажется очень прямолинейной из React-Native документов на Github, но я не могу получить.

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

мне нужны методы или решения, которые позволяют моему приложению iOS соответствовать моему приложению Android для выполнения этого списка услуг 1-фоновая служба, которая запускается каждые 30.

Я разрабатываю приложение для iOS / OS X и хочу синхронизировать данные между ними. на данный момент я использую Core Data для постоянных данных. Я читал, что iCloud недостаточно зрел для.

Я хочу создать службу windows для синхронизации местоположения удаленной папки с локальной PC. удаленная папка находится в форме web URL и может получить доступ через HTTP REST . Может ли кто-нибудь.

Раньше я разрабатывал компонент в качестве функции синхронизации данных. Теперь я хочу изменить его как сервис android . Но эта функция должна использовать переменную активности . Я не могу добавить.

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

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

Я внимательно прочитал документы разработки, примеры кода и SO связанных Q&A, похоже, что Google Drive Android SDK не включает в себя никаких функций для автоматической синхронизации локальных.

Я хочу создать службу, которая работает в фоновом режиме, даже если мое приложение закрывается для синхронизации данных Sqlite и mysql. я пробовал некоторые методы, но не смог достичь своей цели.

Почему ContentResolver.requestSync не запускает синхронизацию?

Я пытаюсь реализовать шаблон адаптера Content-Provider-Sync, как обсуждалось на Google IO — слайд 26. Мой поставщик контента работает, и моя синхронизация работает, когда я запускаю его из приложения Dev Tools Sync Tester, но когда я вызываю ContentResolver. requestSync (account, author, bundle) от моего ContentProvider, моя синхронизация никогда не запускается.

Изменить — добавлен фрагмент манифеста Мой XML-манифест содержит:

Читать еще:  Как синхронизировать контакты из вконтакте для айфона

Мой файл syncadapter.xml, связанный с моей службой синхронизации, содержит:

Не уверен, какой еще код будет полезен. Учетная запись, переданная в requestSync, имеет «myaccounttype», а АВТОРИТЕТ, переданный вызову, соответствует моему адаптеру syc xml.

Является ли ContentResolver.requestSync правильным способом запроса синхронизации? Похоже, что инструмент тестирования синхронизации напрямую связывается со службой, и вызовы запускают синхронизацию, но похоже, что это противоречит цели интеграции с архитектурой синхронизации.

Если это правильный способ запросить синхронизацию, то почему тестер синхронизации должен работать, но не мой вызов ContentResolver.requestSync? Есть ли что-то, что мне нужно передать в комплекте?

Тестирую в эмуляторе на устройствах 2.1 и 2.2.

Вызов requestSync() будет работать только для пары , которая известна системе. Ваше приложение должно пройти ряд шагов, чтобы сообщить Android, что вы можете синхронизировать определенный тип контента с помощью определенного типа учетной записи. Это делается в AndroidManifest.

1. Сообщите Android, что пакет вашего приложения обеспечивает синхронизацию.

Во-первых, в AndroidManifest.xml вы должны объявить, что у вас есть служба синхронизации:

Атрибут name <service> тега — это имя вашего класса для подключения к синхронизации . Я поговорю об этом через секунду.

Установка exported true делает его видимым для других компонентов (необходимо, чтобы ContentResolver можно было его назвать).

Фильтр намерения позволяет ему улавливать намерение, запрашивающее синхронизацию. (Это Intent происходит, ContentResolver когда вы вызываете ContentResolver.requestSync() или связанные с ним методы планирования.)

О <meta-data> теге речь пойдет ниже.

2. Предоставьте Android сервис для поиска вашего SyncAdapter.

Итак, сам класс . Вот пример:

Ваш класс должен расширять Service или один из его подклассов, должен реализовывать public IBinder onBind(Intent) и должен возвращать SyncAdapterBinder при его вызове . Вам нужна переменная типа AbstractThreadedSyncAdapter . Как видите, это почти все в этом классе. Единственная причина, по которой он существует, — предоставить Сервис, который предлагает стандартный интерфейс для Android для запроса вашего класса о том, что вы из SyncAdapter себя представляете.

3. Обеспечьте class SyncAdapter фактическое выполнение синхронизации.

mySyncAdapter — это место, где хранится сама реальная логика синхронизации. Его onPerformSync() метод вызывается, когда приходит время для синхронизации. Я полагаю, у вас это уже есть.

4. Установите связь между Account-type и Content Authority.

Еще раз оглядываясь на AndroidManifest, этот странный <meta-data> тег в нашем сервисе является ключевым элементом, который устанавливает связь между ContentAuthority и учетной записью. Он ссылается извне на другой XML-файл (назовите его как хотите, что-нибудь относящееся к вашему приложению). Давайте посмотрим на sync_myapp.xml:

Хорошо, так что это делает? Он сообщает Android, что определенный нами адаптер синхронизации (класс, который был вызван в элементе имени <service> тега, который включает <meta-data> тег, который ссылается на этот файл . ) будет синхронизировать контакты с использованием учетной записи в стиле com.google.

Все ваши строки contentAuthority должны совпадать и соответствовать тому, что вы синхронизируете — это должна быть строка, которую вы определяете, если вы создаете свою собственную базу данных, или вы должны использовать некоторые существующие строки устройства, если вы синхронизируете известные типы данных (например, контакты, события календаря или что-то еще.) Вышеупомянутое («com.android.contacts») оказывается строкой ContentAuthority для данных типа контактов (сюрприз, сюрприз).

accountType также должен соответствовать одному из тех известных типов учетных записей, которые уже введены, или он должен соответствовать тому, который вы создаете (это включает создание подкласса AccountAuthenticator для аутентификации на вашем сервере . Сама стоит статья). Опять же, com.google — это определенная строка, определяющая . учетные данные учетной записи в стиле google.com (опять же, это не должно быть сюрпризом).

5. Включите синхронизацию для данной пары «Аккаунт / ContentAuthority».

Наконец, необходимо включить синхронизацию. Вы можете сделать это на странице «Аккаунты и синхронизация» на панели управления, перейдя в свое приложение и установив флажок рядом с вашим приложением в соответствующей учетной записи. В качестве альтернативы вы можете сделать это в некотором установочном коде в вашем приложении:

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

Если синхронизация вашего аккаунта / полномочий или глобальная синхронизация отключены, вызов RequestSync () имеет эффект — он устанавливает флаг, что синхронизация была запрошена, и будет выполнена, как только синхронизация будет включена.

Кроме того, для mgv установка значения ContentResolver.SYNC_EXTRAS_MANUAL true в дополнительном пакете вашего requestSync попросит Android принудительно выполнить синхронизацию, даже если глобальная синхронизация отключена (уважайте своего пользователя здесь!)

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

6. Учитывайте последствия использования нескольких аккаунтов.

Возможно иметь несколько учетных записей одного и того же типа (две учетные записи @ gmail.com, настроенные на одном устройстве или две учетные записи facebook, или две учетные записи twitter и т. Д.). Вы должны учитывать последствия этого для приложения. .. Если у вас есть две учетные записи, вы, вероятно, не хотите пытаться синхронизировать их обе с одними и теми же таблицами базы данных. Возможно, вам нужно указать, что только один может быть активным одновременно, и очистить таблицы и выполнить повторную синхронизацию при переключении учетных записей. (через страницу свойств, которая запрашивает, какие учетные записи присутствуют). Возможно, вы создаете отдельную базу данных для каждой учетной записи, может быть, разные таблицы, может быть, ключевой столбец в каждой таблице. Все приложения специфичны и заслуживают некоторого размышления. ContentResolver.setIsSyncable(Account account, String authority, int syncable) может быть здесь интересно. setSyncAutomatically() контролирует ли помощница счета / орган проверил илиunchecked , в то время как setIsSyncable() предоставляет способ снять флажок и выделить строку серым цветом, чтобы пользователь не мог ее включить. Вы можете установить одну учетную запись синхронизируемой, а другую — не синхронизируемой (dsabled).

Читать еще:  Отключить синхронизацию контактов iphone с icloud как отключить

7. Помните о ContentResolver.notifyChange ().

Одна хитрость. ContentResolver.notifyChange() — это функция, используемая ContentProvider s для уведомления Android об изменении локальной базы данных. Это выполняет две функции: во-первых, это приведет к обновлению курсоров, следующих за этим uri содержимого, и, в свою очередь, запрашивает, аннулирует и перерисовывает и ListView т. Д. Это очень волшебно, база данных изменяется, а ваши ListView просто обновляются автоматически. Потрясающие. Кроме того, при изменении базы данных Android запросит синхронизацию для вас, даже вне вашего обычного расписания, чтобы эти изменения были сняты с устройства и синхронизированы с сервером как можно быстрее. Также круто.

Однако есть один крайний случай. Если вы возьмете с сервера и загрузите обновление в ContentProvider , он послушно вызовет notifyChange() и андроид скажет: «О, изменения базы данных, лучше поместите их на сервер!» (Дох!) Хорошо написанный ContentProviders будет иметь несколько тестов, чтобы увидеть, пришли ли изменения из сети или от пользователя, и в этом случае установит логический syncToNetwork флаг false, чтобы предотвратить эту расточительную двойную синхронизацию. Если вы вводите данные в ContentProvider файл, вам следует выяснить, как заставить это работать — иначе вы всегда будете выполнять две синхронизации, когда требуется только одна.

8. Будьте счастливы!

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

Служба синхронизации в андроид

Решение проблем с Android синхронизацией

1. При попытке соединения Android с ПК возникает Ошибка соединения.

Android_sync_error1

Причиной данной ошибки является неверно указанный IP адрес или порт, либо EssentialPIM блокируется фаерволом.

1. Убедитесь, что вы внимательно следовали инструкциям по настройке и установке Android синхронизации.

2. Убедитесь, что вы используете последнюю Windows версию EssentialPIM. Проверить наличие доступных обновлений можно через меню Справка -> Проверить обновление .

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

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

5. Попробуйте функцию ручного соединения. Находясь в разделе СинхроПК, вызовите меню приложения и выберите пункт Ручное соединение и введите IP адрес и порт, предлагаемые Windows версией EssentialPIM.

2. Android EssentialPIM не видит ПК с запущенной Windows версией.

Android_sync_error2

1. Убедитесь, что Windows версия EssentialPIM запущена (очень часто пользователи просто забывают загрузить Windows версию перед синхронизацией).

2. Если это первая попытка синхронизации, то в Windows версии должен быть запущен мастер установки синхронизации и он должен быть на этапе сопряжения устройств. Если устройства были сопряжены ранее и это не первая синхронизация, то запуск мастера не требуется, достаточно только запущенной Windows версии EssentialPIM.

3. Попробуйте несколько раз нажать кнопку сканирования.

4. Попробуйте увеличить время сканирования зайдя в Меню -> Настройки -> СинхроПК . Мы рекомендуем установить максимальное значение. Если это решит проблему, то постепенно уменьшайте значение пока не достигните оптимального сочетания времени ожидания и стабильности соединения.

5. Убедитесь, что ПК и мобильное устройство находятся в одной Wi-Fi сети. Если это не возможно по какой-либо причине, перейдите к следующему пункту.

6. Если ничего из вышеперечисленного не помогло, попробуйте альтернативные варианты соединения, такие как соединение по USB, Bluetooth, мобильный интернет, мобильная точка доступа Wi-Fi.

Если всё равно ничего не помогает, обратитесь, пожалуйста, в нашу службу поддержки.

Особенности синхронизации в Android-приложении

image

При разработке многих Android-приложений требуется организовать процесс синхронизации данных с данными на сервере. Есть два основных способа как данную синхронизацию можно реализовать.
Первый способ — классический (наиболее популярный и наиболее простой) — с помощью AlarmManager и Service. Например, как описано в этой статье.
Второй способ — «правильный» (но пока что, видимо, редко кем используемый) — с помощью SyncAdapter.

Разрабатывая своё приложение, изначально я попытался реализовать «правильный» (т.е. второй способ).

О том, как его реализовать — чуть ниже. Расскажу сначала о том, с какими сложностями и особенностями я столкнулся при его реализации.

Особенности реализации синхронизации с помощью SyncAdapter

Прежде всего — данный метод достаточно плохо описан в документации. Хотя на сайте разработчиков Android и есть пример реализации, более хорошим примером (с пояснениями) будет статья по этой ссылке.

Для работы данного способа синхронизации необходимо создание отдельного типа эккаунта специально для Вашего предложения (если существующие эккаунты, например, эккаунты Google не подходят), а это — тема для отдельной статьи (пример можно посмотреть, например, тут).
Данный эккаунт будет доступен в разделе Settings / Accounts & Sync. Создание (и удаление) эккаунта будет возможным не только из Вашего приложения, но и из этого раздела. В нем можно создать несколько эккаунтов для Вашего приложения (нужно ли это Вашему приложению?). Для каждого эккаунта нужно имя (для OAuth-эккаунтов приходится использовать выдуманные имена).
При этом неправильно написанный код эккаунта перезагружает как устройство, так и эмулятор — тестировать сложно. При этом, если Вы создали лишь код, отвечающий за эккаунт, и хотите его протестировать, то не выйдет — без полностью написанного кода SyncAdapter‘a устройство будет перезагружаться при входе в Accounts & Sync.
Как быть если Вашему процессу синхронизации не нужен эккаунт? Придется создавать dummy-эккаунт.

Читать еще:  Как синхронизировать смарт тв самсунг с телефоном

Если Ваше приложение будет синхронизировать данные с существующими базами — контактами телефона, событиями календаря или, например, фотографиями, то тут все проще (и большинство примеров в сети именно про такой тип синхронизации). Если же синхронизация будет производиться со своими данными, то необходимо, чтоб был создан свой ContentProvider.
Как быть, если Ваше приложение не хочет делиться своей базой с другими приложениями? Придется создавать dummy-ContentProvider, например, такой.

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

Если синхронизацию нужно запустить вручную, то для этого есть функция requestSync(), ниже будет написано об ограничениях функции. Если нужно запускать синхронизацию автоматически, то для этого есть другая функция — addPeriodicSync(). Хотя работает она лишь на Android 2.2 или выше. Но работает данная функция отлично — например, если в момент синхронизации нет интернет-соединения, то синхронизация произойдет автоматически в тот момент, когда оно появится.

Как реализовать синхронизацию с помощью SyncAdapter‘а

Что же требуется сделать для реализации синхронизации с помощью SyncAdapter? (перевод ответа c StackOverflow)

1. Уведомить Android, что приложение поддерживает синхронизацию

Для этого в AndroidManifest.xml необходимо указать сервис синхронизации:

где name — имя, соответствующее имени класса для синхронизации (об этом — чуть ниже); exported — делает сервис доступным другим компонентам (в т.ч. и ContentResolver, который используется для взаимодействия с сервисом синхронизации); intent-filter позволяет перехватывать событие, требующее синхронизацию (возникает, например, когда синхронизация запрошена функцией RequestSync() Вашего ContentResolver‘a).

2. Создать сервис (службу) для нахождения SyncAdapter‘a

Ваш класс должен расширять Service, в нем должна быть переменная экземпляра AbstractThreadedSyncAdapter. Он должен реализовывать public IBinder onBind(Intent) и должен возвращать SyncAdapterBinder.
Достаточно многое должно быть реализовано в этом классе, т.к. данный сервис предоставляет стандартный интерфейс для SyncAdapter Android’a.

3. Создать класс SyncAdapter для непосредственного осуществления синхронизации

mySyncAdapter — место, где содержится сама логика синхронизации. Когда приходит время синхронизации, вызывается onPerformSync().

4. Осуществить связывание (binding) между типом эккаунта и Content Authority

В пункте 1, в файле AndroidManifest.xml, в поле name мы указали значение, которую и образует связь между ContentAuthority и эккаунтом. AndroidManifest.xml ссылается на другой xml-файл. В нашем примере это sync_myapp.xml:

Данный файл сообщает Android’у, что созданный нами SyncAdapter будет синхронизировать контакты.

Все значения строк в contentAuthority должны совпадать со значениями того, с чем будет происходить синхронизация. Если синхронизация будет происходить с Вашей собственной базой, то с Вашим значением. Если с какими-либо существующими базами (например, с контактами или событиями календаря), то со стандартными значениями. Например, указанное выше значение «com.android.contacts» идентифицирует стандартные контакты.

Значение accountType также должно совпадать либо с Вашим значением, либо со стандартным значением. Если Вы создаете свой собственный тип эккаунта, то Вам потребуется создать и подкласс AccountAuthenticator, чтобы осуществлять авторизацию на Вашем сервере (см. уже указанную выше статью). Указанное в нашем примере значение «com.google» идентифицирует, что мы используем Google-эккаунт.

5. Включение синхронизации для созданной пары AccountContentAuthority

Наконец, можно включить процесс синхронизации. Это можно сделать либо в разделе Settings / Accounts & Sync, либо программно в Вашем приложении:

Для осуществления синхронизации она должна быть разрешена не только для Вашего приложения — необходимо глобальное разрешение на синхронизацию (в разделе Settings / Accounts & Sync должна быть проставлена соответствующая галка).
Если одно из этих условий не выполнено, то вызов RequestSync() ни к чему немедленно не приведет, запрошенная синхронизация однако будет выполнена позднее — как только синхронизация будет включена. Хотя, существует способ это обойти.

Дополнительно, можно включить периодические автоматические синхронизации.

Выводы

И так, чем же хороша (+) и плоха (-) синхронизация с помощью SyncAdapter по сравнению с ASyncTask?

(+) следование стандартам (Ваше приложение в списке всех синхронизирующихся приложений)
(+) поддержка нескольких эккаунтов
(+) простота реализации автоматических синхронизаций (когда остальное все уже написано)
(+) автоматическая синхронизация при появлении интернет-соединения
(+) удобство в синхронизации со стандартными базами (контакты, календарь и т.п.)
(-) необходимость создания эккаунта
(-) отсутствие полноценной документации
(-) сложность реализации и тестирования
(-) необходимость в Android 2.2 и выше для автоматических периодических синхронизаций
(-) необходимость создания своего ContentProvider’a

Итого, я выбрал ASyncTask для синхронизации в своем приложении (хотя код для SyncAdapter был уже почти полностью написан) — прежде всего, не хотелось ограничиваться версией 2.2 Android.

голоса
Рейтинг статьи
Ссылка на основную публикацию
ВсеИнструменты
Adblock
detector