Главная » iOS SDK
iOS SDK
1. Подготовка к использованию
    1.1. Настройка URL-схемы в iOS приложении
    1.2. Изменения для iOS 9
2. Подключение в приложении
    2.1. Установка в CocoaPods
    2.2. Установка в Carthage
    2.3. Установка с использованием фреймворка
3. Работа с SDK
    3.1. Инициализация SDK
4. Авторизация пользователя
5. Вызов методов API
    5.1. Подготовка запросов
    5.2. Отправка запроса
    5.3. Обработка ошибок
    5.4. Пакетная обработка запросов
6. Публикация записей
    6.1. Работа с диалогом Share
    6.2. Работа с UIActivityViewController
    6.1. Работа с wall.post

SDK упрощает использование API ВКонтакте в iOS-приложениях. Пользователи смогут пройти авторизацию без ввода логина и пароля. После этого вы сможете сразу начать использовать методы API.

Страница проекта и исходный код на GitHub:
http://github.com/VKCOM/vk-ios-sdk

Поддерживаются версии iOS 6.0 и выше.
1. Подготовка к использованию
Перед началом работы с VK SDK необходимо создать Standalone-приложение. Сохраните Ваш ID приложения (в документации ему соответствует параметр APP_ID) и заполните поле "App Bundle для iOS".


1.1. Настройка URL-схемы в iOS приложении
Для настройки авторизации через VK App необходимо настроить URL-схему Вашего приложения. URL-схема должна иметь вид vk+APP_ID (например, vk1234567).

Подробную информацию о том, как это сделать, Вы можете найти здесь:
1.2. Изменения для iOS 9
В iOS 9 произошли изменения, связанные с общей политикой безопасности приложений и использованием незащищенных подключений. Если Вы планируете использовать в своем приложении scope = nohttps, Вам необходимо изменить настройки безопасности следующим образом (файл Info.plist):
<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>vk.com</key>
        <dict>
            <key>NSExceptionRequiresForwardSecrecy</key>
            <false/>
            <key>NSIncludesSubdomains</key>
            <true/>
            <key>NSExceptionAllowsInsecureHTTPLoads</key>
            <true/>
        </dict>
    </dict>
</dict>

Мы не рекомендуем использовать scope=nohttps.

Также для работы в iOS 9 Вам необходимо добавить схемы, которые будут использоваться для canOpenUrl. Добавьте в Info.plist' следующее:
<key>LSApplicationQueriesSchemes</key>
<array>
    <string>vk</string>
    <string>vk-share</string>
    <string>vkauthorize</string>
</array>
2. Подключение в приложении
2.1. Установка в CocoaPods
CocoaPods — это менеджер зависимостей для Objective-C, автоматизирующий и упрощающий процесс использования сторонних библиотек, таких как VK SDK. Более подробную информацию Вы можете найти в руководстве "Getting Started".

Добавьте в Ваш Podfile следующее:
platform :ios, '6.0'
pod "VK-ios-sdk"


Затем импортируйте главный заголовочный файл:
#import <VKSdk.h>

2.2. Установка в Carthage
Только для iOS 8 и выше

Добавьте в Ваш Cartfile следующее:
github "VKCOM/vk-ios-sdk" >= 1.3.8

Инструкции по сборке Carthage Вы можете найти здесь.

Затем импортируйте главный заголовочный файл:
#import <VKSdkFramework/VKSdkFramework.h>

2.3. Установка с использованием фреймворка
Если Вы работаете с iOS 8 и выше, Вы можете использовать Framework Target для SDK. Добавьте VK-ios-sdk.xcodeproj в Ваш проект в качестве подпроекта. Откройте Ваш проект в XCode, затем перейдите на вкладку General → Найдите раздел Embedded Binaries → Нажмите Add items (значок плюс) → Выберите VKSdkFramework.framework из проекта VK-ios-sdk, и, наконец, импортируйте главный заголовочный файл:
#import <VKSdkFramework/VKSdkFramework.h>

Исходный код на GitHub
3. Работа с SDK
3.1. Инициализация SDK
1) Поместите этот код в метод делегата приложения:
//iOS 9 workflow
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString *,id> *)options {
    [VKSdk processOpenURL:url fromApplication:options[UIApplicationOpenURLOptionsSourceApplicationKey]];
    return YES;
}

//iOS 8 and lower
-(BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
    [VKSdk processOpenURL:url fromApplication:sourceApplication];
    return YES;
}

Обратите внимание: если Вы уже используете Facebook SDK, и один из этих методов возвращает [FBSDKDelegate ...], Вы можете решить эту проблему следующим образом:
-(BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {

[[FBSDKApplicationDelegate sharedInstance] application:application openURL:url sourceApplication:sourceApplication annotation:annotation];
    [VKSdk processOpenURL:url fromApplication:sourceApplication];
    return YES;
}

2) Инициализируйте SDK с помощью своего APP_ID для любого делегата:
[VKSdk initializeWithDelegate:delegate andAppId:YOUR_APP_ID];
 

Описание методов делегата

Начиная с версии 1.3, доступны два типа делегатов: common delegate и UI delegate. Вы можете зарегистрировать столько common делегатов, сколько необходимо, но UI делегат должен быть единственным. После инициализации SDK Вы можете регистрировать делегатов по отдельности:
[sdkInstance registerDelegate:delegate];
[sdkInstance setUiDelegate:uiDelegate];

или
[[VKSdk initializeWithAppId:APP_ID] registerDelegate:delegate];

Вы можете найти полное описание протоколов VKSdkDelegate и VKSdkUIDelegate здесь или здесь.

3) Вам необходимо проверить, доступна ли предыдущая сессия, для этого используйте вызов асинхронного метода wakeUpSession:completeBlock:
NSArray *SCOPE = @[@"friends", @"email"];

[VKSdk wakeUpSession:SCOPE completeBlock:^(VKAuthorizationState state, NSError *error) {
    if (state == VKAuthorizationAuthorized) {
        // Authorized and ready to go
    } else if (error) {
        // Some error happend, but you may try later
    }
}];

Полный список доступных scope Вы можете найти на этой странице.

Проверьте значение параметра VKAuthorizationState. Вы можете получить одно из следующих состояний:
  • VKAuthorizationInitialized — означает, что SDK готов к работе, и Вы можете авторизовать пользователя с помощью метода +authorize:. Возможно, старая сессия истекла и мы уничтожили ее. Это не ошибка.
  • VKAuthorizationAuthorized — означает, что с предыдущей сессией все в порядке и Вы можете продолжить работу с данными пользователя.
  • VKAuthorizationError — означает, что во время проверки произошла ошибка. Возможно, слишком плохое качество соединения с Интернетом. Нужно повторить попытку позже.
[VKSdk wakeUpSession:SCOPE completeBlock:^(VKAuthorizationState state, NSError *err) {
       if (state == VKAuthorizationAuthorized) {
           // authorized
       } else {
           // auth needed
       }
}];
4. Авторизация пользователя
Если у пользователя установлено приложение ВКонтакте, то авторизация пройдет через него без ввода логина и пароля. Иначе откроется веб-интерфейс.


Для авторизации можно использовать метод
[VKSdk authorize:scope];


За авторизацию отвечает делегат:
- (void)vkSdkAccessAuthorizationFinishedWithResult:(VKAuthorizationResult *)result


В случае успеха будет получен токен для работы с API:

if (result.token) {
// Пользователь успешно авторизован
} else if (result.error) {
// Пользователь отменил авторизацию или произошла ошибка
}
5. Вызов методов API
Для доступа к API можно использовать как встроенные в SDK методы, так и свою библиотеку, получив access_token.
5.1. Подготовка запросов
1) Простой запрос.
VKRequest * audioReq = [[VKApi users] get];

2) Запрос с параметрами
VKRequest * audioReq = [[VKApi audio] get:@{VK_API_OWNER_ID : @"896232"}];

3) Запрос с заданным максимальным числом попыток.
VKRequest * postReq = [[VKApi wall] post:@{VK_API_MESSAGE : @"Test"}];
postReq.attempts = 10;
//or infinite
//postReq.attempts = 0;

Будет предпринято до 10 попыток, пока не выполнится успешно, или не будет возвращена API error.
4) Вызов метода ВК API.
VKRequest * getWall = [VKRequest requestWithMethod:@"wall.get" andParameters:@{VK_API_OWNER_ID : @"-1"} andHttpMethod:@"GET"];

5) Загрузка фото на стену пользователя.
VKRequest * request = [VKApi uploadWallPhotoRequest:[UIImage imageNamed:@"my_photo"] parameters:[VKImageParameters pngImage] userId:0 groupId:0 ];

5.2. Отправка запроса

[audioReq executeWithResultBlock:^(VKResponse * response) {
       NSLog(@"Json result: %@", response.json);
} errorBlock:^(NSError * error) {
       if (error.code != VK_API_ERROR) {
             [error.vkError.request repeat];
       }
      else {
             NSLog(@"VK error: %@", error);
       }
}];

5.3. Обработка ошибок
Ошибки NSError, возвращаемые SDK, могут быть двух видов: ошибки сети и внутренние ошибки SDK (например, запрос отменён). Категория NSError+VKError дополняет класс NSError свойством vkError, которое можно проанализировать на предмет произошедшей ошибки.

При проверке ошибок следует сначала проверить code на совпадение с глобальной константой VK_API_ERROR. Если это так, то необходимо обрабатывать поле vkError, которое содержит описание ошибки VK API. В противном случае Вы имеете дело с сетевой ошибкой.

Некоторые ошибки SDK может обработать сам (ошибка капчи, ошибка валидации). Для этого у делегата будут вызваны соответствующие методы.

Пример обработки в делегате ошибки, для которой требуется ввод капчи:
- (void)vkSdkNeedCaptchaEnter:(VKError *)captchaError
{
    VKCaptchaViewController *vc = [VKCaptchaViewController captchaControllerWithError:captchaError];
    [vc presentIn:self];
}

5.4. Пакетная обработка запросов
SDK предусматривает возможность выполнения нескольких методов в один запрос.
1) Подготавливаются необходимые запросы:
VKRequest * request1 = [[VKApi audio] get];
 request1.completeBlock = ^(VKResponse*) { ... };

VKRequest * request2 = [[VKApi users] get:@{VK_USER_IDS : @[@(1), @(6492), @(1708231)]}];
request2.completeBlock = ^(VKResponse*) { ... };

2) Необходимые запросы объединяются в один.
VKBatchRequest * batch = [[VKBatchRequest alloc] initWithRequests:request1, request2, nil];

3) Запрос загружается стандартным путём.
[batch executeWithResultBlock:^(NSArray *responses) {
        NSLog(@"Responses: %@", responses);
 } errorBlock:^(NSError *error) {
        NSLog(@"Error: %@", error);
 }];

4) Для каждого метода результат будет возвращён в completeBlock, а batch будет содержать VKResponse для каждого метода в порядке их добавления.

Продолжение