Top.Mail.Ru
Подписка на сообщество для iOS | VK ID - сервис авторизации
VK ID auth service logo

Подписка на сообщество для iOS

Документация актуальна для версии VK ID SDK — 2.7.1.
После того, как вы запросили доступ для работы с сообществами (groups) в настройках приложения, отобразите окно подписки на сообщество в вашем приложении. Окно подписки можно отобразить после авторизации пользователя через кнопку One Tap, шторку авторизации, виджет 3 в 1 или пользовательскую кнопку. Ещё мы даем возможность запустить окно подписки в любой момент при использовании приложения. Перед началом работы выполните действия в зависимости от способа интеграции:

Лимиты показа окна подписки на сообщество

Лимиты показа окна подписки на сообщество не работают, если вы запускаете окно подписки в любой момент при использовании приложения. Вы можете настроить отображение окна подписки:
  • задать количество показов окна;
  • указать для этого количества показов период в днях;
  • полностью отключить лимиты показа окна.
По умолчанию окно подписки отображается пользователю после авторизации два раза за 30 дней — при этом момент показа может быть любой, он не зафиксирован жёстко. Лимиты позволяют регулировать количество показов за указанный период, чтобы частые показы не мешали пользователю. Задайте необходимые параметры отображения окна подписки при инициализации VK ID SDK.
import VKID

do {
    let vkid = try VKID(
        config: Configuration(
            appCredentials: AppCredentials(
                clientId: clientId,         // ID вашего приложения.
                clientSecret: clientSecret  // Ваш защищённый ключ (client_secret).
            ),
            groupSubscriptionsLimit: GroupSubscriptionsLimit(
                maxSubscriptionsToShow: 2,  // Количество показов окна подписки.
                periodInDays: 30            // Период для этого количества показов.
            )
        )
    )
} catch {
    preconditionFailure("Failed to initialize VKID: \(error)")
}
Параметры GroupSubscriptionsLimit связаны следующей логикой: если взять в календаре произвольный период в periodInDays дней, то в нём будет не больше maxSubscriptionsToShow показов окна подписки. Чтобы отключить лимиты и показывать окно подписки всегда, передайте groupSubscriptionsLimit: nil.

Показ окна подписки на сообщество после авторизации пользователя

Вы можете настроить автоматический показ окна подписки на сообщество, которое запускается после авторизации пользователя. Чтобы настроить запуск окна подписки, добавьте конфигурацию GroupSubscriptionConfiguration со следующими параметрами:
ПараметрОбязательныйОписание
subscribeToGroupIdДаID сообщества. Его можно увидеть на странице сообщества в ВКонтакте в разделе Подробная информация
buttonTypeНетСтилизация кнопки внутри окна подписки. Возможные значения:
themeНетТема окна подписки на сообщество. Возможные значения:
  • .light — светлая тема;
  • .dark — тёмная тема;
  • .system — системная тема, меняется между .light и .dark в зависимости от системных настроек оформления в телефоне.
sheetCornerRadiusНетРадиус скругления окна подписки на сообщество
onCompleteSubscriptionНетCallback, который возвращает результат подписки на сообщество
Чтобы показать окно подписки на сообщество после авторизации:
  1. Создайте конфигурацию GroupSubscriptionConfiguration.
    let authConfiguration: AuthConfiguration = .init(
         groupSubscriptionConfiguration: .init(
             subscribeToGroupId: "1",  // Замените "1" на ID вашего сообщества.
             onCompleteSubscription: { result in
                 switch result {
                 case .success:
                     print("Успешная подписка")
                 case .failure(let error):
                     print("Не удалось подписаться: \(error)")
                 }
             },
             buttonType: .custom(.init(height: .medium(.h44), cornerRadius: 12)),
             sheetCornerRadius: 24
         )
     )
  2. Получите UI-элемент.
let oneTapConfig = OneTapButton(authConfiguration: authConfiguration, onCompleteAuth: nil)
let oneTap = self.vkid?.ui(for: oneTapConfig).uiView()

Самостоятельный запуск окна подписки на сообщество

Обратите внимание
Лимиты показа окна подписки на сообщество не работают при самостоятельном запуске окна подписки.
Вам подойдёт этот способ, если вы подключили авторизацию через VK ID и хотите отобразить окно подписки не следующим экраном после авторизации, а в любой другой момент при использовании приложения. Чтобы настроить самостоятельный запуск окна подписки, настройте конфигурацию GroupSubscriptionSheet со следующими параметрами:
ПараметрОбязательныйОписание
subscribeToGroupIdДаID сообщества. Его можно увидеть на странице сообщества в ВКонтакте в разделе Подробная информация
buttonConfigurationНетСтилизация кнопок внутри окна подписки на сообщество
themeНетТема окна подписки на сообщество. Возможные значения:
  • .light — светлая тема;
  • .dark — тёмная тема;
  • .system — системная тема, меняется между .light и .dark в зависимости от системных настроек оформления в телефоне.
sheetCornerRadiusНетРадиус скругления окна подписки на сообщество
presenterНетPresenter для отображения Snackbar
onCompleteSubscriptionНетCallback, который возвращает результат подписки на сообщество
accessTokenProviderДаCallback, который возвращает результат передачи Access token
Параметры accessTokenProvider
ПараметрыОбязательныйОписание
needToRefreshДаПризнак необходимости обновить токен. Если возвращается значение true, обновите токен
completionДаCallback для передачи accessToken или ошибки
Чтобы использовать GroupSubscriptionSheet на своих экранах в приложении:
  1. Создайте конфигурацию GroupSubscriptionSheet.
    let sheetConfig = GroupSubscriptionSheet(
        subscribeToGroupId: "1",  // Замените "1" на ID вашего сообщества.
        buttonConfiguration: .init(
            height: .medium(.h44),
            cornerRadius: 12
        ),
        theme: .matchingColorScheme(.light),
        sheetCornerRadius: 24,
        presenter: .newUIWindow
    ) { result in
        switch result {
        case .success:
            print("Успешная подписка")
        case .failure(let error):
            print("Не удалось подписаться: \(error)")
        }
    } accessTokenProvider: { force, completion in
        guard let session = self.vkid?.currentAuthorizedSession else {
            return
        }
        session.getFreshAccessToken(forceRefresh: force) { result in
            switch result {
            case .success((let accessToken, _)):
                completion(.success(accessToken.value))
            case .failure(let error):
                completion(.failure(error))
            }
        }
    }
  2. Получите uiViewController и отобразите его модально.
    self.vkid?.ui(for: sheetConfig).uiViewController { [weak self] result in
        switch result {
        case .success(let viewController):
            self?.present(viewController, animated: true)
        case .failure(let error):
            print("Не удалось создать шторку подписки на сообщество: \(error)")
        }
    }

Стилизация кнопок внутри окна подписки на сообщество

Для настройки отображения кнопок внутри окна подписки на сообщество используйте параметр buttonConfiguration. В параметре cornerRadius задаётся величина скругления кнопок внутри окна подписки. Параметр height в зависимости от префикса (.small/.medium/.large) определяет размер текста, а суффикс обозначает высоту кнопок внутри окна подписки. Значение по умолчанию — .default, которое совпадает с .medium(.h44).
Другие возможные значения
  • .small(.h32);
  • .small(.h34);
  • .small(.h36);
  • .small(.h38);
  • .medium(.h40);
  • .medium(.h42);
  • .medium(.h46);
  • .large(.h48);
  • .large(.h50);
  • .large(.h52);
  • .large(.h54);
  • .large(.h56).

Ошибки

Возможные ошибки из enum GroupSubscriptionError
  • closedByUser — пользователь закрыл окно с подпиской на сообщество;
  • canceledByUser — пользователь отменил подписку на сообщество;
  • invalidAccessToken — невалидный Access token;
  • failedSubscription — ошибка подписки на сообщество;
  • failedToCreate(GroupSubscriptionSheetCreationError) — ошибка создания окна подписки на сообщество;
  • unknown — при выполнении запроса произошла неизвестная ошибка.
Возможные ошибки из enum GroupSubscriptionSheetCreationError
  • invalidAccessToken — невалидный Access token;
  • isServiceAccount — пользователь авторизовался с помощью аккаунта VK ID, который не прошёл процедуру дорегистрации. Это значит, что пользователь не создал учётную запись в социальной сети ВКонтакте;
  • groupClosed — сообщество закрыто;
  • alreadyMember — пользователь уже подписан на сообщество;
  • scopeMissing — в Access token отсутствует доступ groups;
  • localLimitReached — достигнут лимит показов окна подписок на сообщество, заданный в groupSubscriptionsLimit;
  • subscriptionNotAllowed — достигнут лимит успешных подписок на сообщество, который указан в договоре;
  • unknown — при выполнении запроса произошла неизвестная ошибка.