准备工作:第三方账号申请和绑定 http://dev.umeng.com/social/ios/operation
1.集成与配置1.1集成。(可参考http://dev.umeng.com/social/ios/quick-integration#1)这一步友盟的集成文档也写得很清楚,可以通过下载SDK手动集成,也可以cocoapods集成。
1.2.配置SSO白名单、URL Scheme(地址协议)(参考http://dev.umeng.com/social/ios/quick-integration#1_3).
SSO白名单
如果不添加跳转目的APP白名单,会出现下面错误
-canOpenURL: failed for URL: "weixin://app/wx9**********dfd30/" - error: "This app is not allowed to query for scheme weixin"
什么是URL Schemes?URL Schemes是苹果给出的用来跳转到系统应用或者跳转到别人的应用的一种机制。同时还可以在应用之间传数据。通过对比网页链接来理解 iOS 上的 URL Schemes,应该就容易多了。URL Schemes 有两个单词:URL,我们都很清楚,http://www.apple.com就是个 URL,我们也叫它链接或网址;Schemes,表示的是一个 URL 中的一个位置——最初始的位置,即 ://之前的那段字符。比如 http://www.apple.com这个网址的 Schemes是 http。根据我们上面对 URL Schemes 的使用,我们可以很轻易地理解,在以本地应用为主的 iOS 上,我们可以像定位一个网页一样,用一种特殊的 URL 来定位一个应用甚至应用里某个具体的功能。而定位这个应用的,就应该是这个应用的 URL 的 Schemes 部分,也就是开头儿那部分。
2.初始化设置
2.1初始化U-Share及第三方平台
根据自己的项目需求初始化相对应的平台,QQ、微博、微信三个也是最常用的。
可以参考我司大神的一些习惯
将相应的初始化工作写在分类里 然后再在AppDelegate.m里调用
#import "AppDelegate.h"
@interface AppDelegate (UMeng)
- (void)umeng_application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions;
- (BOOL)umeng_application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation;
@end
#import "AppDelegate+UMeng.h"
//登录
#import <UMSocialCore/UMSocialCore.h>
@implementation AppDelegate (UMeng)
- (void)umeng_application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
//登录
[[UMSocialManager defaultManager] setUmSocialAppkey:kUmengAppKey];
[[UMSocialManager defaultManager] setPlaform:UMSocialPlatformType_WechatSession appKey:kWechatAppId appSecret:kWechatAppSecret redirectURL:kUMengShareUrl];
[[UMSocialManager defaultManager] setPlaform:UMSocialPlatformType_QQ appKey:kQQAppId appSecret:nil redirectURL:kUMengShareUrl];
[[UMSocialManager defaultManager] setPlaform:UMSocialPlatformType_Sina appKey:KSinaAppKey appSecret:kSinaAppSecret redirectURL:kSinaCallbackUrl]; }
- (BOOL)umeng_application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {
return [[UMSocialManager defaultManager] handleOpenURL:url sourceApplication:sourceApplication annotation:annotation];
}
然后可以在AppDelegate.m文件里调用、这样的做法能够减少AppDelegate.m文件沉冗。而且,如果项目中接入多个第三方SDK、这样也能够更加清晰的管理每个第三方SDK.
在调用登录前、先说下目前项目第三方登录的流程。
①:向第三方发起请求获取公开信息,头像、名字。还有token等等。
②:拿到第三方服务器成功返回相应数据。
③:将拿到的第三方数据作为参数、与自己的服务器进行通信,把数据传给后台处理。(一般我们不需要知道后台怎么处理第三方得来的数据,只需要知道后台返回什么数据给我们,我们本地做哪些处理就可以。一般后台会判断,如果是第一次登录,会将用户插入数据库并返回数据,如果不是则直接查询数据库相匹配的数据并返回数据。)
④:后台成功返回数据后、将相应个人信息或登录状态等信息储存在本地,以便其他页面做一些登陆后的相关操作。
登陆后可以用已储存的个人信息或登录状态为依据来判断是否已登录。而退出登录只需要将储存的个人信息或登录状态移除即可。
3.调用登录
//友盟集成登录
- (void)umengLoginWithThridLoginType:(ICDThridLoginType)thirdLoginType controller:(UIViewController *)controller completion:(LoginCompletionBlock)completion {
UMSocialPlatformType umPlatformType = [self umPlatformTypeWithThridLoginType:thirdLoginType];
__weak typeof(self) weakSelf = self;
[[UMSocialManager defaultManager] getUserInfoWithPlatform:umPlatformType currentViewController:controller completion:^(id result, NSError *error) {
if (!error) {
UMSocialUserInfoResponse *resp = result;
ICDLoginAPIParam *param = [[ICDLoginAPIParam alloc] init];
if (thirdLoginType == ICDThridLoginTypeWeibo) {
param.openid = resp.usid;
} else {
param.openid = resp.openid;
}
param.accessToken = resp.accessToken;
param.fromApp = thirdLoginType;
param.nickname = resp.name;
param.avatarUrl = resp.iconurl;
param.gender = [weakSelf icdGenderWithUMGender:resp.unionGender]; param.wxUnionId = resp.unionId;
//与公司服务器进行通信,将公司返回的数据进行处理并显示出来。
[weakSelf icdLoginWithParam:param completion:completion];
} else {
// //登录时的错误判断与处理 // if (completion) {
// completion(NO,nil,error);
// }
}
}];
第三方登录时出现的小问题
1. iOS-OC-新浪微博登录报错redirect_uri_mismatch
原因是新浪开发平台新建APP后,没有修改回调url,回调url要和APP中设置的回调url一致;
链接:http://blog.csdn.net/u014220518/article/details/52291137
2. 新浪微博 sso package or sign error 原因---iOS
新浪sso授权报错sso package or sign error
新浪微博开放平台应用没有审核通过,不能用sso登陆,否则报错,关闭sso登陆
原因:可能是由于您在新浪微博开发者平台上,注册的app所使用的Bundle ID和现在程序中运行的Bundle ID 不一致所导致的
解决: 可以修改新浪开发者平台上,填写的Bundle ID 或者是修改目前运行程序的bundle ID