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

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

Closed iSpartak closed 10 years ago

iSpartak commented 10 years ago

Добрый день. Пытаюсь реализовать авторизацию как в примере и по документации но ничего не выходит. Тестовое приложение с одним 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....

RomanTruba commented 10 years ago

Приложение с возможностью авторизации в данный момент еще не прошло проверку в appstore. Опубликуйте полный код своего контроллера. Работает ли у вас пример?

iSpartak commented 10 years ago

Создал совсем новый проект с одним контроллером. В контролере один UIButton который вызывает authorize

Вот код

Добавил sdk директорию (исходники) в проект. (там поддиректории sdk, SDK resources. В Target sdk.xcodeproj стоит VKSdf)

Добавил URL с моим APP ID в Info Скомпилировал Добавил libVKSdk.a в Link Binary With Library Запускаю на симуляторе

При нажатии на кнопку открывается окно Сафари (не в app) которое имеет заглавие VK SDK test app. При авторизации меня перекидывает обратно но не к себе в приложение а в ваше тестовое!

RomanTruba commented 10 years ago

Здесь [VKSdk initializeWithDelegate:self andAppId:@"3974615"]; Должен быть идентификатор вашего приложения. Это ид тестового

iSpartak commented 10 years ago

Однако плохо быть бестолковым или о вреде програмирования по-ночам ,)

Спасибо большое - ступил, да!

kompw commented 10 years ago

Здравствуйте! у меня проблема с вашей sdk! все сделал по инструкции за исключением libVKSdk.a(она не находится на в вашем примере не так) нажимаю на авторизироваться, открывается окно браузера там нажимаю разрешить, возвращаюсь обратно в приложение и ни один метод делегата не срабатывает((

RomanTruba commented 10 years ago

@kompw, какая версия библиотеки? (можно посмотреть константой VK_SDK_VERSION)

kompw commented 10 years ago

1.0.6.1 последняя! я ее качал с исходников гитхаба! не пойму почему не хочет запускаться... я уже тестовое приложение замутил но тоже самое...

paparotnick commented 10 years ago

Такая же беда!!

RomanTruba commented 10 years ago

В делегате приложения прописано

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

?

kompw commented 10 years ago

да)

RomanTruba commented 10 years ago

Заходит ли туда дебагер, если поставить брейкпоинт?

paparotnick commented 10 years ago

а у меня другая проблема, libvksdk не находит, в ручную папку sdk копировал, теперь на [VKSdk initializeWithDelegate:self andAppId:@"мой айди"]; if ([VKSdk wakeUpSession]) { [self startWorking]; } if ([VKSdk wakeUpSession]) - возваращает всегда NO

kompw commented 10 years ago

нет! ни один из подключенных методов делегата не срабатывает libvksdk у меня тоже не подключается) она походу и не существует) ибо в проекте примере ее тоже нету!

wakeUpSession - сработает как не странно но после захода по новой на этот экран(проверка прописана у меня в viewDidLoad) суть только в том что при первом клике ничего нету да и при последующих только это срабатывает

RomanTruba commented 10 years ago

@paparotnik это работает так:

if ([VKSdk wakeUpSession])
{
    [self startWorking];
}
else {
    [VKSdk authorize:SCOPE];
}

@kompw если у вас не срабатывают делегаты приложения (не SDK), вам следует задать класс делегата при инициализации приложения в main.m Пример main.m:

int main(int argc, char * argv[])
{
    @autoreleasepool {
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([VKAppDelegate class]));
    }
}
RomanTruba commented 10 years ago

Обновил для вас пример, может быть полезно

kompw commented 10 years ago

Вы меня не совсем поняли)) не срабатывают методы делегата VKSdkDelegate и так что у меня сделано: 1) скопирована в новый проект вся папка sdk 2) подключен VKSdkDelegate 3) прописан #import "VKSdk.h" 4) зареген свой id приложения 5) в viewDidLoad [VKSdk initializeWithDelegate:self andAppId:idVk]; 5) в методе кнопки "авторизации" [VKSdk authorize:@[VK_PER_FRIENDS, VK_PER_WALL, VK_PER_AUDIO, VK_PER_PHOTOS, VK_PER_NOHTTPS]]; 6) и методы делегата

}

-(void) vkSdkDidReceiveNewToken:(VKAccessToken) newToken{ NSLog(@"xcvxfv"); NSMutableDictionary d = [NSMutableDictionary new]; [d setObject:socMasenger forKey:@"message"]; [[VKApi wall] post:d]; }

и вот ни один из методов делегата VKSdkDelegate не срабатывает, хотя мы видим страницу VK авторизируемся, даем разрешение на доступ и возвращаемся обратно... и ничего(

RomanTruba commented 10 years ago

@kompw Хорошо. Давайте по шагам. Во-первых, скачайте последнюю версию. Там методы делегата переименованы (например, vkSdkDidReceiveNewToken -> vkSdkReceivedNewToken) Во-вторых,

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

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

@implementation VKAppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    // Override point for customization after application launch.
    self.window.backgroundColor = [UIColor whiteColor];
    [self.window makeKeyAndVisible];
    self.window.rootViewController = [[UIStoryboard storyboardWithName:@"Storyboard" bundle:nil] instantiateInitialViewController];
    [self.window addSubview:self.window.rootViewController.view];
    return YES;
}

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

@end

В-третьих, удобно делать делегатом SDK какой-нибудь root view controller (как у меня в примере). Если проблемы так и не решатся, скиньте архив своего проекта мне в личку vk.com/dredd , попробуем разобраться, что не так

kompw commented 10 years ago

версия 1.0.6.3

paparotnick commented 10 years ago

А проблема с libsdk, которое не видно, если ставить вручную, как решается?

RomanTruba commented 10 years ago

@kompw присылайте код архивом @paparotnik в Target Dependencies проект добавлен?

Anatoliy-Kondrik commented 8 years ago

Здравствуйте. Пожалуйста, помогите разобраться...

sdk скачал на днях, собрал xcode, подключил libVKSdk.a к qt-проекту. Вызываю [VKSdk authorize:SCOPE];, открывается окно запроса доступа, нажимаю Allow, возврат в моё приложение не выполняется и не вызывается методы делегата. VK_SDK_VERSION: 1.3.13

Скорее всего, дело в моей реализации делегата для vk sdk. Коды...

static NSArray *SCOPE = nil;
static VKDelegate *vkDeleg = nil;
static VKSdk *sdkInstance = nil;

bool IosUtils::loginTthroughVKontakteSDK()
{
        sdkInstance = [VKSdk initializeWithAppId:@"5291592"]; // TEST
        vkDeleg = [[VKDelegate alloc] init];
        [sdkInstance registerDelegate:vkDeleg];
        [sdkInstance setUiDelegate:vkDeleg];

        [VKSdk wakeUpSession:SCOPE completeBlock:^(VKAuthorizationState state, NSError *error) {
            if (state == VKAuthorizationInitialized) {
                SCOPE = @[VK_PER_FRIENDS, VK_PER_WALL];
                [VKSdk authorize:SCOPE];
             }
        }];
}

@interface VKDelegate : NSObject <VKSdkDelegate, VKSdkUIDelegate>
@end

@implementation VKDelegate

- (void)vkSdkAccessAuthorizationFinishedWithResult:(VKAuthorizationResult *)result
{
   NSLog(@">>>>>>>>>>>>>>>>>>>>> vkSdkAccessAuthorizationFinishedWithResult!");
}

- (void)vkSdkUserAuthorizationFailed {
    NSLog(@">>>>>>>>>>>>>>>>>>>>> vkSdkUserAuthorizationFailed!");
}

- (void)vkSdkShouldPresentViewController:(UIViewController *)controller {
        NSLog(@">>>>>>>>>>>>>>>>>>>>> vkSdkShouldPresentViewController!");
}

- (void)vkSdkNeedCaptchaEnter:(VKError *)captchaError {
        NSLog(@">>>>>>>>>>>>>>>>>>>>> vkSdkNeedCaptchaEnter!");
}
@end

В app делегате openUrl прописан, но не разу не был вызван

- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {
    Q_UNUSED(app)

    NSLog(@" >>>>>>>>>>>>>>>>>>>>>>> befor OPEN URL");
    bool wasHandled = [VKSdk processOpenURL:url fromApplication:sourceApplication];
    if (wasHandled)
        return wasHandled;
    NSLog(@" >>>>>>>>>>>>>>>>>>>>>>> AFTER OPEN URL");
...
}

Единственный вызов делегата sdk происходит, если вручную перейти на своё приложение после неудачной авторизации. Вызывается метод:

- (void)vkSdkShouldPresentViewController:(UIViewController *)controller {
        NSLog(@">>>>>>>>>>>>>>>>>>>>> vkSdkShouldPresentViewController!");
}
Anatoliy-Kondrik commented 8 years ago

Нашел свою ошибку. Не был выполнен пункт из инструкции Setup URL-schema of Your Application.

NikKovIos commented 8 years ago

Тем, у кого всё ещё проблемы с тем, что не вызывается метод в App Delegate: https://dev.twitter.com/cards/mobile/url-schemes https://developer.apple.com/library/content/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/Inter-AppCommunication/Inter-AppCommunication.html#//apple_ref/doc/uid/TP40007072-CH6-SW10 И наиболее удобно: https://developers.facebook.com/docs/ios/getting-started

Нужно настроить URL types, чтобы к приложению можно было обращаться извне и API знало, как это делать: vk{your-app-id}.

Ещё тут неплохой гайд https://github.com/west0r/SwiftyVK

ValeriyJefimov commented 7 years ago

Добрый день, приложение после логина , при повторном входе все равно требует подтвердить разрешение (allow app to).

}