Пишем библиотеку для запроса оценки в AppStore
👋 Всем привет. Меня зовут Алексей Межевикин. Я iOS-разработчик c 2011 года. Последнии 4 года занимаюсь разработкой, монетизацией и продвижением своих приложений.
В продвижении очень важную роль играет рейтинг приложения в AppStore. Рейтинг формируется исходя из оценок пользователей оставленных либо непосредственно в AppStore либо через специальное окошко, которое вызывается внутри приложения.
В этой статье я предлагаю написать крошечную библиотеку для удобного запроса оценки. По сути, это будет обертка над нативным SKStoreReviewController, которая будет запрашивать отзыв через энное количество запусков, либо энное количество дней после установки.
Немного теории
В iOS есть специальный инструмент для запроса оценки у пользователя. Называется он SKStoreReviewController и доступен начиная с iOS 10.3.
Не смотря на то, что класс называется контроллером это не контроллер в классическом понимании, а по сути обертка над ним. Мы не имеем прямого доступа и не можем его презентовать самостоятельно а только лишь можем запросить его показ через статический метод SKStoreReviewController.requestReview(). При этом вызов метода requestReview не гарантирует показа контроллера. Так как показ возможен только три раза в год, при условии что изменилась версия приложения и пользователь не отключил запрос оценки в настройках iOS.
Поэтому очень важно не потратить заветные три попытки впустую. Для этого давайте напишем небольшую обертку которая возьмет контроль на себя и избавит нас от этой головной боли.
Приступим к коду
Первым делом создадим класс и напишем метод самого запроса. Начиная с iOS 14 метод requestReview запрашивается с передачей текущей сцены. Поэтому используем конструкцию available для проверки версии iOS. Так как метод может быть вызван до создания сцены, например в applicationDidFinishLaunchingWithOptions() , то вызываем весь код с задержкой в 1 секунду.
Теперь давайте добавим инициализатор и два свойства.
minLaunches — минимальное количество запусков после которого можно показать запрос.
minDays — минимальное количество дней после которого можно показать запрос.
Для хранения информации о количестве запусков, дате первого запуска а так же дате последнего запроса создадим 4 свойства. Значения будем хранить в UserDefaults.
Теперь нам нужно посчитать количество дней после первого запуска приложения и количество дней после последнего запроса оценки. Напишем функцию для этого, а подсчет вынесем в отдельные свойства.
Давайте создадим свойство isNeeded которое будет решать нужно ли запрашивать оценку сейчас или нет.
И финальный штрих это метод requestIfNeeded() который мы будем непосредственно использовать. А метод request() который мы написали в первом шаге мы сделаем приватным от греха подальше.
Добавим немного синтаксического сахарку.
Чтобы можно было делать так:
Иногда, возникает необходимость делать запрос оценки после какого-либо действия пользователя, например после того как пользовать купил подписку. Для этого делаем так:
Так как minLaunches и minDays по умолчанию равны нулю то isNeeded будет проверять только то что после последнего запроса прошло 125 дней и изменилась версия приложения.
Завершение
Теперь собираем весь код приведенный выше в единое целое и публикуем его на GitHub. Получилось всего 100 строк кода.
Библиотеку можно использовать как в виде SPM пакета:
Так и в виде CocoaPods зависимости:
👏На этом все. Надеюсь библиотека кому-нибудь пригодится. Все предложения и замечания принимаются как виде комментов так и в виде пуллреквестов на GitHub.
Привет коллега! Думаю, что фамилия знакомая... По твоей апке готовился к сдаче теории в ГИБДД =)
Привет, Виталий. Приятно слышать :)