大家都知道,应用在从浏览器跳回到应用时会在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换成你自己的方法,这个还是要谨慎使用。