这几天遇到一个需求:做第三方登录和分享。遇到了一些坑,把整个过程整理记录下来,方便他人,同时也捋一下思路。

当时考虑过把每个平台的SDK下载下来,一个一个弄,一番取舍后决定还是用ShareSDK。这里只做了微博、微信和QQ。过程如下:

1.去ShareSDK官网注册一个账号方便以后对ShareSDK的配置。

2.按照集成文档的步骤开始做,不得不说这个集成文档里面有坑,有坑的地方我会指出。

文档中心

3.添加一个应用。有很多种方式可以添加一个应用,多点点。这里我创建了一个test应用。

添加应用

创建后进去的页面如下:

应用概况

这里的App Key和App Secret(不显示的话,点击显示)很重要,可以用来初始化ShareSDK,

4.下载SDK。

下载SDK

这里是第一个坑,虽然你可以自定义下载SDK,如果你做QQ分享和登录,一定不要忘记下载QQ空间的SDK。因为QQ本身不支持第三方登录,但支持第三方分享包括QQ空间分享,QQ空间支持第三方登录,所以如果你做QQ分享和登录,一定要记得下载QQ空间的SDK。如果只做分享,那只下载QQ的就行。这里我被坑过,ShareSDK提供的文档里面没有说明。

自定义下载SDK

下载后的SDK文件目录:

下载后的SDK文件目录

5.把下载的ShareSDK添加到项目中。

项目中的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的

微信的

注: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后面的框里添上对应信息。

新浪微博的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,见下图:

QQ URLSchemes

添加完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为例了

第三方登录 ----转载自简书,作者 <<碧霄问鼎>>的更多相关文章

  1. swift调用oc语言文件,第三方库文件或者自己创建的oc文件——简书作者

    Swift是怎样调用OC的第三方库的呢?请看下面详情: 情况一: 1.首先打开Xcode,iOS->Application->Single View Application, 选Next. ...

  2. 监控、日志、APM整个监控体系思考 我为峰2014 简书作者 4.6092018-11-19 11:39打开App 序言

    监控.日志.APM整个监控体系思考 我为峰2014 简书作者 4.6092018-11-19 11:39打开App 序言

  3. [Selenium2+python2.7][Scrap]爬虫和selenium方式下拉滚动条获取简书作者目录并且生成Markdown格式目录

    预计阅读时间: 15分钟 环境: win7 + Selenium2.53.6+python2.7 +Firefox 45.2  (具体配置参考 http://www.cnblogs.com/yoyok ...

  4. Python 2.7_发送简书关注的专题作者最新一篇文章及连接到邮件_20161218

    最近看简书文章关注了几个专题作者,写的文章都不错,对爬虫和数据分析都写的挺好,因此想到能不能获取最新的文章推送到Ipad网易邮箱大师.邮件发送代码封装成一个函数,从廖雪峰大神那里学的  http:// ...

  5. iOS开发--Bison详解连连支付集成简书

    "最近由于公司项目需要集成连连支付,文档写的不是很清楚,遇到了一些坑,因此记录一下,希望能帮到有需要的人." 前面简单的集成没有遇到什么坑,在此整理一下官方的集成文档,具体步骤如下 ...

  6. iOS离屏渲染简书

    更详细地址https://zsisme.gitbooks.io/ios-/content/chapter15/offscreen-rendering.html(包含了核心动画) GPU渲染机制: CP ...

  7. 简书APP

    找第三方的时候看到简书这个APP,上网搜了一下发现网页版非常的干净,开头的一篇文章就是"你没实力就别心存侥幸",看完也挺有有同感的.文章网址:http://www.jianshu. ...

  8. [开源,学习,分享]UWP第三方简书客户端分享

    简介 Windows10正式版发布到现在,我利用零零碎碎的一些时间对UWP进行一些学习,也基于这门技术开发了一个第三方的简书App. 基本界面 优酷视频: http://v.youku.com/v_s ...

  9. 验证码破解 | Selenium模拟登录简书

    使用超级鹰打码平台处理登录的文字点击验证码 import time from io import BytesIO from PIL import Image from selenium import ...

随机推荐

  1. 改变mvc web api 支持android ,ios ,ajax等方式跨域调用

    公司一个移动后端的项目用到了 webapi 项目搭建到外网环境共app开发者调用测试接口时遇到了一个问题 接口不允许跨域调用 .查阅资料明白 同源策略原则根据请求报头值 Origin 与回应报头值 A ...

  2. javascript --- Ajax基础

    神马是Ajax? Ajax即‘Asynchronous javascript and XML’(异步javascript和XML),也就是所谓的无刷新页面读取技术. http请求 首先要了解http请 ...

  3. SharePoint 2010 文档管理系列之星级评论功能

    前言:正如我们前面介绍的是,文档管理就是让大家更加直观.方便的对手里的文档,进行统筹掌控,哪些文档是有价值的,哪些文档更受大家欢迎,所有就带来了这个星级评论. 当然,这个是SharePoint 201 ...

  4. 穷举法破解 zebrone1.1

    系统 : Windows xp 程序 : zebrone1.1 程序下载地址 :http://pan.baidu.com/s/1boqVcU7 要求 : 编写注册机 使用工具 :OD 可在看雪论坛中查 ...

  5. [stl] SGI STL的空间配置器

    第一级空间配置器 第一级配置以malloc(), free(), realloc()等c函数执行实际的内存配置,释放.重配置操作,并实现出类似c++ new handler的机制.它不能直接使用c++ ...

  6. 一个基于Myeclipse开发的Java打地鼠小游戏(Appletcation)

    package javaes.zixue.wangshang.daima; 2 3 import java.awt.Cursor; import java.awt.Image; import java ...

  7. IOS NSThread

    任何一个 iOS 应用程序都是由一个或者多个线程构成的.无论你是否使用了多线程编程技术,至少有 1 个 线程被创建.多线程就是为了提高引用程序的工作效率!避免阻塞主线程!当我们没有用任何多线程技术的话 ...

  8. iOS开发之网络编程--中文转码

    前言: 在GET请求或者是POST请求,请求上传的参数如果含有中文,可能会导致请求失败. 所以要对存储了URL地址的NSString对象进行中文转码,然后将这个NSString对象传递给URL.   ...

  9. MySql下载安装(Mac平台) 终端启动 XMAPP启动

    1,下载 2,点击MySQL Community Server之后,然后看到需要注册登录的节目,我们就点击最下面just start my download直接下载.懒的注册或者登陆: 3.下载后,& ...

  10. JQuery判断radio是否选中,获取选中值

    本文摘自:http://www.cnblogs.com/xcj1989/archive/2011/06/29/JQUERY_RADIO.html   /*----------------------- ...