Отключить WebView после аутентификации OAuth2.0 FitBit с OAuthSwift в Задаче C

Я пытаюсь получить данные пользователя FitBit с помощью библиотеки OAuthSwift в приложении на основе Objective C. Я не могу заставить веб-просмотр отклоняться после того, как пользователь нажал "Разрешить" и отображается URL-адрес обратного вызова, но не сработали ни блоки успеха, ни ошибки функции авторизации, поэтому у меня также нет доступа к каким-либо данным. Он просто останавливается на URL обратного вызова, и пользователь ничего не может сделать, чтобы выйти из веб-просмотра.

Все это - переосмысление документации от быстрой до целевой c, так что может быть проблема с моим переводом, но я не понимаю, почему это не сработает, и основываясь на том, что я прочитал на их (и других людях) github библиотеке совместим с приложением на основе Obj-C.

В моем AppDelegate у меня есть:

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url 
sourceApplication:(nullable NSString *)sourceApplication annotation:
(id)annotation
{
    if([url.host  isEqual: @"CALLBACKURL"])
    {
        [OAuthSwift handleWithUrl:url];
        [self.window.rootViewController dismissViewControllerAnimated:YES completion:nil];
        NSLog(@"Dismiss View");
    }
    NSLog(@"THIS IS BEING CALLED");
    return YES;
}


- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString *,id> *)options
{
    if([url.host  isEqual: @"CALLBACKURL"])
    {
        [OAuthSwift handleWithUrl:url];
        [self.window.rootViewController dismissViewControllerAnimated:YES completion:nil];
        NSLog(@"Dismiss View");
    }
    NSLog(@"THIS IS BEING CALLED");
    return YES;
}

И в контроллере представления, который представляет процесс аутентификации у меня есть:

- (IBAction)synchFitBit:(id)sender
{
    NSDictionary *parameters = @{
                             @"consumerKey": @"MYKEY",
                             @"consumerSecret": @"MYSECRET",
                             @"authorizeUrl": @"https://www.fitbit.com/oauth2/authorize",
                             @"accessTokenUrl": @"https://api.fitbit.com/oauth2/token",
                             @"responseType" : @"code"
                             };


    OAuth2Swift *oauth = [[OAuth2Swift alloc] initWithParameters:parameters];
    oauth.client.paramsLocation = ParamsLocationRequestURIQuery;

    SafariURLHandler *safariURLHandler = [[SafariURLHandler alloc] initWithViewController:self oauthSwift:oauth];
    safariURLHandler.delegate = self;
    oauth.authorizeURLHandler = safariURLHandler;


    [oauth objc_authorizeWithCallbackURL:@"CALLBACKURL" scope:@"activity" state:@"" parameters:parameters headers:parameters
                              success:^(OAuthSwiftCredential *credential, OAuthSwiftResponse *response, NSDictionary<NSString *,id> *parameters) {
                                  NSString *userId = parameters[@"userid"];

                                  NSLog(@"SUCSESS: %@",userId);
                              }
                              failure:^(NSError *error) {
                                  NSLog(@"FAILURE");
                              }];

}

Ни одна из NSLogs в этих функциях не появляется в консоли, поэтому я в основном заблудился. Даже если бы я мог дать пользователю способ закрыть свое веб-представление, одновременно вызывая успешный блок objc_authorizeWithCallback URL, это было бы хорошо. Я ценю любой совет и дайте мне знать, если я должен предоставить больше кода / информации. Спасибо!

Редактировать: изменено веб-представление на SFViewController на основе комментариев. Теперь пользователь видит кнопку "Готово", которая правильно запускает функцию safariViewControllerDidFinish, но я до сих пор не вижу никаких данных или каких-либо успехов или неудач, связанных с процессом OAuth2.0.

1 ответ

Не уверен, что кто-нибудь еще столкнется с этой ошибкой, но я мог бы также опубликовать то, что исправило это для меня.

Ключ должен установить пользовательскую схему URL в "Типах URL" в YourProjectTarget>Info, а затем использовать схему в URL обратного вызова, чтобы делегат приложения мог ее забрать. Так что если вы установите свою схему на "myscheme", то ваш URL обратного вызова должен выглядеть как myscheme://www.mycallbackurl.com/

Надеюсь, это поможет кому-то!

Другие вопросы по тегам