第三方登录 ----转载自简书,作者 <<碧霄问鼎>>
这几天遇到一个需求:做第三方登录和分享。遇到了一些坑,把整个过程整理记录下来,方便他人,同时也捋一下思路。
当时考虑过把每个平台的SDK下载下来,一个一个弄,一番取舍后决定还是用ShareSDK。这里只做了微博、微信和QQ。过程如下:
1.去ShareSDK官网注册一个账号方便以后对ShareSDK的配置。
2.按照集成文档的步骤开始做,不得不说这个集成文档里面有坑,有坑的地方我会指出。
3.添加一个应用。有很多种方式可以添加一个应用,多点点。这里我创建了一个test应用。
创建后进去的页面如下:
这里的App Key和App Secret(不显示的话,点击显示)很重要,可以用来初始化ShareSDK,
4.下载SDK。
这里是第一个坑,虽然你可以自定义下载SDK,如果你做QQ分享和登录,一定不要忘记下载QQ空间的SDK。因为QQ本身不支持第三方登录,但支持第三方分享包括QQ空间分享,QQ空间支持第三方登录,所以如果你做QQ分享和登录,一定要记得下载QQ空间的SDK。如果只做分享,那只下载QQ的就行。这里我被坑过,ShareSDK提供的文档里面没有说明。
下载后的SDK文件目录:
5.把下载的ShareSDK添加到项目中。
到现在为止运行项目是会报错的,原因是没有添加相关的依赖库。
6.添加相关的依赖库。
以下摘自ShareSDK提供的文档。
必须添加的依赖库如下:
SystemConfiguration.framework
QuartzCore.framework
CoreTelephony.framework
libicucore.dylib
libz.1.2.5.dylib
Security.framework
以下依赖库根据社交平台添加
新浪微博SDK依赖库 (从v2.10.5开始)
ImageIO.framework
QQ好友和QQ空间SSO必要(新注册腾讯开放平台帐号只支持SSO授权,只是老开发者才可以使用网页授权)
libstdc++.dylib
libsqlite3.dylib
添加相应依赖库后的项目结构是这个样子的:
到这里运行项目是不会报错的,如果报错,检查添加的依赖库是缺了、漏了、还是错了。
在AppDelegate.m中添加以下头文件,再运行项目看看,这是不会报错的,如果报错看提示信息,多搜索,相信是能够解决的。
#import <ShareSDK/ShareSDK.h>
#import <TencentOpenAPI/QQApiInterface.h>
#import <TencentOpenAPI/TencentOAuth.h>
#import "WXApi.h"
#import "WeiboSDK.h"
7.到相应开发者平台注册开发者账号,并添加你要进行分享和使用第三方登录应用的信息。
添加新浪微博应用 注册网址 http://open.weibo.com
添加QQ应用 注册网址 http://mobile.qq.com/api/
添加微信应用 http://open.weixin.qq.com
注意:这三家的开放平台,目前为止,页面做的都跟山寨网站似的(微信的好一点),奇卡无比。当然这不是吐槽的重点,重点是注册流程繁琐,还要认证开发者身份,需要等一个工作日。其中如果做微信登录的话,每年要交300元的什么费。这里没有什么难度就是个体力活,就不详说了,有什么疑问,请留言,你的留言也是对我的信任和支持。
注册完,申请完就可以拿到AppID、AppSecret、AppKey等东西。
注:QQ的AppKey在ShareSDK中叫AppSecret。名字不统一,这个比较扯淡。
拿到这些AppID、AppSecret、AppKey等东西后就可以开始对ShareSDK进行初始化。
在AppDelegate.m中添加下面这个方法,并记得在- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions方法中调用。
- (void)initShareSDK {
[ShareSDK registerApp:@"884a1b86xxxx"];
//对新浪微博SDK进行初始化
[ShareSDK connectSinaWeiboWithAppKey:@"406116xxxx"
appSecret:@"b6a542582057e39a6fca582b14dxxxxxx"
redirectUri:@"http://www.xxxx.com"];
//注这里的redirectUri要与你在新浪微博开放平台上填写的那个授权回调页的URL保持一致,否则在使用微博登录的时候会报一个redirectUri找不到的错误,这里是一个坑。
//突然发现这里redirectUri是什么鬼?难道ShareSDK的制作者敲错了?不应该是URL吗?
//QQ分享SDK初始化
[ShareSDK connectQQWithQZoneAppKey:@"110467xxxx"
qqApiInterfaceCls:[QQApiInterface class]
tencentOAuthCls:[TencentOAuth class]];
//QQ登录SDK初始化
[ShareSDK connectQZoneWithAppKey:@"1104677455"
appSecret:@"KnjAB2I0G8Vxxxxx"
qqApiInterfaceCls:[QQApiInterface class]
tencentOAuthCls:[TencentOAuth class]];
// 注:QQ登录的appSecret参数,是你在QQ开放平台是拿到的AppKey
//对微信SDK进行初始化
[ShareSDK connectWeChatWithAppId:@"wx02e84c8fa45xxxx"
appSecret:@"ef9006286ce2637caeb648cb58dxxxx"
wechatCls:[WXApi class]];
clientKey:@"aiK1CTRUKjDukAyyKXHJ7ScTfnsLw5IupC8xxxxx"];
}
8.添加URL Schemes。
点击:项目名 > TARGETS > info > URL Types 点击添加URL Types。
如图:
在URL Schemes后面的框里添上对应信息。
新浪微博的URL Schemes是:wb 加上在微博开放平台申请的AppKey。
微信的URL Schemes是:微信开放平台申请的AppID。
QQ空间的URL Schemes是:QQ开放平台申请的 tencent 加上 AppID。(如果只做分享的话,可以不添加,做登录的话必须添加)
QQ的URL Schemes是:QQ 加上 AppID的16进制(如果AppID转换的16进制数不够8位则在前面补0,如转换的是:5FB8B52,则最终填入为:QQ05FB8B52 注意:转换后的字母要大写)
转换16进制的方法:echo 'ibase=10;obase=16;801312852'|bc,其中801312852为QQ的AppID,见下图:
添加完URL Schemes后,在AppDelegate.m文件中添加以下对URL处理的代码:
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url
{
return [ShareSDK handleOpenURL:url wxDelegate:self];
}
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
return [ShareSDK handleOpenURL:url
sourceApplication:sourceApplication
annotation:annotation
wxDelegate:self];
}
到此第三方的准备工作就算是做完了。
9.写分享的代码。
(1)在界面上添加按钮,并绑定响应事件。
(2)写事件处理代码。
事件处理代码,如下:
- (void)thridPartyShareWithShareType:(ShareType)shareType {
//只需要在响应分享按钮的方法中添加以下代码即可
NSString *img = [[NSBundle mainBundle] pathForResource:@"mm" ofType:@"png"];
//构造分享内容
id<ISSContent> publishContent = [ShareSDK content:@"ShareSDK无比强大哦"
defaultContent:@""
image:[ShareSDK imageWithPath:img]
title:@"演示Demo中的标题"
url:@"http://www.mob.com"
description:@"测试DEMO正在制作中,欢迎大家观看"
mediaType:SSPublishContentMediaTypeNews];
[ShareSDK shareContent:publishContent
type:shareType
authOptions:nil
shareOptions:nil
statusBarTips:YES
result:^(ShareType type, SSResponseState state, id<ISSPlatformShareInfo> statusInfo, id<ICMErrorInfo> error, BOOL end) {
if (state == SSPublishContentStateSuccess)
{
NSLog(NSLocalizedString(@"TEXT_SHARE_SUC", @"发表成功"));
}
else if (state == SSPublishContentStateFail)
{
NSLog(NSLocalizedString(@"TEXT_SHARE_FAI", @"发布失败!error code == %d, error code == %@"), [error errorCode], [error errorDescription]);
}
}];
}
方法中的shareType参数传什么值就分享到什么平台:
ShareTypeSinaWeibo //新浪微博
ShareTypeQQSpace //QQ空间 (注意:填写这个类型就可以分享到好友和QQ空间,也可以用来做登录)
ShareTypeWeixiSession //微信好友 (这个类型也可以用来做微信登录)
ShareTypeWeixiTimeline //微信朋友圈
到这里分享就算是做好了。
10.写登录代码。(这里在ShareSDK的文档里,又有一个坑)
(1)在ShareSDK做第三方登录的文档里,这里要求去一个Parse的网站注册下载一大堆东西。并添加一堆依赖库,可这些并没有什么卵用。理由如下:
它让在应用了集成Parse,就是做一个对第三方平台返回的信息(id、nickname、profileImage)进行存储,可这些,我们都是存自己公司服务器的,做这些都是扯淡的,但文档里并没有说明。我靠,让我郁闷半天。
(2)在界面添加按钮,并绑定响应事件。
(3)写响应代码(以QQ登录为例,三个平台的代码是一样的,不同点在Type这个参数上)。
- (IBAction)QQLogin:(UIButton *)sender {
[ShareSDK getUserInfoWithType:ShareTypeQQSpace authOptions:nil result:^(BOOL result, id<ISSPlatformUser> userInfo, id<ICMErrorInfo> error) {
if (result) {
NSLog(@"%hhd", result);
NSLog(@"%@", [userInfo uid]);
NSLog(@"%@", [userInfo nickname]);
NSLog(@"%@", [userInfo profileImage]);
//在这里把拿到的userInfo里面的值做处理,存服务器或者什么的
UIAlertView *alertView = [[UIAlertView alloc]
initWithTitle:@"Hello"
message:@"欢迎注册"
delegate:nil
cancelButtonTitle:@"知道了"
otherButtonTitles: nil];
[alertView show];
} else {
UIAlertView *alertView = [[UIAlertView alloc]
initWithTitle:@"Hello"
message:@"欢迎回来"
delegate:nil
cancelButtonTitle:@"知道了"
otherButtonTitles:nil];
[alertView show];
}
}];
}
到这里第三方登录就算是做好了。
最后,退出登录授权使用一下代码。
[ShareSDK cancelAuthWithType:ShareTypeQQSpace]; //这里以QQ为例了
第三方登录 ----转载自简书,作者 <<碧霄问鼎>>的更多相关文章
- swift调用oc语言文件,第三方库文件或者自己创建的oc文件——简书作者
Swift是怎样调用OC的第三方库的呢?请看下面详情: 情况一: 1.首先打开Xcode,iOS->Application->Single View Application, 选Next. ...
- 监控、日志、APM整个监控体系思考 我为峰2014 简书作者 4.6092018-11-19 11:39打开App 序言
监控.日志.APM整个监控体系思考 我为峰2014 简书作者 4.6092018-11-19 11:39打开App 序言
- [Selenium2+python2.7][Scrap]爬虫和selenium方式下拉滚动条获取简书作者目录并且生成Markdown格式目录
预计阅读时间: 15分钟 环境: win7 + Selenium2.53.6+python2.7 +Firefox 45.2 (具体配置参考 http://www.cnblogs.com/yoyok ...
- Python 2.7_发送简书关注的专题作者最新一篇文章及连接到邮件_20161218
最近看简书文章关注了几个专题作者,写的文章都不错,对爬虫和数据分析都写的挺好,因此想到能不能获取最新的文章推送到Ipad网易邮箱大师.邮件发送代码封装成一个函数,从廖雪峰大神那里学的 http:// ...
- iOS开发--Bison详解连连支付集成简书
"最近由于公司项目需要集成连连支付,文档写的不是很清楚,遇到了一些坑,因此记录一下,希望能帮到有需要的人." 前面简单的集成没有遇到什么坑,在此整理一下官方的集成文档,具体步骤如下 ...
- iOS离屏渲染简书
更详细地址https://zsisme.gitbooks.io/ios-/content/chapter15/offscreen-rendering.html(包含了核心动画) GPU渲染机制: CP ...
- 简书APP
找第三方的时候看到简书这个APP,上网搜了一下发现网页版非常的干净,开头的一篇文章就是"你没实力就别心存侥幸",看完也挺有有同感的.文章网址:http://www.jianshu. ...
- [开源,学习,分享]UWP第三方简书客户端分享
简介 Windows10正式版发布到现在,我利用零零碎碎的一些时间对UWP进行一些学习,也基于这门技术开发了一个第三方的简书App. 基本界面 优酷视频: http://v.youku.com/v_s ...
- 验证码破解 | Selenium模拟登录简书
使用超级鹰打码平台处理登录的文字点击验证码 import time from io import BytesIO from PIL import Image from selenium import ...
随机推荐
- 原型 prototype
原型 prototype js 的对象比较 由于 js 是解释执行的语言, 那么再代码中出现函数与对象如果重复执行, 会创建多个副本 在代码中重复执行的代码容易出现重复的对象 创建一个 Person ...
- JSON详解 .net
之前json掌握的不好,浪费了好多时间在查找一些json有关的转换问题,我所知道的方法只有把json序列化和反序列化一下,但是太麻烦了我觉得,所以就在找一些更简单又方便使用的方法.也许这个会有用吧,所 ...
- artTemplate 介绍
artTemplate 是新一代 javascript 模板引擎,它采用预编译方式让性能有了质的飞跃,并且充分利用 javascript 引擎特性,使得其性能无论在前端还是后端都有极其出色的表现. 编 ...
- 使用Vue编写点击数字小游戏
使用vue编写一个点击数字计时小游戏,列入你在文本框中输入3,点击开始会生成一个3行3列的表格,表格数据为1-9随机排列,这时候从1开始点击,按顺序点到9,当按正确顺序点击完毕,会提示所用的时间,如果 ...
- 淡扯javascript编程思想
一.面向对象-OOD 虽然js面向对象的编程思想已经老话常谈了,但了为了文章的完整性,我还是把它加了进来,尽量以不太一样的方式讲述(虽然也没什么卵不一样的). 1.面向对象,首先得有类的概念,没有 ...
- Android WebView 获取网页的标题
final TextView txtTitle = (TextView) findViewById(R.id.txtTitle); final WebView webView = (WebView)f ...
- android 学习运用海马模拟器教程与android环境的搭建
第三方海马玩模拟器 第一天的学习android采用的模拟器是海马,因此就分享给大家海马模拟器的相关步骤: 海马玩模拟器官网: http://droid4x.haimawan.com 下载相关平台的模拟 ...
- iOS沙盒简单介绍
先简单介绍一下什么是沙盒:你可以简单理解成为一个目录,这个目录的改动不会对操作系统造成任何损失.(这里也有一点点介绍) 看看苹果的沙盒目录: 再附一张苹果官方的图 一个iOS app操作都是在自己的沙 ...
- 【转载】菜鸟Ubuntu下安装Android Studio
原文:http://forum.android-studio.org/forum.php?mod=viewthread&tid=236&extra=page%3D1%26filter% ...
- 网络开始---多线程---NSThread-01-基本使用(了解)(二)
#import "HMViewController.h" @interface HMViewController () @end @implementation HMViewCon ...