Во время работы над очередной версией приложения PhotoSuerte возникла задача сделать публикацию фото в социальной сети ВКонтакте через стандартный контроллер UIActivityViewController.
Поиск в сети дал следующие результаты:
- Готовой реализации нет
- Есть официальное sdk ВКонтакте: содержит механизмы авторизации, работы с картинками, но не имеет готового класса для загрузки через UIActivityViewController
- Есть документация Apple для создания кастомного UIActivity
Подготовка к использованию VK SDK
Перед началом работы с VK SDK необходимо создать Standalone-приложение на странице создания приложения. Сохранить ID приложения и заполнить поле «App Bundle для iOS».
- Откройте настройки проекта, выберите раздел «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]
Исходный код проекта можно скачать здесь.