Наверное, вам WWDC’13 уже все уши прожужжали, но потерпите ещё немного. Теперь моя очередь. Два нововведения, которые представили на вступительном мероприятии конференции для разработчиков, практически не были освещены. Вернее, одному из них, iWork for iCloud уделили немного внимания, а iCloud Keychain обошли стороной.

Вкратце, напомню, что iWork for iCloud — это, фактически, офисный пакет, сродни Google Docs, доступ к которому можно будет получить не только с iPhone, iPad, iPod Touch или Mac, но и из браузера. iWork for iCloud поддерживается Safari, Internet Explorer и Google Ghrome.

Как я понимаю, если у вас есть установленные на выше указанных устройствах Pages, Numbers и Keynote, то вы работаете с ними, а если нет, вам достаточно добраться до любого компьютера, войти в iCloud со своим Apple ID и можно продолжать работу. Практично. Я сам пользуюсь iWork, поэтому концепция офисного пакета в облаках мне кажется крайне удобной.

Второе нововведение — это iCloud Keychain. Небольшое лирическое отступление. Если кто-то из вас помнит, во время существования MobileMe была возможность синхронизировать связку ключей с вашими паролями, сертификатами и персональными данными через этот сервис. После того, как появился iCloud, эту лавочку без лишнего шума и пыли прикрыли.

Спустя два года такую возможность вернули в лице iCloud Keychain. Помимо логинов, паролей и сертификатов можно ещё хранить данные платёжных карт. Синхронизация работает не только между компьютерами, но и между iOS устройствами. Функциональность встроенная и совершенно бесплатная. Думаю, что на WWDC’13 парни из AgileBits нервно затопали ножкой.

Но речь не об этом. В данный момент я бы хотел поговорить об iCloud. Это именно то, что связывает OS X и iOS, фактически краеугольный камень в экосистеме Apple. iCloud позволяет хранить и синхронизировать пользовательские данные между устройствами. И это очень удобно.

Например, вы пользуетесь приложением для учёта финансов, которое имеет версии для iPad, iPhone и Mac. Купили что-то, внесли запись об этом в приложение на iPhone и все. По возвращении домой открыли программу на Mac и все внесённые на телефоне данные уже тут как тут. Здорово, ведь правда?

Но, к сожалению, пока это утопия. Я могу поделиться своей печальной историей использования приложения Money от копании Jumsoft. Пользовался программой на протяжении двух лет. У них всегда были какие-то проблемы с синхронизацией пользовательских данных. Но почти всегда мне из-за предосторожностей и каких-то костылей удавалось избежать полной потери своих данных.

Но когда парни из Jumsoft решили внедрить в свою программу поддержку iCloud начался какой-то кошмар. Каждая синхронизация (автоматическая) привносила какие-то новые записи или удаляла их за текущий день. Одним словом, через неделю моё терпение кончилось я и решил, что с меня довольно.

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

Дело в том, что подавляющее большинство приложений под iOS и OS X хранят свои данные ввиде SQLite базах данных. Эти базы данных синхронизируются через iCloud посредством механизма Core Data. И вот в нем-то и проблема. В упрощённом виде она показана на видео ниже.

Разработчики Jumsoft не единственные, кто стал жертвой проблем с синхронизацией. Майкл Гёбель (Michael Göbel) написал в своём блоге о том, что он потратил кучу времени на протяжении двух лет для того, чтобы заставить свои приложения работать. Стив Стреза (Steve Streza) в своём блоге рассказал о превратностях работы с iCloud.

Более удачливыми оказались разработчики приложений Clear и Day One. Они просто отказались от поддержки Core Data и реализовали синхронизацию в iCloud на основе отдельных файлов-документов. Этот метод работает стабильно и безотказно. Apple же молчит и не подаёт никаких признаков того, что она предпринимает какие-то шаги в отношении решения более чем очевидной проблемы.

Так вот, в свете WWDC’13 и презентации iCloud Keychain у меня назревает вопрос: решена ли проблема с Core Data? Ведь, по сути своей, файл Keychain представляет собой SQLite базу данных с зашифрованными данными пользователя. А если так, то синхронизироваться она должна при помощи тех же механизмов, с которыми не удалось совладать опытным cocoa-разработчикам. Посмотрим, получится ли это у Apple.

Сергій Макаренко

Сертифікований спеціаліст Apple, маю широке коло інтересів, багато читаю (книжок у тому числі). Більше про мене можна прочитати в моєму особистому блозі. Окрім цього ви можете переглянути мій профіль в Google+.

Материалы

Нашел ошибку в тексте? Выдели ее и нажми Ctrl + Enter
  • apats

    мне кажется предназначение Keychain и CoreData автору не ясны до конца.
    Напирмер, есть приложение для списка покупок, в нем есть возможность ввести свой логин-пароль и получить доступ к своим спискам. Так же есть веб-сайт, где так же при помощи логина-пароля можно получить доступ к своим спискам.
    Так вот. Если авторизироваться на сайте с десктопа, то на телефонепланшете уже не нужно будет заполнять поля логин-пароль, они подтянутся с помощью iCloud Keychain. А если на телефоне добавить новые пункты в конкретный список покупок, то они сохранятся в CoreData и через iCloud синхронизируются на планшете.

    Т.е. Keychain хранил логиныпаролисертификаты, а CoreData хранит данные приложения — таблицы, данные заполненых полей и т.д.

    • Автор как раз все правильно написал.
      CoreData — это механизм хранения, которым может пользоваться (а может и не пользоваться) iCloud Keychain и любое другое приложение с поддержкой iCloud.

      • apats

        только автор надеется на решение проблемы синхронизации CoreData, а ее ведь даже не трогали)
        Keychain сможет сохранить пароли, но ни как не данные между приложениями.

      • Данные — это, в том числе, и пароли.
        Логично, что на открывающем конференцию докладе не было глубоко технических подробностей. Но поскольку Apple объявила о iCloud Keychain — то проблема с CoreData либо решена, либо у Apple есть способ ее обойти.

  • KirkFawkes

    О чём, собственно, пост? Keychain, вероятней всего, использует Core Data для хранения данных, который в свою очередь использует SQLite базу для работы. iCloud же выступает в роли dropbox’a. Естественно что если один и тот же файл изменится сразу на двух устройствах, то это создаст большие проблемы с синхронизацией.

    Для обхода этого, первое что приходит на ум — Core Data позволяет использовать несколько источников данных (NSPersistentStore), соответственно на каждом устройстве можно просто создавать базу с названием «keychain-.sqlite», а остальные базы («keychain-*.sqlite»), которые лежать в iCloud’e, подключать в режиме только для чтения и при их изменении просто перегружать базу. Другими словами, каждое устройство может изменять только тот файл с куском базы, который был создан на нём, а остальная часть базы будет только для чтения. Конечно, в таком случае возникает проблема с удалением и обновлением уже существующих записей… но, при большом желании, и это можно решить. Имхо проблема несколько надумана.