VKCOM / vk-ios-sdk

iOS library for working with VK API, authorization through VK app, using VK functions
MIT License
296 stars 167 forks source link

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

Closed sartemd174 closed 10 years ago

sartemd174 commented 10 years ago

Здравствуйте, уже несколько дней не могу разобраться с непонятной причиной падения приложения при попытке выполнить запрос. Опишу подробно последовательность моих действий: 1)Создаю podFile. Делаю pod install. Библиотека успешно устанавливается. Запускаю только что созданный workspace. И сразу же у меня повляются ошибки на 2 строчки из VKSdk.h @import Foundation; @import UIKit; Не долго думая, я удалил обе строки 2) Затем прописал URLTypes, в свой .h файл добавил #import @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 Помогите пожалуйста разобраться.

RomanTruba commented 10 years ago

Вы используете Xcode 4?

sartemd174 commented 10 years ago

Я использую XCode 5.0.2

RomanTruba commented 10 years ago

Вообще, приведённый вами код - неправильное использование SDK. После авторизации [VKSdk authorize:@[VK_PER_FRIENDS, VK_PER_WALL, VK_PER_PHOTOS, VK_PER_NOHTTPS, VK_PER_MESSAGES] revokeAccess:YES]; нужно поймать событие делегата, оповещающее о получении нового токена (ведь это асинхронная операция), а затем выполнять запросы. Возможно, ошибка происходит вследствие переполнения стека при вызове [error.vkError.request repeat];. Попробую изменить такое поведение

RomanTruba commented 10 years ago

Я сделал небольшой фикс, чтобы ошибки отсылались в асинхрон. Но вам всё равно нужно исправить ваш код, и совершать запросы только после получения токена доступа.