GithubHelp home page GithubHelp logo

vkcom / vk-ios-sdk Goto Github PK

View Code? Open in Web Editor NEW
295.0 54.0 163.0 46.77 MB

iOS library for working with VK API, authorization through VK app, using VK functions

License: MIT License

Objective-C 98.70% Ruby 0.15% C 1.15%

vk-ios-sdk's Introduction

vk-ios-sdk

Library for working with VK API, authorizing through VK app, using VK API methods. Supported iOS from 8.0 Prepare for Using VK SDK

To use VK SDK primarily you need to create a new Standalone VK application here. Choose a title and confirm the action via SMS and you will be redirected to the application settings page. You will need your APP_ID to use the library. Fill in the App Bundle for iOS field.

Setup URL schema of Your Application

To authorize via VK App you need to setup a url-schema for your application, which looks like vk+APP_ID (e.g. vk1234567).

How to implement your own URL Scheme here, Also there is nice Twitter tutorial

Configuring application for iOS 9

iOS 9 changes the way of applications security and way of using unsecured connections. Basically, you don't have to change anything in transport security settings. But, if you're planing to use VK API with nohttps scope, you have to change security settings that way (in your Info.plist file):

<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>

We don't recommend using nohttps scope.

Also, for iOS 9 you have to add app schemas your app will use and check for canOpenURL:.

Add this to your Info.plist:

<key>LSApplicationQueriesSchemes</key>
<array>
    <string>vk</string>
    <string>vk-share</string>
    <string>vkauthorize</string>
</array>

How to set up VK iOS SDK

Installation with CocoaPods

CocoaPods is a dependency manager for Objective-C, which automates and simplifies the process of using 3rd-party libraries like VK SDK in your projects. See the Getting Started guide for more information.

Podfile

platform :ios, '8.0'
target 'YourProjectName' do
  pod 'VK-ios-sdk'
end

Then import the project as module if your podfile contains use_frameworks! directive:

@import VK_ios_sdk;

Or import the main project header, if you're installing pods without use_frameworks! directive:

#import <VK-ios-sdk/VKSdk.h>

Installation with Carthage

iOS 8 and upper only

Add this to you Cartfile:

github "VKCOM/vk-ios-sdk" >= 1.4

See building instructions for Carthage here

Then import the main header.

#import <VKSdkFramework/VKSdkFramework.h>

Installation with framework project

If you're targeting iOS 8 and upper, you can use the SDK framework target. Add VK-ios-sdk.xcodeproj as sub-project to your project. Open your project in Xcode -> Go to General tab -> Find the Embedded Binaries section -> Click Add items (plus sign) -> And select VKSdkFramework.framework from the VK-ios-sdk project lastly import the main header:

#import <VKSdkFramework/VKSdkFramework.h>

Using SDK

SDK Initialization

  1. Put this code to the application delegate method
//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;
}

Note: if you already have FaceBook SDK added and one of this methods returns [FBSDKDelegate ...] you can handle it

-(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;
}
  1. Initialize VK SDK with your APP_ID for any delegate
VKSdk *sdkInstance = [VKSdk initializeWithAppId:YOUR_APP_ID];

Starting from version 1.3 there are two types of delegates available: common delegate and UI delegate. You can register as much common delegates, as you need, but an UI delegate may be only one. After the SDK initialization you should register delegates separately:

[sdkInstance registerDelegate:delegate];
[sdkInstance setUiDelegate:uiDelegate];

or

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

You will find full description of VKSdkDelegate and VKSdkUIDelegate protocols here or here

  1. You need to check, if there is previous session available, so call asynchronous method 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 happened, but you may try later
    }
}];

You will find full list of available SCOPE permission here

Check out the VKAuthorizationState parameter. You can get several states:

  • VKAuthorizationInitialized – means the SDK is ready to work, and you can authorize user with +authorize: method. Probably, an old session has expired, and we wiped it out. This is not an error.
  • VKAuthorizationAuthorized - means a previous session is okay, and you can continue working with user data.
  • VKAuthorizationError - means some error happened when we tried to check the authorization. Probably, the internet connection has a bad quality. You have to try again later.
[VKSdk wakeUpSession:SCOPE completeBlock:^(VKAuthorizationState state, NSError *err) {
       if (state == VKAuthorizationAuthorized) {
           // authorized
       } else {
           // auth needed
       }
}];

User Authorization

If you don't have a session yet, you have to authorize user with a next method:

[VKSdk authorize:scope];

You have to conform to both VKSdkDelegate and VKSdkUIDelegate protocols to get appropriate methods called.

After the authorization, all common delegates will be called with a next method:

- (void)vkSdkAccessAuthorizationFinishedWithResult:(VKAuthorizationResult *)result;

VKAuthorizationResult contains some initial information: new access token object, basic user information, and error (if authorization failed). Complete documentation here

API Requests

VK API Request syntax

Below we have listed some examples for several request types.

  1. Plain request
VKRequest *usersReq = [[VKApi users] get];
  1. Request with parameters
VKRequest *audioReq = [[VKApi audio] get:@{VK_API_OWNER_ID : @"896232"}];
  1. Request with predetermined maximum number of attempts
VKRequest *postReq = [[VKApi wall] post:@{VK_API_MESSAGE : @"Test"}];
postReq.attempts = 10;
//or infinite
//postReq.attempts = 0;

It will take 10 attempts until succeeds or an API error occurs

  1. Request that calls any method of VK API
VKRequest *getWall = [VKRequest requestWithMethod:@"wall.get" andParameters:@{VK_API_OWNER_ID : @"-1"}];
  1. Request that uploads a photo to a user's wall
VKRequest *request = [VKApi uploadWallPhotoRequest:[UIImage imageNamed:@"my_photo"] parameters:[VKImageParameters pngImage] userId:0 groupId:0 ];

Request firing

[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);
    }
}];

Error Handling

Every request can return NSError with domain equal to VKSdkErrorDomain. SDK can return networking error or internal SDK error (e.g. request was canceled). Category NSError+VKError provides vkError property that describes error event. Compare error code with the global constant VK_API_ERROR. If they are equal that means you process vkError property as API error. Otherwise you should handle an http error.

SDK can handle some errors (e.g., captcha error, validation error). Appropriate ui delegate method will be called for this purpose. Below is an example of captcha error processing:

- (void)vkSdkNeedCaptchaEnter:(VKError *)captchaError
{
    VKCaptchaViewController *vc = [VKCaptchaViewController captchaControllerWithError:captchaError];
    [vc presentIn:self];
}

Batch Processing Requests

SDK allows to execute several unrelated requests at the one call (aka Batch Request).

  1. Prepare requests
VKRequest *request1 = [[VKApi audio] get];
request1.completeBlock = ^(VKResponse *) { ... };

VKRequest *request2 = [[VKApi users] get:@{VK_USER_IDS : @[@(1), @(6492), @(1708231)]}];
request2.completeBlock = ^(VKResponse *) { ... };
  1. Merge requests into one
VKBatchRequest *batch = [[VKBatchRequest alloc] initWithRequests:request1, request2, nil];
  1. Fire the obtained request
[batch executeWithResultBlock:^(NSArray *responses) {
        NSLog(@"Responses: %@", responses);
    } errorBlock:^(NSError \*error) {
        NSLog(@"Error: %@", error);
}];
  1. The result of each method returns to a corresponding completeBlock. Response array contains result of the requests in order they have been passed.

Working with Share dialog

Share dialog allows you to create a user friendly dialog for sharing text and photos from your application directly to VK. See the Share dialog usage example:

VKShareDialogController *shareDialog = [VKShareDialogController new]; //1
shareDialog.text         = @"This post created using #vksdk #ios"; //2
shareDialog.vkImages     = @[@"-10889156_348122347",@"7840938_319411365",@"-60479154_333497085"]; //3
shareDialog.shareLink    = [[VKShareLink alloc] initWithTitle:@"Super puper link, but nobody knows" link:[NSURL URLWithString:@"https://vk.com/dev/ios_sdk"]]; //4
[shareDialog setCompletionHandler:^(VKShareDialogControllerResult result) {
    [self dismissViewControllerAnimated:YES completion:nil];
}]; //5
[self presentViewController:shareDialog animated:YES completion:nil]; //6
  1. Create an instance of the dialog controller as usual

  2. Attach some text information to a dialog. Notice that users can change this information

  3. Attach images uploaded to VK earlier. If you want user to upload a new image use uploadImages property

  4. Attach link at your pages

  5. Set the dialog completion handler

  6. Present the dialog view controller to your view controller

Working with share activity

VK SDK provides a special class to work with UIActivityViewController - VKActivity.

Pay attention to the fact, that a VK App has it own Share extension since version 2.4. Since version 2.5 it will support special URL scheme to check if Share extension is available. You should call [VKActivity vkShareExtensionEnabled] method to remove VKActivity from activities list, if a VK share extension is available.

Check the example below to understand how it works:

NSArray *items = @[[UIImage imageNamed:@"apple"], @"Check out information about VK SDK" , [NSURL URLWithString:@"https://vk.com/dev/ios_sdk"]]; //1
UIActivityViewController *activityViewController = [[UIActivityViewController alloc]
                                                    initWithActivityItems:items
                                                    applicationActivities:@[[VKActivity new]]]; //2
[activityViewController setValue:@"VK SDK" forKey:@"subject"]; //3
[activityViewController setCompletionHandler:nil]; //4
if (VK_SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"8.0")) {
    UIPopoverPresentationController *popover = activityViewController.popoverPresentationController;
    popover.sourceView = self.view;
    popover.sourceRect = [tableView rectForRowAtIndexPath:indexPath];
} //5
[self presentViewController:activityViewController animated:YES completion:nil]; //6

Let's go through the example step-by-step

  1. Prepare your share information - UIImage, NSString and NSURL. That kind of information may be shared through VK

  2. Prepare UIActivityViewController with a new application VKActivity

  3. Set additional properties for activityViewController

  4. Set completion handler for activityViewController

  5. Check if you're running iOS 8 or upper. If user is using iPad, you have to present the activity controller in a popover otherwise you'll get system error

  6. Present the activity controller as usual

vk-ios-sdk's People

Contributors

0xstragner avatar akhrameev avatar alexxale avatar alikhanmussabekov avatar artem-shmatkov avatar ashitikov avatar avsmirnov567 avatar chasok avatar chipp avatar cognitivedisson avatar ealeksandrov avatar grebenschikov avatar itstiptop avatar k-be avatar kajinka13 avatar konew avatar lazarev avatar mihroot avatar oleg-derevenetz avatar pitnikola avatar rishatshamsutdinov avatar romantruba avatar rusik avatar shulepov avatar snalexeev avatar suzhaev avatar teanet avatar thepsguy avatar valerycrane avatar vyazovoy avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

vk-ios-sdk's Issues

Не находится либа

Невозможно подключить либу libVKSdk.a при компиляции постоянно выдает ошибку. Добавляю вручную, подскажите, что делаю не так
2014-02-12 16 14 40
2014-02-12 16 17 51
2014-02-12 16 18 11

Video play

Какой вид имеет ссылка на проигрывание видео?

Pod старая версия авторизации

После обновления pod'a выяснилось, что там нет исправления "Fixed #36. Updated validation process" коммит 5a8b89e файла VKSdk.m и поэтому нет вызовов делегата после авторизации.
Подскажите, пожалуйста, как это исправить?

Нет метода audio в классе VKApi

Я в программировании новичок, потому если ошибаюсь,то прошу прощения.Но этого метода, который указан в примерах к тому же, нет в методах класса.
В примерах написано так:
VKRequest * request1 = [[VKApi audio] get]; ... и в блок приходит response...
Если написать [[VKApi users] get]; напр, то работает, но вот список аналогичных методов в VKApi:

  • (VKApiUsers *)users; + (VKApiWall *)wall; + (VKApiPhotos *)photos; + (VKApiFriends *)friends;

Не возвращает почему-то токен

Создал синглтон класс VKManager

@interface VKManager : NSObject (VKSdkDelegate)

Сделал его делегатом VKSdk.

  • (BOOL) application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
    {
    [VKSdk initializeWithDelegate:[VKManager sharedInstance] andAppId:@"2873010"];
    return YES;
    }

По нажатию на кнопку вызываю авторизацию. Очень разные типы авторизации я вызывал.

[VKSdk authorize:@[@"friends", @"photos", @"audio", @"wall", @"offline", @"groups"] revokeAccess:YES forceOAuth:NO inApp:YES];

В делегате вызывается vkSdkShouldPresentViewController

  • (void) vkSdkShouldPresentViewController:(UIViewController *)controller
    {
    AppDelegate *delegate = [[UIApplication sharedApplication] delegate];
    [delegate.window.rootViewController presentViewController:controller animated:YES completion:nil];
    }

Показывается контролер авторизации. Если жму "отмена" на навигационном баре, то срабатывает vkSdkUserDeniedAccess и пишется лог DEALLOC:VKAuthorizeController

Но если я жму "разрешить" или "отмена" на самой веб страничке, то контролер просто сворачивается. Никаких методов в делегате не вызывается. Пишется лог DEALLOC:VKAuthorizeController

Я наверное что-то упустил? Почему в делегате не срабатывают методы об удачной или неудачной авторизации?

Авторизация с другого ip

При авторизации вылетела такая ошибка.
"User authorization failed: access_token was given to another ip address."
Но в делегате никакой метод не вызвался. Я так понимаю должен бы вызываться метод vkSdkUserDeniedAccess ?

ANE (Adobe Native Extension)

К сожалению, у Flash-разработчиков сейчас нет возможности интегрировать мобильные приложения с нативными библиотеками, такими как VK SDK, хотя это было бы очень полезно! Единственная возможность использовать VK SDK - использовать расширения для нативных библиотек (ANE), выступающих прослойкой между AIR и библиотекой. ANE пишется на том же языке, что и сама библиотека. Многие социальные платформы уже имеют такие расширения (например Facebook SDK), поэтому сообщество флешеров оценило бы появление ANE для IOS и Android версий VK SDK!

User authorization failed: no access_token passed.

Авторизуюсь в приложении.

[VKSdk authorize:@[@"friends", @"photos", @"audio", @"wall", @"offline", @"groups"] revokeAccess:YES forceOAuth:NO inApp:NO display:VK_DISPLAY_IOS];

Проверяю токен

DLog(@"%@", self.token.accessToken);

Токен имеется

Отправляю запрос

VKRequest *getInfo = [VKRequest requestWithMethod:@"audio.getRecommendations" andParameters:@{VK_API_USER_ID : self.token.userId, @"shuffle" : @"0", VK_API_COUNT : @"1", VK_API_OFFSET : @"0"} andHttpMethod:@"GET"];

Приходит нормальный ответ.

Выходя из приложения токен записываю в Defaults

[newToken saveTokenToDefaults:@"access_token"];

Захожу в приложение и из Defaults беру токен

[self setToken:[VKAccessToken tokenFromDefaults:@"access_token"]];

Проверяю токен

DLog(@"%@", self.token.accessToken);

Токен имеется

Отправляю запрос

VKRequest *getInfo = [VKRequest requestWithMethod:@"audio.getRecommendations" andParameters:@{VK_API_USER_ID : self.token.userId, @"shuffle" : @"0", VK_API_COUNT : @"1", VK_API_OFFSET : @"0"} andHttpMethod:@"GET"];

Получаю ошибку

VK error: Error Domain=VKSdkErrorDomain Code=-101 "User authorization failed: no access_token passed." UserInfo=0x14eb52d0 {NSLocalizedDescription=User authorization failed: no access_token passed., VkErrorDescriptionKey=<VKError: 0x14e6b3c0;>}

Обработка сохраненных функций execute

Хочу осознать принцип обработки execute-ов

Например такая функция:

return [API.wall.get({"offset":0,"count":1})@.attachments,API.wall.get({"offset":1,"count":1})@.attachments];

Для отправки запроса использую

executeWithResultBlock:^(VKResponse *response)

если делать как в примерах и пытаться достать данные из
response.json
то в один прекрасный момент натыкаюсь на
{
count = "<нулл>";
items = "<нулл>";
}
И происходит это по тому, что в действительности в ответе нет ни items, ни count.

Очень хочется из response достать NSData и обработать самому, но нет такого...

Научите как быть?

Как распарсить VKResponse?

Пока еще не силен в iOS разработке и столкнулся с небольшой проблемой: хочу сделать запрос на wall.get и взять текст допустим со 5 по счету новости.

VKRequest * getWall = [VKRequest requestWithMethod:@"wall.get" andParameters:@{VK_API_OWNER_ID : @"1"} andHttpMethod:@"GET"];
[getWall executeWithResultBlock:^(VKResponse * response) {
     NSLog(@"%@",response.json[5][@"text"]);//ошибка
    } errorBlock:^(NSError * error) {
        if (error.code != VK_API_ERROR) {
            [error.vkError.request repeat];
        }
        else {
            NSLog(@"VK error: %@", error);
        }
    }];

В месте,помеченном комментарием вываливается эксепшн [__NSCFDictionary objectAtIndexedSubscript:]: unrecognized selector sent to instance 0xa5911c0

Current User

Подскажите, как можно работать с текущим пользователем, например получить id, или любой другой параметр?

Заранее, спасибо!

VKAccessToken Expires

Почему-то только что полученный токен в методе:

accessToken.expiresIn

возвращает 0. Это нормально?

И хотелось бы иметь метод

accessToken.isExpired

чтобы проверять, не истек ли он в данный конкретный момент.

Хотя хотел это реализовать обычным сравнением

if (accessToken.expiresIn <= 0)

но, как уже писал выше, новый токен возвращает 0...

Как сменить пользователя и проверить авторизацию?

Если авторизация происходит не в сафари, а внутри приложения. То даже если я в данный момент не залогинен в сафари, то внутри приложения я все равно авторизирован.

Так вот каким образом мне сменить пользователя?

И второй вопрос, можно ли проверить авторизирован я в данный момент или нет, не сохраняя и не загружая AccessToken вручную?

liking post

Делаю запрос

VKRequest *requestGroup = [VKRequest requestWithMethod:@"likes.add" andParameters:@{ @"type" : @"post", @"owner_id" : GROUP_ID, @"item_id" : self.currentWallpost.guid, @"access_key" : [VKSdk getAccessToken].accessToken} andHttpMethod:@"GET"];

GROUP_ID 39765355
self.currentWallpost.guid 39557
access_key 9e7830d0502f34b75398f9e9379865633475e4f325caeb3a9e59819a285a4d15c93106775cab0837cc9a9

Ответ Error: Error Domain=VKSdkErrorDomain Code=-101 "One of the parameters specified was missing or invalid: object not found" UserInfo=0xca66870 {NSLocalizedDescription=One of the parameters specified was missing or invalid: object not found, VkErrorDescriptionKey=<VKError: 0xca6b920;>

Как лайкнуть пост?

Не реализована работа vkSdkTokenHasExpired

Собственно, кроме голого объявления в протоколе ничего и нету. Из делегатных методов он один такой.

А главное неясно как по человечески проверять, что токен протух. Как вариант, можно вместе с токеном сохранять и время, когда он закончится, но делать это вне сдк - костыльно.

Как разлогинить пользователя?

Не смотря на название forceLogout не разлогинивает пользователя. vkSdkInstance->_accessToken после этого вызова сохраняется. Запросы продолжают выполняться. Единственный метод, который может установить токен в nil: VKSdk:+setAccessTokenError.

Сейчас использую следующий костыль:

    [VKSdk forceLogout];
    [VKSdk setAccessTokenError:[VKError errorWithCode:VK_API_CANCELED]];
    NSString* defaultsKey = @"VK_ACCESS_TOKEN_DEFAULTS_KEY_DONT_TOUCH_THIS_PLEASE";
    [[NSUserDefaults standardUserDefaults] removeObjectForKey:defaultsKey];
    [[NSUserDefaults standardUserDefaults] synchronize];

Как корректно сбросить сессию пользователя?

uploadWallPhotoRequest не работает

Такое чувство что все в целом работает правильно, но запись почему-то не публикуется на стену.

В ответе на запрос приходят ссылки на загруженные изображения:
photo_130 = https://pp.vk.me/c614625/v614625514/49ce/UlDsCRPMWpg.jpg;
photo_604 = https://pp.vk.me/c614625/v614625514/49cf/1BRmxlE_gN0.jpg;
photo_75 = https://pp.vk.me/c614625/v614625514/49cd/jHphmn2QnbY.jpg;

И остальные параметры вроде верные. Но на стене ничего не появляется.

Запрос использую стандартный из примера:

VKRequest *request = [VKApi uploadWallPhotoRequest:image parameters:[VKImageParameters pngImage] userId:0 groupId:0];

Еще хотелось бы в запросе передавать дополнительные параметры. Например текст. Чтобы постить на стену не голую картинку, но с текстом.
В классе "VKUploadWallPhotoRequest" вроде бы легко можно добавить параметр текста.

Вид авторизации

Раньше было

_redirectUri = [[self class] buildAuthorizationUrl:REDIRECT_URL clientId:_appId scope:_scope revoke:revoke display:@"ios"];

теперь

_redirectUri = [[self class] buildAuthorizationUrl:REDIRECT_URL clientId:_appId scope:_scope revoke:revoke display:@"mobile"];

Был бы благодарен за возможность настраивать вид авторизации самому в вызываемом методе, например:

[VKSdk authorize:VK_PERMISSIONS revokeAccess:YES forceOAuth:NO inApp:NO display:VK_DISPLAY_IOS / VK_DISPLAY_MOBILE];

Group request

Делаю запрос

  • (void)requestVKGroupWithId:(NSString *)groupId
    {
    VKRequest *requestGroup = [VKRequest requestWithMethod:@"groups.getById" andParameters:@{ VK_API_GROUP_ID : groupId, VK_API_FIELDS : @"description, is_member, members_count, status, contacts"} andHttpMethod:@"GET"];
    [requestGroup executeWithResultBlock: ^(VKResponse *response) {
    NSArray *responseArray = [NSArray arrayWithArray:response.json];
    NSLog(@"%@", responseArray);

    [DataManager saveGroup:responseArray[0] WithParams:nil];
    

    } errorBlock: ^(NSError *error) {
    //DDLogError(@"Error: %@", error);
    }];
    }

Не приходят все поля

    {
    description = "";
    id = 39765355;
    "is_closed" = 0;
    name = "Men's Group";
    "photo_100" = "https://pp.vk.me/c605529/v605529282/3c94/EVf7zZRbpE0.jpg";
    "photo_200" = "https://pp.vk.me/c605529/v605529282/3c91/0tz4YidTpQE.jpg";
    "photo_50" = "https://pp.vk.me/c605529/v605529282/3c95/s2fWxeFfMOs.jpg";
    "screen_name" = lmensgroupl;
    type = page;
}

Не скачиваются source файлы через cocoapods

Пишу в pods - "pod 'VK-ios-sdk'", инсталю - в проекте Pods в папке pods создается папка VK-ios-sdk, в которой только Support Files. Ни одного source файла нет.
Cocoapods самая последняя версия, все остальные поды подтягиваются нормально. Пробовал на нескольких проектах.

Непонятный краш при попытке выполнить запрос

Здравствуйте, уже несколько дней не могу разобраться с непонятной причиной падения приложения при попытке выполнить запрос. Опишу подробно последовательность моих действий:
1)Создаю podFile. Делаю pod install. Библиотека успешно устанавливается. Запускаю только что созданный workspace. И сразу же у меня повляются ошибки на 2 строчки из VKSdk.h

@import Foundation;
@import UIKit;

Не долго думая, я удалил обе строки
2) Затем прописал URLTypes, в свой .h файл добавил
#import <VKSdk.h>
@interface MainViewController : UITableViewController <UITableViewDataSource, UITableViewDelegate, VKSdkDelegate>

3) Далее в основном файле пытаюсь авторизоваться и сделать небольшой запрос

[VKSdk initializeWithDelegate:self andAppId:APP_ID];
[VKSdk authorize:@[VK_PER_FRIENDS, VK_PER_WALL, VK_PER_PHOTOS, VK_PER_NOHTTPS, VK_PER_MESSAGES] revokeAccess:YES];
VKRequest * getWall = [VKRequest requestWithMethod:@"wall.get" andParameters:@{VK_API_OWNER_ID : @"1"} andHttpMethod:@"GET"];
[getWall 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);
}
}];

Но при запуске приложения, оно сразу же крашится указывая на строчку

return [[NSError alloc] initWithDomain:VKSdkErrorDomain code:originalCode userInfo:userInfo];

В NSError+VKError.h
Помогите пожалуйста разобраться.

Получение не Token, а code.

Всем привет. Меня очень интересует возможность запроса а auth_token, а code, потому как мы пробрасываем запросы через сервер после авторизации, и дальнейший токен после запроса кода на клиенте уже получает сервер.
Посему у меня вопрос, есть ли в сдк возможность запросить не токен а код?

Получение code вместо access_token

Хотелось бы иметь возможность осуществлять server-side запросы к VK API после авторизации пользователя через мобильное приложение.

Но access_token, полученный в мобильном приложении, не может использоваться на сервере.

Поэтому необходима возможность получения code в мобильном приложении (для последующего его обмена на access_token на сервере).

Спасибо!

Code style

Random mixing direct access to ivars and properties is bad practise with side effects.

Invalid user id

Раньше ошибку не выдавало. Может дело в новой версии?

DLog(@"%@", self.token.userId);
VKRequest *getInfo = [VKRequest requestWithMethod:@"users.get" andParameters:@{@"uids" : self.token.userId, @"fields" : @"photo_100"} andHttpMethod:@"GET"];
[getInfo executeWithResultBlock:^(VKResponse *response) {
//
} errorBlock:^(NSError *error) {
if (error.code != VK_API_ERROR)
{
[error.vkError.request repeat];
}
else
{
DLog(@"VK error: %@", error);
}
}];

2014-04-16 00:25:06.871 MusicPro[3269:60b] -[VKManager requestInfo] [Line 88] 143285699
2014-04-16 00:25:07.484 MusicPro[3269:60b] __24-[VKManager requestInfo]_block_invoke323 [Line 137] VK error: Error Domain=VKSdkErrorDomain Code=-101 "Invalid user id" UserInfo=0x14ee7dd0 {NSLocalizedDescription=Invalid user id, VkErrorDescriptionKey=<VKError: 0x14e9af50;>}

Не вызываются методы делегата

Создал новый проект, подключил sdk. Инициализировал с помощью [VKSdk initializeWithDelegate:self andAppId:VKAPP_ID] в

  • (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

Затем вызываю авторизацию с помощью метода [VKSdk authorize:scope]; Меня кидает на страницу Safari где я ввожу логин и пароль, затем разрешаю доступ приложению. После этого меня перекидывает опять в приложение, но метод vkSdkDidReceiveNewToken не вызывается. В том случае если отменить авторизацию то опять перекидывает в приложение, но ни один из методов не вызывается.

Useless encryption

In VKAccessToken.m you declare static NSString *const TOKEN_KEY = @"VK is the best";, but this is not the best and addition useless.
Because If someone uses cocoapod, it hasn't access to source and can't define own value without conflict when updating pods(or pods isn't under vcs). So that key is unavailable to modified without pain. It means every your user have 'VK is the best' as a key as a result encryption is useless.
In example project you write static NSString *const TOKEN_KEY = @"my_application_access_token"; in VKStartScreen.h
but it's pointlessly and doesn't override value of TOKEN_KEY.
In conclusion, if you want to give a option for security, you must pull TOKEN_KEY from constants of the project. Now encryption is useless and only eats cpu ticks.

Как установить Request Timeout?

При "плохом" интернете есть смысл установить таймаут для реквеста. Как это можно сделать? При очень плохом интернете реквест не выпадает по таймауту (как будет если вообще нет интернета) а приводит к крешу программы. Я уже писал про это, но тогда не знал как воспроизвести.

2014-03-20 21:33:10.925 LoudSound[479:60b] -[NSURLError copyWithVkError:]: unrecognized selector sent to instance 0x16e17610
2014-03-20 21:33:10.928 LoudSound[479:60b] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSURLError copyWithVkError:]: unrecognized selector sent to instance 0x16e17610'
*** First throw call stack:
(0x2e521f03 0x38cb6ce7 0x2e525837 0x2e52412f 0x2e4730d8 0x156999 0x11521d 0x3919fd53 0x3919fd3f 0x391a26c3 0x2e4ec679 0x2e4eaf45 0x2e4557a9 0x2e45558b 0x333c26d3 0x30db4891 0x126d05 0x391b4ab7)
libc++abi.dylib: terminating with uncaught exception of type NSException

Парсинг contacts и connections

Connections и contacts не парсятся. Они приходят в json, но если создавать VKUser так
VKUser * user = ((VKUsersArray*)response.parsedModel).firstObject;
или сразу массив друзей, то поля пустые.

VK_API_LANG и VK_API_SORT

Добавьте пожалуйста пример использования VK_API_LANG и VK_API_SORT. Я использую вот так, но отчего то друзья возвращаются на английском языке, а сортировка не меняется.

VKRequest *friendsRequest = [VKRequest requestWithMethod:@"friends.get" andParameters:@{ VK_API_FIELDS : @"uid,first_name,last_name,sex,bdate,city,country,photo_50,photo_100,photo_200_orig,photo_200,photo_400_orig,photo_max,photo_max_orig,online,online_mobile,lists,domain,has_mobile,contacts,connections,site,education,universities,schools,can_post,can_see_all_posts,can_see_audio,can_write_private_message,status,last_seen,common_count,relation,relatives,counters", VK_API_LANG : @"ru", VK_API_SORT : @"name"} andHttpMethod:@"GET" classOfModel:[VKUsersArray class]];

BookMark group

Не вижу Апи метода чтобы проверить в закладках ли группа/паблик, так же не виду как ее добавить и удалить из закладок

Обновление токена

Обновление токена происходит автоматически в SDK? Или его нужно постоянно запрашивать самому?

Многопоточность

Обработка ответов на запрос выполняется в очереди главного потока, что делает невозможным стандартную практику, аля:

VKRequest *request = ...;
dispatch_semaphore_t sema = dispatch_semaphore_create(0);   
[request executeWithResultBlock:^(VKResponse *response) {
        ...
        dispatch_semaphore_signal(sema);
    } errorBlock: ... ];
dispatch_semaphore_wait(sema);

Стоит отметить, что RestKit подобным минусом не обладает.
Понятное дело, что ставить в блок главный поток - не лучшая практика, но иногда она бывает оправданна.

Pull request принимаются?

Exception Type: EXC_CRASH (SIGABRT)

Last Exception Backtrace:
0 CoreFoundation 0x2f845e7e exceptionPreprocess + 126
1 libobjc.A.dylib 0x39ba26c2 objc_exception_throw + 34
2 CoreFoundation 0x2f8496be +[NSObject(NSObject) doesNotRecognizeSelector:] + 198
3 CoreFoundation 0x2f8480aa __forwarding
+ 702
4 CoreFoundation 0x2f796dc4 forwarding_prep_0_ + 20
5 LoudSound 0x000a090a __31-[VKRequest executionOperation]_block_invoke (VKRequest.m:170)
6 LoudSound 0x0008cac0 __57-[VKHTTPOperation setCompletionBlockWithSuccess:failure:]_block_invoke443 (VKHTTPOperation.m:583)
7 libdispatch.dylib 0x3a0870be _dispatch_call_block_and_release + 6
8 libdispatch.dylib 0x3a0870aa _dispatch_client_callout + 18
9 libdispatch.dylib 0x3a0899a4 _dispatch_main_queue_callback_4CF + 264

Валится с версией от 31 января. Раньше все работало. Код как в примере. Причем валится не всегда но в 99%. Иногда работает без проблем.

И еще - больше для понимания. Где прочитать про цикл жизни авторизации. На сколько ключ выдается? К примеру в том-же Твитере мне нужно получить разрешение от пользователя только один раз. В vk api диалог на разрешение доступа выскакивает с завидной периодичностью опять и опять.

Too many requests per second

Привет

Хочу распарсить стену группы, новости, видео, репосты, их авторов и интермацию о них;
У меня вот такая ошибка, понимаю что ее не избежать и есть какие-то ограничение на запросы, интересно что это за ограниечение? И, например, если у нас есть стена группы Вк и мне нужно получить ее информацию в приложение, то каким методом лучше делать запросы?
(Например, если есть репост в добавок запрошиваю инфо и картинки автора репоста, если видео - запрошиваю доп инфо, если юзер - доп инфо). В итоге эта ошибка, и как я понимаю, не все данные получаю.

Error: Error Domain=VKSdkErrorDomain Code=-101 "Too many requests per second" UserInfo=0xbfcc140 {NSLocalizedDescription=Too many requests per second, VkErrorDescriptionKey=<VKError: 0xbfdc660;>}

Не получается авторизоваться

Добрый день. Пытаюсь реализовать авторизацию как в примере и по документации но ничего не выходит. Тестовое приложение с одним UIViewController, при вызове

[VKSdk authorize:@[VK_PER_FRIENDS, VK_PER_WALL, VK_PER_AUDIO, VK_PER_PHOTOS, VK_PER_NOHTTPS]];

открывается Safari и пытается пойти на страницу с авторизацие oAuth. Периодически ругается на Page not found, когда-же она появляется то после логина при нажатии на кнопку доверять, также ругается на инвалидный линк.
Запускается на iPhone 5 with iOS 7 на котором также установленно последнее VK app. Но authorize его не видет и открывает сафари. По документации же должно быть новое UIWebView или VK app....

Добавьте в хелп как обрабатывать запросы в формате JSON

Я новичек в разработке iOS
непонятен след. момент как
добавить в NSDictionary ответ сервера после выполнеия запроса и распарсить его без сторонних библиотек

VKRequest * getUserInfo = [VKRequest requestWithMethod:@"users.get" andParameters:@{VK_API_FIELDS : @"uid, first_name, last_name, photo_100"} andHttpMethod:@"GET"];

[getUserInfo 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);
}
}];

и еще хорошо бы добавит метод аунтефикации - если прошла авторизация возвратить YES иначе NO
Извиняюсь может чего не досмотрел я еще не искушен и не большого опыта в разработке для iOS. Спасибо.

You should definitely read Apple coding guidelines for Cocoa

From VK iOS SDK:

VKRequest * getWall = [VKRequest requestWithMethod:@"wall.get" andParameters:@{VK_API_OWNER_ID : @"-1"} andHttpMethod:@"GET"]; 

From Apple Coding Guidelines for Cocoa:

  • Don’t use “and” to link keywords that are attributes of the receiver. Although “and” may sound good, it causes problems as you create methods with more and more keywords.

Another example:

[VKSdk authorize:scope revokeAccess:YES]; 
  • If the method describes two separate actions, use “and” to link them.

etc.

Не возвращается токен

Такая же проблема как в этой задаче #44.

Но я вроде все правильно инициализировал, но все равно не работает.

Вот я настроил URL-schema http://gyazo.com/169dc6e777f05fbc52b383079024c1e2.

Вот инициализировал SDK

[VKSdk initializeWithDelegate:self andAppId:kVKAppID];

Вот запрос на авторизацию

VK_PERMISIONS = @[VK_PER_WALL, VK_PER_OFFLINE];
[VKSdk authorize:VK_PERMISIONS revokeAccess:YES forceOAuth:YES inApp:YES display:VK_DISPLAY_IOS];

Вот делегат

- (void)vkSdkShouldPresentViewController:(UIViewController *)controller {
    [viewController presentViewController:controller animated:YES completion:nil];
}

Но когда появляется webview и я в нею ввожу свои данные, нажимаю вход, потом нажимаю разрешить, контроллер скрывается и пишется DEALLOC:VKAuthorizeController, а делегат не вызывается.

Копался в библиотеке и в файле VKSdk.m нашел вот такой метод

+ (BOOL)processOpenURL:(NSURL *)passedUrl fromApplication:(NSString *)sourceApplication {
    if ([sourceApplication isEqualToString:@"com.vk.odnoletkov.client"] ||
         [sourceApplication isEqualToString:@"com.vk.client"] ||
         ([sourceApplication isEqualToString:@"com.apple.mobilesafari"] &&
        [passedUrl.scheme isEqualToString:[NSString stringWithFormat:@"vk%@", vkSdkInstance->_currentAppId]])
        )
        return [self processOpenURL:passedUrl];
    return NO;
}

Я так понимаю как раз проблема тут, потому что у меня данный метод, всегда возвращает NO.
Я попробовал закомментировать условие if, все заработало :)

ParseModel VKResponse

Здравствуйте, мне необходимо вписать в ответ response.json новую пару ключ-значение. При попытке установить parsemodel=false и самому получить ответ вываливается ошибка unrecognized selector sent to instance 0xb16a880.
VKRequest * wall = [VKRequest requestWithMethod:@"wall.get" andParameters:@{VK_API_OWNER_DOMAIN : @"tomcruise"} andHttpMethod:@"GET"];
wall.parseModel=false;
[wall executeWithResultBlock:^(VKResponse * response) {
arrayVK=[NSJSONSerialization JSONObjectWithData:response.json options:NSJSONReadingMutableContainers|NSJSONReadingMutableLeaves error:nil];
} errorBlock:^(NSError * error) {
if (error.code != VK_API_ERROR) {
[error.vkError.request repeat];
}
else {
NSLog(@"VK error: %@", error);
}
}];

Как можно решить эту проблему?

request for video

Использую этот запрос

VKRequest *request = [VKRequest requestWithMethod:@"video.get" andParameters:@{ VK_API_OWNER_ID :[NSNumber numberWithInt:[ownerId integerValue]], @"videos" : [NSString stringWithFormat:@"%@_%@", ownerId, videoId], @"width" : @320, @"count" : @1, @"extended" : @1 } andHttpMethod:@"GET"];
[request executeWithResultBlock: ^(VKResponse *response) {
    if (response.json[@"items"])
    {
        NSArray *responseArray = [NSArray arrayWithArray:response.json[@"items"]];
        if (responseArray.count > 0)
        {
            NSLog(@"%@",response.json);

Хочу получить ссылку на файл, с сайта Вк ответ выгрядит так:

response: {
count: 1,
items: [{
id: 167281563,
owner_id: 3907393,
title: 'This is what the Internet was made for 2012 Edition [HD]',
duration: 743,
description: '• Подписывайся на iFeed — vk.com/iFeed
• А так же Винегрет — vk.com/aVinegret',
date: 1389588320,
views: 1,
comments: 0,
photo_130: 'http://cs534310.vk.me/u176608917/video/s_8fdee2da.jpg',
photo_320: 'http://cs534310.vk.me/u176608917/video/l_3143dadb.jpg',
files: {
mp4_240: 'http://cs534310v4.vk.me/u176608917/videos/a0b4f66b34.240.mp4?extra=AIjTu4r9tzLoB1oiaEkTlbin0zCXvH67nALJ0cG0OuEuBa6spwU9oJSEbgIOogW6I95xzrsXPky2EVkWU8k8Rs_mrcYBVw',
.......

Мне не приходит Словарик files:
Почему?

VKAccessToken методы

Предлагаю к методам

[VKAccessToken saveTokenToDefaults:(NSString *)];
[VKAccessToken saveTokenToFile:(NSString *)];

[VKAccessToken tokenFromDefaults:(NSString *)];
[VKAccessToken tokenFromFile:(NSString *)];

добавить методы

[VKAccessToken removeTokenFromDefaults:(NSString *)];
[VKAccessToken removeTokenFromFile:(NSString *)];

и для упрощения ввести методы без указания ключа

[VKAccessToken saveTokenToDefaults];
[VKAccessToken saveTokenToFile];

[VKAccessToken tokenFromDefaults];
[VKAccessToken tokenFromFile];

[VKAccessToken removeTokenFromDefaults];
[VKAccessToken removeTokenFromFile];

Авторизация с иностранного IP и подтверждение вводом телефонного номера

Приветствую!
Был у меня репорт следующего рода: AndrewShmig/Vkontakte-iOS-SDK-LV#87

Вопрос: каким образом на локальном компьютере с использованием симулятора можно оттестировать получение страницы (и её обработку) security check?

Благодарю.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.