ios - 如何使用safari获取授权代码以登录和交换访问令牌?

时间:2016-10-05 12:45:46

标签: ios objective-c safari

我最近构建了一个应用程序,但最后一步是将数据发布到Runkeeper网站。我的应用程序有视图控制器,它有登录和取消授权的按钮。但是,当我使用Oauth2打开safari登录我的应用程序的帐户。从野生动物园回来并重新打开我的应用程序。我不知道如何检查我是否有授权码。而且我还想交换访问令牌以将我的数据发布到Runkeeper网站。但我完全不知道将应用程序与API连接。我看过很多关于google API,youtube API的教程,但它们与Runkeeper不同。这是我的代码:

- (void)viewDidLoad {
    [super viewDidLoad];
    NSLog(@"View did Load!");
    kIDMOAuth2ClientId = @"....";
    kIDMOAuth2ClientSecret = @"....";
    kIDMOAuth2AuthorizationURL = @"https://runkeeper.com/apps/authorize";
    kIDMOAuth2TokenURL = @"https://runkeeper.com/apps/token";
    kIDMOAuth2AccountType = @"token";//authorization_code  //Runkeeper API
    kIDMOAuth2SuccessPagePrefix = @"Success";
    kIDMOAuth2RedirectURL = @"Landice://";
    kIDMOAuth2DeauthorizationURL = @"https://runkeeper.com/apps/de-authorize";
    runkeeperButton *runkeeperString=[runkeeperButton getInstance];
    NSLog(@"%@", runkeeperString.str);
    if ((runkeeperString.str == NULL) || [runkeeperString.str isEqualToString:@"Authorize"]) {
        buttonToggled = YES;
        [loginandoutButton setTitle:@"Login & Authorize" forState:UIControlStateNormal];
        NSLog(@"66666");
        NSLog(@"%@", runkeeperString.str);
    }else if ([runkeeperString.str isEqual:@"Deauthorize"]){
        buttonToggled = NO;
        [loginandoutButton setTitle:@"Deauthorize" forState:UIControlStateNormal];
        NSLog(@"77777");
        NSLog(@"%@", runkeeperString.str);
    }
    loginandoutButton.layer.cornerRadius = 10;
}

- (IBAction)toggleButton:(id)sender {
    runkeeperButton *runkeeperString=[runkeeperButton getInstance];
    // "Deauthorize" button clicked
    if (!buttonToggled) {
        [sender setTitle:@"Login & Authorize" forState:UIControlStateNormal];
        buttonToggled = YES;
        runkeeperString.str = @"Authorize";
    }
    // "Login & Authorize" button clicked
    else {
        [sender setTitle:@"Deauthorize" forState:UIControlStateNormal];
        buttonToggled = NO;
        runkeeperString.str = @"Deauthorize";
        //[self requestOAuth2Access];

        NSURL *url = [NSURL URLWithString:@"https://runkeeper.com/apps/authorize?response_type=code&client_id=[SOMETHING]&redirect_uri=landice://response&duration=permanent&scope=read"];
        [[UIApplication sharedApplication] openURL:url];
        if ([[UIApplication sharedApplication] canOpenURL:url]) {
            [[UIApplication sharedApplication] openURL:url];
        }

        else if (![[UIApplication sharedApplication] canOpenURL:url]) {
            NSLog(@"%@%@",@"Failed to open url:",[url description]);
        }
    }
}

我的问题是: 1.如何从safari获取授权代码以及如何检查我是否已获得授权代码。 2.我听说授权码不稳定,因此如何交换访问令牌以及如何检查访问令牌已过期。如果过期,如何获得另一个。 3.如何通过JSON将数据从核心数据发布到Runkeeper网站。

先谢谢。

1 个答案:

答案 0 :(得分:0)

您是否必须在Safari中打开该网站?我不确定甚至可以从这样的其他应用程序中获取数据,特别是如果它不在您自己定义的应用程序组中(并且您只能将自己的应用程序放入这样的组中) 。基本上Safari就是沙盒,就像你的应用程序一样。我不知道如何将从页面加载的数据返回给您的应用。

相反,我会建议您使用WKWebView在您的应用中为此目的设计自己的小浏览器窗口。然后,您可以跳过[[UIApplication sharedApplication] openURL:url],而是打开另一个加载Runkeeper页面的视图。从那里你应该能够通过评估java脚本(或为此注入你自己的脚本)来访问数据。我自己也不认识Runkeeper,所以我不知道你会怎么做,但我确定有某种方式。

这是更多的工作,但是您的用户不必为了授权而切换应用程序。

哦,所有这些假设您必须加载页面并且不能使用Runkeeper提供的某些API。也许您也可以使用NSURLSessionDataTask来调用授权,只需在返回时从NSHTTPURLResponse对象获取令牌?