95、分享与登录:微信登录、QQ登录、微博分享、Universal Link
说实话,做社交类App,最绕不开的就是第三方登录和分享。用户不想注册,你也不想让他流失。微信、QQ、微博这三件套,基本是标配。
我个人习惯先把登录和分享分开看。登录解决的是「你是谁」,分享解决的是「怎么传播」。但底层逻辑其实一样——都是跟平台SDK打交道,处理回调,管理Token。
嗯,今天我们就来拆解这四块内容:微信登录、QQ登录、微博分享、以及Universal Link这个坑。
核心要点:第三方SDK集成,本质上就是「注册-初始化-调接口-处理回调」四步走。但每一步都有细节,稍不注意就翻车。
一、微信登录
微信登录是我用得最多的。为什么?因为用户量大,而且微信的授权流程相对成熟。
先看流程:
- 在微信开放平台注册应用,拿到AppID
- 集成微信SDK(WXApi)
- 调起微信授权页面
- 微信回调返回code
- 用code换access_token和用户信息
代码示例(核心部分):
// 1. 注册到微信
public class WXEntryActivity extends Activity implements IWXAPIEventHandler {
private IWXAPI wxApi;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
wxApi = WXAPIFactory.createWXAPI(this, APP_ID, true);
wxApi.handleIntent(getIntent(), this);
}
// 2. 处理微信回调
@Override
public void onResp(BaseResp resp) {
if (resp instanceof SendAuth.Resp) {
SendAuth.Resp authResp = (SendAuth.Resp) resp;
String code = authResp.code;
// 用code去后端换token
}
}
}
我的经验:WXEntryActivity这个类名不能改,包名必须跟开放平台一致。我曾经因为包名写错,调试了一下午。嗯,后来学乖了,每次先检查包名。
这里有个关键点:code换token一定要在服务端做。为什么?因为AppSecret不能暴露在客户端。我见过有人直接把AppSecret写在代码里,结果被反编译,账号被盗刷。
二、QQ登录
QQ登录跟微信类似,但有个区别:QQ的SDK更「重」一些。它自带UI,而且回调方式不同。
QQ登录用的是Tencent类,回调通过IUiListener接口。
// 初始化
Tencent mTencent = Tencent.createInstance(APP_ID, context);
// 调起登录
mTencent.login(this, "all", new BaseUiListener() {
@Override
protected void doComplete(JSONObject values) {
// 登录成功,拿到openid和access_token
}
});
// 回调处理
private class BaseUiListener implements IUiListener {
@Override
public void onComplete(Object response) {
// 解析JSON
}
@Override
public void onError(UiError uiError) {
// 错误处理
}
@Override
public void onCancel() {
// 用户取消
}
}
避坑指南:QQ登录的回调必须在主线程处理。我曾经在子线程里更新UI,直接崩溃。还有,QQ的SDK在部分国产手机上会有兼容性问题,比如华为、小米的某些系统版本。建议在onError里加个降级方案。
另外,QQ登录的「all」参数表示获取所有权限。如果你只需要基本信息,可以传「get_user_info」。别贪多,权限越多,用户拒绝的概率越大。
三、微博分享
微博分享跟登录不太一样。它更侧重内容传播。我一般用微博的SDK做图文分享、视频分享。
微博分享的核心是WeiboShareSDK,流程如下:
- 初始化微博SDK
- 构建分享内容(文本、图片、视频、网页)
- 调起微博客户端或Web页面
- 处理分享结果回调
// 构建分享内容
WeiboMultiMessage multiMessage = new WeiboMultiMessage();
multiMessage.textObject = new TextObject("分享文本");
multiMessage.imageObject = new ImageObject(bitmap);
// 发送请求
SendMultiMessageToWeiboRequest request = new SendMultiMessageToWeiboRequest();
request.multiMessage = multiMessage;
request.transaction = String.valueOf(System.currentTimeMillis());
// 调起分享
WeiboShareSDK.createWBAPI(context).sendRequest(request);
个人经验:微博分享的图片大小有限制,超过10MB会失败。我建议先压缩再分享。还有,微博的SDK在Android 11以上需要申请MANAGE_EXTERNAL_STORAGE权限,否则图片读不出来。这个坑我踩过两次。
微博分享还有个特点:它支持多图分享。但注意,多图分享时图片数量不能超过9张,而且每张图片不能超过5MB。嗯,这些限制文档里都有,但很多人不看。
四、Universal Link
Universal Link是苹果推出的深度链接方案。说白了,就是让用户从浏览器或微信里直接打开你的App,而不是跳到App Store。
Android这边对应的叫App Links。但实际开发中,Universal Link更常见,因为微信、QQ都支持它。
配置Universal Link需要三步:
- 在服务器上放一个apple-app-site-association文件
- 在Xcode里配置Associated Domains
- 在App里处理传入的URL
Android端的处理方式类似:
// AndroidManifest.xml 配置
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data
android:scheme="https"
android:host="yourdomain.com"
android:pathPrefix="/app/" />
</intent-filter>
// 处理传入链接
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Intent intent = getIntent();
Uri data = intent.getData();
if (data != null) {
// 解析链接,跳转到对应页面
}
}
避坑指南:Universal Link在微信里经常失效。为什么?因为微信会拦截链接。我遇到过的情况是:用户点击链接,微信直接打开网页,而不是调起App。解决方案是:在微信里用scheme跳转,或者用微信的JS-SDK。嗯,这个没有完美方案,只能做兼容。
另外,Universal Link的配置有缓存。你改了服务器文件,可能要等24小时才能生效。调试时建议用测试工具,比如Branch的Universal Link验证器。
知识体系总览
下面这张图,是我自己整理的第三方登录与分享的核心逻辑。你看一眼,基本就明白整体结构了。
总结对比
| 功能 | 微信 | 微博 | |
|---|---|---|---|
| 登录方式 | 授权码模式 | 授权码模式 | OAuth2.0 |
| 分享类型 | 文本、图片、网页、小程序 | 文本、图片、网页 | 文本、图片、视频、网页 |
| 回调方式 | WXEntryActivity | IUiListener | WBShareCallback |
| 常见坑 | 包名、签名 | 主线程回调、兼容性 | 图片大小、权限 |
| Universal Link支持 | 支持(但微信会拦截) | 支持 | 支持 |
我的建议:如果你刚开始集成,先做微信登录和微博分享。这两个最常用,而且文档相对清晰。QQ登录可以放后面,因为它的SDK更新频率低,有些接口已经过时了。
嗯,今天就聊到这里。第三方登录和分享,说白了就是跟平台SDK打交道。你只要把注册、初始化、回调这三步走顺了,剩下的就是填坑。我踩过的坑,上面都列了,希望能帮你少走弯路。