Приложение СПС «Право.ru» для iOS — сложности разработки и пути их решения

    В мае 2010 года мы выпустили первый мобильный клиент справочно-правовой системы «Право.ru» для устройств на платформе iOS. На тот момент это было первое приложение, предоставляющее доступ к нормативным актам и иным официальным документам РФ. В декабре 2010 появилось приложение для iPad. Так и сегодня СПС «Право.ru» для iOS является лидером по количеству установок среди справочно-правовых систем. sofbix рассказал историю создания приложения, описал проблемы, с которыми столкнулся, и пути их решения.

    Разработка


    В процессе реализации СПС «Право.ru» для iOS мы столкнулись с некоторыми сложностями. Первая была в том, что СПС представлена большой базой документов, хранение которых на устройстве затруднительно. Может оказаться так, что на устройстве недостаточно места. При этом операционная система освобождает ресурсы приложений (в том числе и нашего) преимущественно за счет очистки кеша. Однако, документы, обновленные с веба, должны сохраняться в памяти мобильного устройства. И мы нашли оптимальное решение, при котором открытии таких документов происходит из закешированных данных, однако загруженные с веба документы будут гарантированно сохранены на устройстве без потерь при чистки кеша.

    В чем же секрет? Как можно почистить кеш и при этом не потерять документы? Ответ в резервном копировании. Дело в том, что после каждого апдейта документов производится их автоматическое сохранение в zip файл (который «сжимает» текстовые данные до 10 раз). Zip сохраняется, и когда кеш будет очищен и понадобятся документы, хранимые локально, будет запущен механизм восстановления документов. Такая гибкая система позволяет оставлять данные на устройстве в сохранности, не захламля диск устройства.

    Для реализации сохранения в zip были опробованы различные обертки libz.dylib. Основным недостатком была работа через память без потокового сохранения. Нам не подошли они из-за большого размера выходного zip файла. СПС падала по причине быстрой «исчерпаемости» памяти. Пришлось взять библиотеку ZipArchive и реализовать в ней потоковое сохранение самостоятельно. Кроме того, мы добавили визуализацию прогресса выполнения сохранения через делегирование событий. Код можно взять тут.

    До прошлого года приложение СПС для iOS работало медленно с сетью. Это было заметно при открытие документов с сервера или при загрузке обновлений. Нам удалось увеличить скорость в несколько раз, при том что требования к памяти наоборот сократились. Протокол работы с веб-сервисами при этом остался неизменен, мы по-прежнему используем JSON, но перешли на другую библиотеку его парсинга.

    Всевозможные библиотеки сравниваются тут. Внедрение новой библиотеки JSONKit взамен старой SBJSON не составила никакого труда, потому что разработчики использовали шаблоны проектирования. Для того чтобы сделать программу независимой от используемых библиотек, мы использовали паттерн проектирования «Посредник» (Proxy). Его назначение в том, что он инкапсулирет в себе логику преобразования данных вообще с любого протокола, который задействован в веб-сервисе. А значит имеется возможность перейти на экономичный Protobuf, причем практически так же безболезненно.

    Еще один паттерн проектирования, обеспечивший масштабируемость СПС — Композитор (Compositor). На его основе мы написали механизм кеширования. Далее, предоставляя тот или иной наследник абстрактного класса кеширования (на данный момент у нас 8 реализаций) поставщику данных, мы могли получить тот или иной эффект. Например, документы отправляются в вытесняющую очередь хранилища и через 1 день становятся недействительными. Однако, если у пользователя нет возможности получить более свежие данные (отсутствует интернет-соединение), он благополучно получит их из недействительного кеша. Таким образом разработчики сделали гибкий механизм, позволяющий менять концепцию кеширования как у всего приложения, так и у отдельных частей в целом.

    Основные возможности приложения на сегодня:



    Региональное законодательство


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

    Быстрая навигация


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

    Судебная практика


    Укажите норму права, перейдите к связанным документам и отметьте интересующие инстанции и суды.

    Редакция документа


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

    Мы продолжаем поддерживать и развивать приложение, учитывая при этом пожелания и советы пользователей. Будем рады ответить на вопросы!
    Pravo.ru
    53,00
    Компания
    Поделиться публикацией

    Комментарии 18

      +2
      Неожиданно странная для Право.ру статья. Мария, не поверю, что Никита и его команда только сейчас узнали о паттернах.
      Упоминания паттернов ради упоминания паттернов? Да ещё и не совсем верное.

      потому что разработчики использовали шаблоны проектирования.

      Многие разработчики используют шаблоны проектирования. Но это не позволяет заменять одни решения на другие. Возможно речь об интерфейсах?

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

      Это не назначение паттерна прокси. Это всего лишь следствие его применения.

      Что за странные ссылки на непонятные файлообменники с сиськами? Почему нельзя было поставить ссылку на форк (неважно в кодегугле или гитхабе)? Если лицензия не позволяет, можно было бы выложить патч?
        0
        >> Многие разработчики используют шаблоны проектирования. Но это не позволяет заменять одни решения на другие. Возможно речь об интерфейсах?

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

        >> Это не назначение паттерна прокси. Это всего лишь следствие его применения.

        Согласен, у паттернов нет назначений, но мы легко находим им применение
          +1
          Внедрение новой библиотеки JSONKit взамен старой SBJSON не составила никакого труда, потому что разработчики использовали шаблоны проектирования.

          Многие разработчики используют шаблоны проектирования. Но это не позволяет заменять одни решения на другие. Возможно речь об интерфейсах?

          Речь о бизнеслогике.

          Причём тут бизнес-логика?
            –3
            Извините, конечно! В данном контесте речь конечно не о бизнеслогике, а о решении. Тоесть один парсер — одно решение, другой парсер или протокол — это другое решение. В данном контексте как раз таки паттерны позволили
            «Но это не позволяет заменять одни решения на другие. Возможно речь об интерфейсах?»
            так что еще как позволяет!
              +1
              Прошу прощения за фамильярность, Сергей, но кажется вы уже и сами запутались о чём вообще статья.
                0
                ну так хабр, на то и символика, давайте распутываться)
            +1
            Это не назначение паттерна прокси.

            Согласен, у паттернов нет назначений, но мы легко находим им применение


            Ок, Серёг, не будем обращать внимание на то, что ты согласился с утверждением, которое твой собеседник не высказывал. Но говорить, что у паттернов нет назначений — это уже за гранью добра и зла. Я просто не могу молчать.

            Большая часть используемых нами паттернов описаны в каталоге GoF «Паттерны проектирования» (иллюстрация к этому каталогу у нас в кабинете висит). Согласно этому каталогу, описание паттерна содержит следующую информацию: название и классификация, назначение, мотивация, применимость, структура, участники, отношения, результат, реализация и тп.
            Так вот, назначение Proxy — «Является суррогатом другого объекта и контролирует доступ к нему». (Паттерны проектирования, стр 203, Питер, 2010)
              0
              Кто-то очень любит цепляться к словам.
              Да, в этой книге очень хороший перевод, трудно не согласиться
          +1
          в статье 1% практической ценности взятой из википедии и 99% пиара. какова цель статьи?
            0
            Цель наша, да, пиар — какие мы крутые разработчики, создаем крутой продукт.
            Поделились опытом, тестами и исходниками.
            А вы тут какую цель преследуете? Можит мы вам не подходим по интересам?
            +3
            мы использовали паттерн проектирования «Посредник» (Proxy)

            ну вообще-то посредник — это Mediator. Они даже к разным группам относятся: медиатор — шаблон поведения, а прокси — структурный
              0
              Согласен: в данной задаче использовался Заместитель для того чтобы изолировать реализацию парсинга. А вот медиатор кстати скорее в задаче кеширования, для того чтобы подменить данные, загружаеммые с сервера локальными. Композитор используется на стыке взаимодействия поставщика данных и кешером с одним и тем же парсером/сериализатором.
              0
              Объясните каким образом использование zip архива предотвращает удаление данных из кеша? Ерунду какую то написали, если сохраняете в Documents, так и пишите, причем тут архивы?
                0
                Да, в Documents. В сохранности остаются файлы только там. Но если закешированные файлы вы попытаетесь сохранить сразу туда, то из Apple Store вероятней всего придет письмо, о том что не следует держать такое обилие файлов, вероятнее всего вам необходимо перевести все в cashes. Вот тут и приходит на выручку zip
                  0
                  Это Вас никак не выручает. iOS Data Storage Guidelines говорит, что в Documents нужно хранить только user-generated контент. Все что можно восстановить по сети нужно кидать в Caches. То, что Вы не получили реджект за zip в Documents скорее везение, чем правильное решение. Более того, в Apple придумали специальный аттрибут для файлов, который позволяет безопасно хранить их в Documents. Этот аттрибут запрещает синхронизацию файлов через iCloud, из-за которого собственно и нельзя хранить скачиваемый контент в Documents.
                0
                так программно иммено user и создает zip, так что проверку проходит легко. Атрибут запрета мы не выставляем, дабы можно было переносить документы на другое устройство
                  0
                  каким образом user создает zip? он вносит правки в ваши материалы? или все авторство со стороны юзера сводится к выбору какие статьи скачать?
                  0
                  ему предлагается произвести резервное копирование, он вправе отказаться.

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

                  Самое читаемое