Создание кастомного UIActivity для публикации фото и текста в социальной сети ВКонтакте

Во время работы над очередной версией приложения PhotoSuerte возникла задача сделать публикацию фото в социальной сети ВКонтакте через стандартный контроллер UIActivityViewController.

activity

Поиск в сети дал следующие результаты:

  1. Готовой реализации нет
  2. Есть официальное sdk ВКонтакте: содержит механизмы авторизации, работы с картинками, но не имеет готового класса для загрузки через UIActivityViewController
  3. Есть документация Apple для создания кастомного UIActivity

 

Подготовка к использованию VK SDK

Перед началом работы с VK SDK необходимо создать Standalone-приложение на странице создания приложения. Сохранить ID приложения и заполнить поле «App Bundle для iOS».

Для настройки авторизации через VK App, необходимо настроить URL-протокол приложения:
  • Откройте настройки проекта, выберите раздел «Info».
  • В секции «URL Types» нажмите на +.
  • Введите vk+APP_ID (например, vk1234567) в поля «Indentifier» и «URL Schemes».

 

Работа с SDK

Необходимо инициализировать SDK при запуске приложения методом

[VKSdk initialize:delegate andAppId:APP_ID];

Для авторизации можно использовать метод:

[VKSdk authorize:scope];

В случае успеха у делегата будет вызван метод

-(void) vkSdkDidReceiveNewToken:(VKAccessToken*) newToken;

В случае ошибки (например, пользователь запретил авторизацию)

-(void) vkSdkUserDeniedAccess:(VKError*) authorizationError;

 

UIActivity для ВКонтакте

Следуя документации Apple, создаём наследник UIActivity:

[gist id= 9273663 file=VKontakteActivity.h]

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

 

Далее переопределяем методы для отображения элемента UIActivity (тип, название и иконку)

[gist id= 9322921 file=VKontakte-UIActivity.m]

 

Проверяем поддерживает ли наш класс шаринг передаваемых ему activityItems:

[gist id= 9323270 file=VKontakteActivity-canPerformWithActivityItems.m]

 

Запоминаем  поддерживаемые нами activityItems:

[gist id= 9326708 file=VKontakteActivity-prepareWithActivityItems.m]
Непосредственно при выборе нашего UIActivity проверяем авторизован ли пользователь:

[gist id= 9323395 file=VKontakteActivity-Perform.m]

 

При успешной авторизации публикуем пост.

[gist id= 9323546 file=VKontakteActivity-Post.m]

 

При этом если пост содержит картинку, то предварительно загружаем её на сервер.

[gist id= 9326782 file=VKontakteActivity-uploadWallPhotoRequest.m]

 

Пример публикации фото с помощью VKontakteActivity:

[gist id= 9325699 file=VKontakteActivity-Example.m]

 

Исходный код проекта можно скачать здесь.