Отключить 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/
Надеюсь, это поможет кому-то!