Перед началом работы с VK SDK необходимо создать
Standalone-приложение. Сохраните Ваш
ID приложения (в документации ему соответствует параметр
APP_ID) и заполните поле "App Bundle для iOS".
Для настройки авторизации через VK App необходимо настроить URL-схему Вашего приложения. URL-схема должна иметь вид
vk+
APP_ID (например,
vk1234567).
Подробную информацию о том, как это сделать, Вы можете найти здесь:
В 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>
CocoaPods — это менеджер зависимостей для Objective-C, автоматизирующий и упрощающий процесс использования сторонних библиотек, таких как VK SDK. Более подробную информацию Вы можете найти в руководстве
"Getting Started".
Добавьте в Ваш Podfile следующее:
platform :ios, '6.0'
pod "VK-ios-sdk"
Затем импортируйте главный заголовочный файл:
#import <VKSdk.h>
Только для iOS 8 и выше
Добавьте в Ваш Cartfile следующее:
github "VKCOM/vk-ios-sdk" >= 1.3.8
Инструкции по сборке Carthage Вы можете найти
здесь.
Затем импортируйте главный заголовочный файл:
#import <VKSdkFramework/VKSdkFramework.h>
Если Вы работаете с 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
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
}
}];
Если у пользователя установлено приложение ВКонтакте, то авторизация пройдет через него без ввода логина и пароля. Иначе откроется веб-интерфейс.
Для авторизации можно использовать метод
[VKSdk authorize:scope];
За авторизацию отвечает делегат:
- (void)vkSdkAccessAuthorizationFinishedWithResult:(VKAuthorizationResult *)result
В случае успеха будет получен токен для работы с API:
if (result.token) {
// Пользователь успешно авторизован
} else if (result.error) {
// Пользователь отменил авторизацию или произошла ошибка
}
Для доступа к API можно использовать как встроенные в SDK методы, так и
свою библиотеку, получив
access_token.
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 ];
[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);
}
}];
Ошибки 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];
}
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 для каждого метода в порядке их добавления.
Продолжение