第三方登錄
一.第三方登錄的定義
第三方登錄,就是利用用戶在第三方平臺上已有的賬號來快速完成自己應(yīng)用的登錄流程。這里的第三方平臺,如新浪微博,QQ,微信,F(xiàn)acebook,Twitter等平臺。這里我們可以登錄獲取相應(yīng)的用戶信息和授權(quán)信息,例如uid,token等。用戶可以獲取到信息用來做自己的操作。
二.獲取AppKey
如何在我們的官網(wǎng)注冊應(yīng)用得到appkey,請點擊鏈接看里面的操作步驟
三.下載SDK
請點擊這里進(jìn)去下載相應(yīng)的sdk
四.快速集成
第一步:將下載的SDK解壓后導(dǎo)入到您的工程中,見下圖

拖到工程中后彈出以下對話框,勾選”Copy items into destination group’s folder(if needed)”,并點擊“Finish“按鈕。
注意:請務(wù)必在上述步驟中選擇“Create groups for any added folders”單選按鈕組。如果你選擇“Create folder references for any added folders”,一個藍(lán)色的文件夾引用將被添加到項目并且將無法找到它的資源。
第二步:添加依賴庫 添加步驟見下圖

必須添加的依賴庫如下(Xcode7 下.dylib庫后綴名更改為.tbd)
- libicucore.tbd
- libz.tbd
- libstdc++.tbd
- JavaScriptCore.framework

以下依賴庫根據(jù)社交平臺添加:
新浪微博SDK依賴庫
- ImageIO.framework
- libsqlite3.dylib
QQ好友和QQ空間SDK依賴庫
- libsqlite3.dylib
微信SDK依賴庫
- libsqlite3.dylib
短信和郵件需要依賴庫
- MessageUI.framework
(注意:若不想導(dǎo)入不需要的平臺的依賴庫,可以到 ShareSDK 下的 PlatformSDK 文件夾將不需要的原生 SDK 移除。)
第三步:設(shè)置ShareSDK的Appkey并初始化對應(yīng)的第三方社交平臺 打開AppDelegate.m(代表你的工程名字)導(dǎo)入頭文件
#import <ShareSDK/ShareSDK.h>
#import <ShareSDKConnector/ShareSDKConnector.h>
//騰訊開放平臺(對應(yīng)QQ和QQ空間)SDK頭文件
#import <TencentOpenAPI/TencentOAuth.h>
#import <TencentOpenAPI/QQApiInterface.h>
//微信SDK頭文件
#import "WXApi.h"
//新浪微博SDK頭文件
#import "WeiboSDK.h"
//新浪微博SDK需要在項目Build Settings中的Other Linker Flags添加"-ObjC"
//人人SDK頭文件
//#import <RennSDK/RennSDK.h>
在- (BOOL)application: didFinishLaunchingWithOptions:方法中調(diào)用registerApp方法來初始化SDK并且初始化第三方平臺(各社交平臺申請APPkey 的網(wǎng)址及申請流程匯總)
微信審核

QQ審核

微博審核 --- 被駁回了(就你丫牛B)

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
/**
* 設(shè)置ShareSDK的appKey,如果尚未在ShareSDK官網(wǎng)注冊過App,請移步到http://mob.com/login 登錄后臺進(jìn)行應(yīng)用注冊,
* 在將生成的AppKey傳入到此方法中。
* 方法中的第二個第三個參數(shù)為需要連接社交平臺SDK時觸發(fā),
* 在此事件中寫入連接代碼。第四個參數(shù)則為配置本地社交平臺時觸發(fā),根據(jù)返回的平臺類型來配置平臺信息。
* 如果您使用的時服務(wù)端托管平臺信息時,第二、四項參數(shù)可以傳入nil,第三項參數(shù)則根據(jù)服務(wù)端托管平臺來決定要連接的社交SDK。
*/
[ShareSDK registerApp:@"11fc7045d2ea6"
activePlatforms:@[
@(SSDKPlatformTypeSinaWeibo),
@(SSDKPlatformTypeWechat),
@(SSDKPlatformTypeQQ)]
onImport:^(SSDKPlatformType platformType)
{
switch (platformType)
{
case SSDKPlatformTypeWechat:
[ShareSDKConnector connectWeChat:[WXApi class]];
break;
case SSDKPlatformTypeQQ:
[ShareSDKConnector connectQQ:[QQApiInterface class] tencentOAuthClass:[TencentOAuth class]];
break;
case SSDKPlatformTypeSinaWeibo:
[ShareSDKConnector connectWeibo:[WeiboSDK class]];
break;
default:
break;
}
}
onConfiguration:^(SSDKPlatformType platformType, NSMutableDictionary *appInfo)
{
switch (platformType)
{
case SSDKPlatformTypeSinaWeibo:
//設(shè)置新浪微博應(yīng)用信息,其中authType設(shè)置為使用SSO+Web形式授權(quán)
[appInfo SSDKSetupSinaWeiboByAppKey:@"568898243"
appSecret:@"38a4f8204cc784f81f9f0daaf31e02e3"
redirectUri:@"http://www.sharesdk.cn"
authType:SSDKAuthTypeBoth];
break;
case SSDKPlatformTypeWechat:
[appInfo SSDKSetupWeChatByAppId:@"wx073d3a1ae1e04e45"
appSecret:@"51fbf957c83027d82cd90e1b42943271"];
break;
case SSDKPlatformTypeQQ:
[appInfo SSDKSetupQQByAppId:@"1105278967"
appKey:@"GUHbR2DyrVPo4ZY8"
authType:SSDKAuthTypeBoth];
break;
default:
break;
}
}];
self.window = [[UIWindow alloc]initWithFrame:[UIScreen mainScreen].bounds];
ViewController *vc = [[ViewController alloc]init];
self.window.rootViewController = vc;
[self.window makeKeyAndVisible];
return YES;
}
(注意:每一個case對應(yīng)一個break不要忘記填寫,不然很可能有不必要的錯誤,新浪微博的外部庫如果不要客戶端分享或者不需要加關(guān)注微博的功能可以不添加,否則要添加,QQ,微信,google+這些外部庫文件必須要加)
第四步:添加實現(xiàn)代碼 打開需要集成登錄功能的視圖源碼,把如下代碼復(fù)制并粘貼到你要登錄的位置,例如到響應(yīng)登錄按鈕的方法中。并且修改相應(yīng)的參數(shù)即可。
這里以QQ登陸為例
(其他的平臺也一樣的處理,修改下初始化以及登陸方法里的平臺類型參數(shù):微信登錄-> SSDKPlatformTypeWechat,新浪微博登錄->SSDKPlatformTypeSinaWeibo,文檔最后介紹各個平臺需要配置的url schemes 參數(shù))
//例如QQ的登錄
[ShareSDK getUserInfo:SSDKPlatformTypeQQ
onStateChanged:^(SSDKResponseState state, SSDKUser *user, NSError *error)
{
if (state == SSDKResponseStateSuccess)
{
NSLog(@"uid=%@",user.uid);
NSLog(@"%@",user.credential);
NSLog(@"token=%@",user.credential.token);
NSLog(@"nickname=%@",user.nickname);
}
else
{
NSLog(@"%@",error);
}
}];
也可以調(diào)用這個方法
// 導(dǎo)入頭文件
#import <ShareSDKExtension/SSEThirdPartyLoginHelper.h>
[SSEThirdPartyLoginHelper loginByPlatform:SSDKPlatformTypeQQ
onUserSync:^(SSDKUser *user, SSEUserAssociateHandler associateHandler) {
//在此回調(diào)中可以將社交平臺用戶信息與自身用戶系統(tǒng)進(jìn)行綁定,最后使用一個唯一用戶標(biāo)識來關(guān)聯(lián)此用戶信息。
//在此示例中沒有跟用戶系統(tǒng)關(guān)聯(lián),則使用一個社交用戶對應(yīng)一個系統(tǒng)用戶的方式。將社交用戶的uid作為關(guān)聯(lián)ID傳入associateHandler。
associateHandler (user.uid, user, user);
NSLog(@"dd%@",user.rawData);
NSLog(@"dd%@",user.credential);
}
onLoginResult:^(SSDKResponseState state, SSEBaseUser *user, NSError *error) {
if (state == SSDKResponseStateSuccess)
{
}
}];
第五步:支持QQ客戶端登錄的相關(guān)配置
QQ如果要跳客戶端登錄的話,需要配置下URL Scheme:
然后打開下圖位置,在URL Types中添加騰訊AppID,其格式為:tencent+appID(你在QQ中申請的AppId), 如:tencent100371282。如圖所示:

各個主流社交平臺登錄需要配置的url schemes:

問題1: 使用新浪微博會出現(xiàn)如下錯誤

解決:設(shè)置-all_load運行成功 設(shè)置-Objc Crash

問題2: 新浪微博授權(quán)頁面異常

解決:選擇[管理中心]->[我的應(yīng)用]->["您的應(yīng)用名"]->展開左側(cè)[應(yīng)用信息]->[高級信息]->OAuth2.0 授權(quán)設(shè)置 右上角[編輯]->在框里填入回調(diào)地址即可.(前期測試應(yīng)用時隨便填個公司主頁即可.兩個地址可以相同)

問題3: 打印出retryHandleOpenURL
解決:bundle id 與 微博審核的應(yīng)用的bundle id 不一樣

問題4: 尚未設(shè)置QQ的URL Scheme

####解決: 你也可以直接拷貝系統(tǒng)提示信息中的設(shè)置

其格式為:"QQ” + AppId的16進(jìn)制(如果appId轉(zhuǎn)換的16進(jìn)制數(shù)不夠8位則在前面補0,如轉(zhuǎn)換的是:5FB8B52,則最終填入為:QQ05FB8B52 注意:轉(zhuǎn)換后的字母要大寫)
附: 官方的demo是多工程項目,以下是分類
注: 想了解多工程的使用請點擊這里

分享
簡單分享
#pragma mark - 分享
- (IBAction)fenxiangBtn:(id)sender {
//copy如下代碼即可實現(xiàn)簡單的分享
//1、創(chuàng)建分享參數(shù)
NSMutableDictionary *shareParams = [NSMutableDictionary dictionary];
NSArray* imageArray = @[[UIImage imageNamed:@"shareImg.png"]];
if (imageArray)
{
[shareParams SSDKSetupShareParamsByText:@"分享內(nèi)容 我是內(nèi)容我是內(nèi)容我是內(nèi)容我是內(nèi)容我是內(nèi)容我是內(nèi)容我是內(nèi)容我是內(nèi)容"
images:imageArray
url:[NSURL URLWithString:@"http://www.itdecent.cn/p/44e2c9d09398"]
title:@"分享標(biāo)題"
type:SSDKContentTypeAuto];
}
//2、分享
[ShareSDK share:SSDKPlatformTypeWechat
parameters:shareParams
onStateChanged:^(SSDKResponseState state, NSDictionary *userData, SSDKContentEntity *contentEntity, NSError *error)
{
switch (state) {
case SSDKResponseStateSuccess:
{
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"分享成功"
message:nil
delegate:nil
cancelButtonTitle:@"確定"
otherButtonTitles:nil];
[alertView show];
break;
}
case SSDKResponseStateFail:
{
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"分享失敗"
message:[NSString stringWithFormat:@"%@", error]
delegate:nil
cancelButtonTitle:@"確定"
otherButtonTitles:nil];
[alertView show];
break;
}
case SSDKResponseStateCancel:
{
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"分享已取消"
message:nil
delegate:nil
cancelButtonTitle:@"確定"
otherButtonTitles:nil];
[alertView show];
break;
}
default:
break;
}
}];
}