首页 > OAuth认证 应用回调函数位置更改

OAuth认证 应用回调函数位置更改

大家都知道,应用在从浏览器跳回到应用时会在appdelegate中调用如下方法:

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

    NSLog(@"url = %@",url.absoluteString);
    NSLog(@"sourceApplication = %@",sourceApplication);

    [[MBGithubOAuthClient sharedClient] tokenRequestWithCallbackURL:url
                                                       saveOptions:kMBSaveOptionsKeychain
                                                        completion:^(BOOL success, NSError *error) {
                                                            if (error || !success) {
                                                                NSLog(@"Token request failed: %@", error.localizedDescription);
                                                            } else {
                                                                // Saved to user defaults...
                                                                NSLog(@"Saved token");
                                                            }
                                                        }];
    return YES;
}

在这里我对返回的url参数可以做处理,可是业务代码不可能写在这里,我应该如何做,使得的可以将回调方法定义在任何位置,类似友盟在controller类中的如下方法:

-(void)didFinishGetUMSocialDataInViewController:(UMSocialResponseEntity *)response
{
    //根据`responseCode`得到发送结果,如果分享成功
    if(response.responseCode == UMSResponseCodeSuccess)
    {
        //得到分享到的微博平台名
        NSLog(@"share to sns name is %@",[[response.data allKeys] objectAtIndex:0]);
    }

    if (response.viewControllerType == UMSViewControllerOauth) {
        NSLog(@"didFinishOauthAndGetAccount response is %@",response);
    }
}

当然我希望如果可以,实现如下的回调方式:

[[OAuthSignUtil sharedOAuthSignUtil] signInto:SignIntoGithub completion:^(BOOL success,NSError *error){
        //做回调处理
    }];

即我使用signInto:SignIntoGithub方法去获取授权,然后回调成功之时,之后在下面的block做处理,请各位大牛不吝赐教


自问自答一下,我最后觉得使用通知机制来解决此问题,有更好方式的哥们们请 @MexiQQ

上面的答案是我昨天给出的,但是我觉的实现太不优雅,且无法完美的封装,最后我采取了另一种分装,就是自己写了个 Delegate, 下面做出解释:

- (BOOL)application: (UIApplication *)application openURL: (NSURL *)url sourceApplication: (NSString *)sourceApplication annotation: (id)annotation {
    if([url.absoluteString containsString:@"gitauth"]){
        return [[MBGithubOAuthClient sharedClient] handleOpenURL:url];
    }else{
        return [GPPURLHandler handleURL:url
                      sourceApplication:sourceApplication
                             annotation:annotation];

    }
}

如上所示,我参考友盟提供的方法对github账号的第三方登陆进行了封装,首先在应用回调里执行了 handleOPenURL方法,此方法在 MBGithubOAuthClient 中定义如下:

- (BOOL)handleOpenURL:(NSURL *)url{
[self tokenRequestWithCallbackURL:url saveOptions:kMBSaveOptionsKeychain completion:^(BOOL success, NSError *error) {
}];
return YES;

}

上面的 tokenRequestWithCallbackURL 方法我对 返回的URL(即回调地址:此时内部带有code) 做出处理,获取token值,在获取成功时,我执行此条语句:

 [self finishOAuth:accessTokenData];

在此方法中我绑定了代理方法:

- (void)finishOAuth:(NSString *)accessToken{
    [_mydelegate didFinishGithubOAuth:accessToken];
}

这样,我就可以通过代理实现回调了


通知吧,通知可以用block。再封装的话意义不是特别大。


简单想了一下,你可以直接在openURL方法中使用[[OAuthSignUtil sharedOAuthSignUtil] receiveResponse]来调用block(恩,首先你得在signInto中持有这个block)

如果你不相在openURL方法中暴露你的调用,用method swizzling把openURL换成你自己的方法,这个还是要谨慎使用。

【热门文章】
【热门文章】