引言:为什么选择ShareSDK集成微博分享?
在当今移动应用开发中,社交分享功能已成为提升用户活跃度和应用传播的重要手段。微博作为中国最大的社交媒体平台之一,拥有超过5亿的月活跃用户,为App提供了巨大的流量入口。然而,直接集成微博SDK可能会面临复杂的API调用、版本兼容性问题以及多平台适配的挑战。ShareSDK作为一款成熟的第三方移动开发工具,能够帮助开发者快速实现包括微博在内的多个社交平台分享功能,大大降低了开发门槛和维护成本。
ShareSDK的核心优势在于其统一的API设计,开发者只需编写一次代码,即可支持微信、微博、QQ、Facebook等数十个社交平台。对于微博分享而言,ShareSDK封装了OAuth认证、授权登录、内容分享等复杂流程,提供了简洁的回调机制和错误处理方案。本文将从零开始,详细讲解如何在Android和iOS平台集成ShareSDK并实现微博分享功能,包括环境配置、代码实现、回调处理以及常见问题的解决方案。
一、前期准备与环境配置
1.1 注册微博开放平台账号
在开始集成之前,首先需要在微博开放平台(open.weibo.com)注册开发者账号并创建应用。这一步是获取分享功能必要参数的关键。
具体步骤:
- 访问微博开放平台(open.weibo.com)并登录
- 进入”我的应用”页面,点击”创建新应用”
- 填写应用基本信息,包括应用名称、包名(Android)或Bundle ID(iOS)、应用图标等
- 提交审核后,在应用详情页获取App Key和App Secret
- 配置应用的签名信息(Android)或Bundle ID(iOS)
重要提示:
- Android应用的包名必须与代码中的
AndroidManifest.xml中声明的包名完全一致 - iOS应用的Bundle ID必须与Xcode项目中的Bundle Identifier一致
- 签名信息(MD5)需要使用工具生成,确保与发布版本一致
1.2 注册ShareSDK账号并创建应用
接下来需要在ShareSDK官网(www.mob.com)注册账号并创建应用,获取ShareSDK的App Key。
操作流程:
- 访问ShareSDK官网并注册账号
- 登录后进入控制台,点击”创建应用”
- 填写应用信息,选择平台(Android/iOS)
- 获取ShareSDK App Key,该Key将用于代码初始化
- 在应用配置中添加微博平台,填写之前获取的微博App Key和App Secret
1.3 下载ShareSDK开发包
根据目标平台下载对应的ShareSDK开发包:
Android平台:
- 下载ShareSDK for Android最新版本
- 解压后包含以下核心文件:
ShareSDK-Core-*.jar:核心库ShareSDK-Weibo-*.jar:微博平台库MobTools-*.jar:工具类库res文件夹:资源文件
iOS平台:
- 下载ShareSDK for iOS最新版本
- 解压后包含:
ShareSDK.framework:核心框架ShareSDKExtension.framework:扩展框架ShareSDKConnector.framework:连接器框架MOBFoundation.framework:基础框架- 各平台SDK(如WeiboSDK.framework)
二、Android平台集成详解
2.1 添加依赖和配置Gradle
在Android项目中集成ShareSDK需要进行以下配置:
步骤1:添加JAR包和资源文件
将下载的ShareSDK JAR包复制到项目的app/libs目录下,并将res资源文件合并到项目中。
步骤2:配置build.gradle
// 在app/build.gradle文件中添加以下配置
android {
compileSdkVersion 30
defaultConfig {
applicationId "com.example.myapp" // 必须与微博开放平台填写的包名一致
minSdkVersion 21
targetSdkVersion 30
// 添加多dex支持(如果需要)
multiDexEnabled true
}
// 配置签名信息(发布时需要)
signingConfigs {
release {
storeFile file("my-release-key.jks")
storePassword "password"
keyAlias "my-key-alias"
keyPassword "password"
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.release
}
}
// 配置Java8支持
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'androidx.appcompat:appcompat:1.3.1'
implementation 'androidx.constraintlayout:constraintlayout:2.1.0'
// ShareSDK核心依赖
implementation files('libs/ShareSDK-Core-4.4.1.jar')
implementation files('libs/ShareSDK-Weibo-4.4.1.jar')
implementation files('libs/MobTools-4.4.1.jar')
// 微博SDK依赖(ShareSDK内部已包含,但需要确保版本兼容)
implementation files('libs/WeiboSDK-3.2.5.jar')
}
步骤3:配置AndroidManifest.xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.myapp">
<!-- 网络权限 -->
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<!-- 存储权限(用于分享图片) -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<!-- 2021年后Android 11需要额外声明 -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="32" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="29" />
<!-- 微博Activity声明 -->
<activity
android:name="com.sina.weibo.sdk.component.WeiboSdkBrowser"
android:configChanges="orientation|screenSize"
android:exported="true"
android:windowSoftInputMode="adjustNone" />
<activity
android:name="com.sina.weibo.sdk.share.WbShareTransActivity"
android:theme="@android:style/Theme.Translucent.NoTitleBar"
android:exported="true" />
<!-- ShareSDK配置 -->
<meta-data
android:name="MobAppKey"
android:value="你的ShareSDK App Key" />
<meta-data
android:name="MobAppSecret"
android:value="你的ShareSDK App Secret" />
<!-- 应用启动Activity -->
<activity
android:name=".MainActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<!-- 处理微博回调 -->
<activity
android:name="com.sina.weibo.sdk.share.WbShareResultActivity"
android:configChanges="orientation|screenSize"
android:theme="@android:style/Theme.Translucent.NoTitleBar"
android:exported="true" />
</manifest>
2.2 初始化ShareSDK
在Application类或MainActivity的onCreate方法中初始化ShareSDK:
import android.app.Application;
import cn.sharesdk.framework.ShareSDK;
import cn.sharesdk.weibo.utils.WbCallbackManager;
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
// 初始化ShareSDK
ShareSDK.initSDK(this);
// 配置微博平台参数
Platform weibo = ShareSDK.getPlatform(Weibo.NAME);
weibo.setPlatformActionListener(new PlatformActionListener() {
@Override
public void onComplete(Platform platform, int action, HashMap<String, Object> res) {
// 分享成功回调
Log.d("ShareSDK", "微博分享成功: " + res.toString());
runOnUiThread(() -> {
Toast.makeText(MainActivity.this, "分享成功", Toast.LENGTH_SHORT).show();
});
}
@Override
public void onError(Platform platform, int action, Throwable t) {
// 分享失败回调
Log.e("ShareSDK", "微博分享失败: " + t.getMessage());
runOnUiThread(() -> {
Toast.makeText(MainActivity.this, "分享失败: " + t.getMessage(), Toast.LENGTH_SHORT).show();
});
}
@Override
public void onCancel(Platform platform, int action) {
// 用户取消分享
Log.d("ShareSDK", "微博分享取消");
runOnUiThread(() -> {
Toast.makeText(MainActivity.this, "分享取消", Toast.LENGTH_SHORT).show();
});
}
});
// 配置微博参数(如果未在控制台配置)
weibo.SSOSetting(true); // 设置使用SSO授权
weibo.showUser(null); // 获取用户信息(可选)
}
}
2.3 实现一键分享功能
在Activity中实现分享按钮的点击事件:
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import java.io.File;
import java.io.IOException;
import1 java.util.HashMap;
import cn.sharesdk.framework.Platform;
import cn.sharesdk.framework.PlatformActionListener;
import cn.sharesdk.framework.ShareSDK;
import cn.sharesdk.weibo.utils.WbCallbackManager;
import cn.sharesdk.weibo.utils.WbShareCallback;
public class MainActivity extends AppCompatActivity implements WbShareCallback {
private EditText editTextContent;
private ImageView imageViewPreview;
private Button btnShareText, btnShareImage, btnShareWebpage;
// 微博分享回调管理器
private WbCallbackManager wbCallbackManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 初始化视图
editTextContent = findViewById(R.id.edit_content);
imageViewPreview = findViewById(R.id.image_preview);
btnShareText = findViewById(R.id.btn_share_text);
btnShareImage = findViewById(R.id.btn_share_image);
btnShareWebpage = findViewById(R.id.btn_share_webpage);
// 初始化微博回调管理器
wbCallbackManager = WbCallbackManager.getInstance();
wbCallbackManager.registerWbShareCallback(this);
// 设置分享按钮点击事件
btnShareText.setOnClickListener(v -> shareText());
btnShareImage.setOnClickListener(v -> shareImage());
btnShareWebpage.setOnClickListener(v -> shareWebpage());
}
/**
* 分享纯文本到微博
*/
private void shareText() {
String text = editTextContent.getText().toString().trim();
if (text.isEmpty()) {
Toast.makeText(this, "请输入分享内容", Toast.LENGTH_SHORT).show();
return;
}
// 创建分享参数
HashMap<String, Object> params = new HashMap<>();
params.put("Text", text);
// 执行分享
Platform weibo = ShareSDK.getPlatform(Weibo.NAME);
weibo.share(params);
}
/**
* 分享图片到微博
*/
private void shareImage() {
// 获取图片资源(这里使用应用内资源,实际应用中可能需要从相册选择或网络下载)
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.share_image);
// 将Bitmap转换为文件路径(ShareSDK需要文件路径)
String imagePath = saveBitmapToFile(bitmap);
if (imagePath == null) {
Toast.makeText(this, "图片准备失败", Toast.LENGTH_SHORT).show();
return;
}
// 创建分享参数
HashMap<String, Object> params = new HashMap<>();
params.put("Text", editTextContent.getText().toString().trim());
params.put("Image", imagePath); // 图片文件路径
// 执行分享
Platform weibo = ShareSDK.getPlatform(Weibo.NAME);
weibo.share(params);
}
/**
* 分享网页到微博
*/
private void shareWebpage() {
String text = editTextContent.getText().toString().trim();
if (text.isEmpty()) {
text = "推荐一个好应用";
}
// 创建分享参数
HashMap<String, Object> params = new HashMap<>();
params.put("Text", text);
params.put("Title", "应用推荐");
params.put("TitleUrl", "https://www.example.com"); // 网页链接
params.put("Site", "我的应用");
params.put("SiteUrl", "https://www.example.com");
// 可选:设置分享图片
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.share_image);
String imagePath = saveBitmapToFile(bitmap);
if (imagePath != null) {
params.put("Image", imagePath);
}
// 执行分享
Platform weibo = ShareSDK.getPlatform(Weibo.NAME);
weibo.share(params);
}
/**
* 将Bitmap保存为文件
*/
private String saveBitmapToFile(Bitmap bitmap) {
try {
File file = new File(getExternalFilesDir(null), "share_image.jpg");
if (file.exists()) {
file.delete();
}
java.io.FileOutputStream out = new java.io.FileOutputStream(file);
bitmap.compress(Bitmap.CompressFormat.JPEG, 80, out);
out.flush();
out.close();
return file.getAbsolutePath();
} catch (IOException e) {
e.printStackTrace();
return null;
}
}
@Override
protected void onDestroy() {
super.onDestroy();
// 注销微博回调
if (wbCallbackManager != null) {
wbCallbackManager.unregisterWbShareCallback(this);
}
}
// WbShareCallback 接口实现
@Override
public void onWbShareSuccess() {
Toast.makeText(this, "微博分享成功", Toast.LENGTH_SHORT).show();
}
@Override
public void onWbShareCancel() {
Toast.makeText(this, "微博分享取消", Toast.LENGTH_SHORT).show();
}
@1Override
public void onWbShareFail(int errorCode) {
String errorMsg = "微博分享失败";
switch (errorCode) {
case 0:
errorMsg = "分享成功";
break;
case 1:
errorMsg = "用户取消分享";
break;
case 2:
errorMsg = "发送失败";
分享失败
break;
case 3:
errorMsg = "授权失败";
break;
case 4:
errorMsg = "不支持的请求";
break;
default:
errorMsg = "未知错误: " + errorCode;
}
Toast.makeText(this, errorMsg, Toast.LENGTH_SHORT).show();
}
}
2.4 处理微博授权和SSO回调
微博分享需要用户授权,ShareSDK会自动处理授权流程。但需要在AndroidManifest.xml中配置Intent Filter来处理SSO回调:
<!-- 在MainActivity中添加Intent Filter -->
<activity
android:name=".MainActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<!-- 处理微博SSO回调 -->
<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="wb你的AppKey" /> <!-- 例如:wb123456789 -->
</intent-filter>
</activity>
在MainActivity中处理onNewIntent:
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
setIntent(intent);
// 处理微博SSO回调
if (intent != null && intent.getData() != null) {
String scheme = intent.getData().getScheme();
if (scheme != null && scheme.startsWith("wb")) {
// 由ShareSDK处理SSO回调
ShareSDK.handleIntent(intent);
}
}
}
三、iOS平台集成详解
3.1 添加框架和配置项目
步骤1:添加ShareSDK框架
- 将下载的ShareSDK框架拖入Xcode项目
- 在”General” -> “Frameworks, Libraries, and Embedded Content”中确保以下框架被正确添加:
- ShareSDK.framework
- ShareSDKExtension.framework
- ShareSDKConnector.framework
- MOBFoundation.framework
- WeiboSDK.framework(微博SDK)
步骤2:配置Build Settings
Other Linker Flags: -ObjC
Enable Bitcode: NO (微博SDK不支持Bitcode)
步骤3:配置Info.plist
<key>LSApplicationQueriesSchemes</key>
<array>
<string>weibo</string>
<string>weibosdk</string>
<string>weibosdk2.5</string>
</array>
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleURLSchemes</key>
<array>
<string>wb你的AppKey</string> <!-- 例如:wb123456789 -->
</array>
</dict>
</array>
<!-- 微博需要的权限描述 -->
<key>NSPhotoLibraryUsageDescription</key>
<string>需要访问相册以分享图片</string>
<key>NSCameraUsageDescription</key>
<string>需要访问相机以拍摄照片分享</string>
3.2 初始化ShareSDK
在AppDelegate.m中进行初始化:
#import "AppDelegate.h"
#import <ShareSDK/ShareSDK.h>
#import <ShareSDKConnector/ShareSDKConnector.h>
#import <ShareSDKExtension/SSEShareHelper.h>
#import <MOBFoundation/MOBFoundation.h>
// 微博SDK头文件
#import "WeiboSDK.h"
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// 初始化ShareSDK
[ShareSDK registerActivePlatforms:@[
@(SSDKPlatformTypeSinaWeibo)
] onImport:^(SSDKPlatformType platformType) {
switch (platformType) {
case SSDKPlatformTypeSinaWeibo:
[ShareSDKConnector connectWeibo:[WeiboSDK class]];
break;
default:
break;
}
} onConfiguration:^(SSDKPlatformType platformType, NSMutableDictionary *appInfo) {
switch (platformType) {
case SSDKPlatformTypeSinaWeibo:
[appInfo SSDKSetupSinaWeiboByAppKey:@"你的微博AppKey"
appSecret:@"你的微博AppSecret"
redirectUri:@"https://api.weibo.com/oauth2/default.html"
authType:SSDKAuthTypeBoth];
break;
default:
break;
}
}];
// 如果需要处理微博回调
[WeiboSDK registerApp:@"你的微博AppKey"];
return YES;
}
// 处理微博SSO回调 (iOS 9+)
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options {
return [WeiboSDK handleOpenURL:url delegate:self];
}
// 处理微博SSO回调 (iOS 8及以下)
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {
return [WeiboSDK handleOpenURL:url delegate:self];
}
// 实现WeiboSDKDelegate协议(处理授权回调)
- (void)didReceiveWeiboRequest:(WBBaseRequest *)request {
// 处理微博请求(通常不需要)
}
- (void)didReceiveWeiboResponse:(WBBaseResponse *)response {
// 处理微博响应(授权或分享回调)
if ([response isKindOfClass:[WBAuthorizeResponse class]]) {
// 授权回调
WBAuthorizeResponse *authResponse = (WBAuthorizeResponse *)response;
if (authResponse.statusCode == WeiboSDKResponseStatusCodeSuccess) {
NSLog(@"微博授权成功,UserID: %@", authResponse.userID);
// 保存授权信息
[[NSUserDefaults standardUserDefaults] setObject:authResponse.accessToken forKey:@"WeiboAccessToken"];
[[NSUserDefaults standardUserDefaults] setObject:authResponse.userID forKey:@"WeiboUserID"];
[[NSUserDefaults standardUserDefaults] synchronize];
} else {
NSLog(@"微博授权失败: %ld", (long)authResponse.statusCode);
}
} else if ([response isKindOfClass:[WBShareMessageResponse class]]) {
// 分享回调
WBShareMessageResponse *shareResponse = (WBShareMessageResponse *)response;
if (shareResponse.statusCode == WeiboSDKResponseStatusCodeSuccess) {
NSLog(@"微博分享成功");
// 发送通知更新UI
[[NSNotificationCenter defaultCenter] postNotificationName:@"WeiboShareSuccess" object:nil];
} else {
NSLog(@"微博分享失败: %ld", (long)shareResponse.statusCode);
[[NSNotificationCenter defaultCenter] postNotificationName:@"WeiboShareFail" object:@(shareResponse.statusCode)];
}
}
}
@end
3.3 实现一键分享功能
在ViewController中实现分享功能:
#import "ViewController.h"
#import <ShareSDK/ShareSDK.h>
#import <ShareSDKExtension/SSEShareHelper.h>
#import <MOBFoundation/MOBFoundation.h>
#import "WeiboSDK.h"
@interface ViewController () <WeiboSDKDelegate>
@property (weak, nonatomic) IBOutlet UITextField *contentTextField;
@property (weak, nonatomic) IBOutlet UIImageView *previewImageView;
@property (weak, nonatomic) IBOutlet UIButton *shareTextButton;
@property (weak, nonatomic) IBOutlet UIButton *shareImageButton;
@property (weak, nonatomic) IBOutlet UIButton *shareWebpageButton;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// 设置默认图片
self.previewImageView.image = [UIImage imageNamed:@"share_image"];
// 添加按钮事件
[self.shareTextButton addTarget:self action:@selector(shareText) forControlEvents:UIControlEventTouchUpInside];
[self.shareImageButton addTarget:self action:@selector(shareImage) forControlEvents:UIControlEventTouchUpInside];
[self.shareWebpageButton addTarget:self action:@selector(shareWebpage) forControlEvents:UIControlEventTouchUpInside];
// 注册通知监听分享结果
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(weiboShareSuccess) name:@"WeiboShareSuccess" object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(weiboShareFail:) name:@"WeiboShareFail" object:nil];
}
#pragma mark - 分享方法
/**
* 分享纯文本到微博
*/
- (void)shareText {
NSString *text = self.contentTextField.text;
if (text.length == 0) {
[self showAlertWithTitle:@"提示" message:@"请输入分享内容"];
return;
}
// 创建分享参数
NSMutableDictionary *shareParams = [NSMutableDictionary dictionary];
[shareParams SSDKSetupShareParamsByText:text
images:nil
url:nil
title:nil
type:SSDKContentTypeText];
// 执行分享
[ShareSDK share:SSDKPlatformTypeSinaWeibo
parameters:shareParams
onStateChanged:^(SSDKResponseState state, NSDictionary *userData, SSDKContentEntity *contentEntity, NSError *error) {
switch (state) {
case SSDKResponseStateSuccess:
[self showAlertWithTitle:@"分享成功" message:@"文本分享成功"];
break;
case SSDKResponseStateFail:
[self showAlertWithTitle:@"分享失败" message:[NSString stringWithFormat:@"%@", error]];
break;
case SSDKResponseStateCancel:
[self showAlertWithTitle:@"分享取消" message:@"用户取消分享"];
break;
default:
break;
}
}];
}
/**
* 分享图片到微博
*/
- (void)shareImage {
NSString *text = self.contentTextField.text;
if (text.length == 0) {
text = @"分享图片";
}
// 获取图片(这里使用应用内图片,实际应用中可能需要从相册选择)
UIImage *image = self.previewImageView.image;
if (!image) {
[self showAlertWithTitle:@"提示" message:@"没有可分享的图片"];
return;
}
// 创建分享参数
NSMutableDictionary *shareParams = [NSMutableDictionary dictionary];
[shareParams SSDKSetupShareParamsByText:text
images:@[image]
url:nil
title:nil
type:SSDKContentTypeImage];
// 执行分享
[ShareSDK share:SSDKPlatformTypeSinaWeibo
parameters:shareParams
onStateChanged:^(SSDKResponseState state, NSDictionary *userData, SSDKContentEntity *contentEntity, NSError *error) {
switch (state) {
case SSDKResponseStateSuccess:
[self showAlertWithTitle:@"分享成功" message:@"图片分享成功"];
break;
case SSDKResponseStateFail:
[self showAlertWithTitle:@"分享失败" message:[NSString stringWithFormat:@"%@", error]];
break;
case SSDKResponseStateCancel:
[self showAlertWithTitle:@"分享取消" message:@"用户取消分享"];
break;
default:
break;
}
}];
}
/**
* 分享网页到微博
*/
- (void)shareWebpage {
NSString *text = self.contentTextField.text;
if (text.length == 0) {
text = @"推荐一个好应用";
}
// 获取图片
UIImage *image = self.previewImageView.image;
// 创建分享参数
NSMutableDictionary *shareParams = [NSMutableDictionary dictionary];
[shareParams SSDKSetupShareParamsByText:text
images:image ? @[image] : nil
url:[NSURL URLWithString:@"https://www.example.com"]
title:@"应用推荐"
type:SSDKContentTypeWebPage];
// 执行分享
[ShareSDK share:SSDKPlatformTypeSinaWeibo
parameters:shareParams
onStateChanged:^(SSDKResponseState state, NSDictionary *userData, SSDKContentEntity *contentEntity, NSError *error) {
switch (state) {
case SSDKResponseStateSuccess:
[self showAlertWithTitle:@"分享成功" message:@"网页分享成功"];
break;
case SSDKResponseStateFail:
[self showAlertWithTitle:@"分享失败" message:[NSString stringWithFormat:@"%@", error]];
break;
case SSDKResponseStateCancel:
[self showAlertWithTitle:@"分享取消" message:@"用户取消分享"];
break;
default:
break;
}
}];
}
#pragma mark - 辅助方法
- (void)showAlertWithTitle:(NSString *)title message:(NSString *)message {
UIAlertController *alert = [UIAlertController alertControllerWithTitle:title
message:message
preferredStyle:UIAlertControllerStyleAlert];
[alert addAction:[UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleDefault handler:nil]];
[self presentViewController:alert animated:YES completion:nil];
}
#pragma mark - 通知处理
- (void)weiboShareSuccess {
dispatch_async(dispatch_get_main_queue(), ^{
[self showAlertWithTitle:@"分享成功" message:@"微博分享成功"];
});
}
- (void)weiboShareFail:(NSNotification *)notification {
NSInteger errorCode = [notification.object integerValue];
NSString *errorMsg = [self errorMessageForCode:errorCode];
dispatch_async(dispatch_get_main_queue(), ^{
[self showAlertWithTitle:@"分享失败" message:errorMsg];
});
}
- (NSString *)errorMessageForCode:(NSInteger)code {
switch (code) {
case WeiboSDKResponseStatusCodeSuccess: return @"成功";
case WeiboSDKResponseStatusCodeUserCancel: return @"用户取消";
case WeiboSDKResponseStatusCodeSentFail: return @"发送失败";
case WeiboSDKResponseStatusCodeAuthDeny: return @"授权失败";
case WeiboSDKResponseStatusCodeUnsupport: return @"不支持的请求";
default: return [NSString stringWithFormat:@"未知错误: %ld", (long)code];
}
}
- (void)dealloc {
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
@end
3.4 处理微博授权
如果需要先授权再分享,可以添加授权方法:
/**
* 检查微博授权状态
*/
- (BOOL)isWeiboAuthorized {
NSString *accessToken = [[NSUserDefaults standardUserDefaults] objectForKey:@"WeiboAccessToken"];
NSString *userID = [[NSUserDefaults standardUserDefaults] objectForKey:@"WeiboUserID"];
return (accessToken != nil && userID != nil);
}
/**
* 控行微博授权
*/
- (void)authorizeWeibo {
[ShareSDK authorize:SSDKPlatformTypeSinaWeibo
parameters:nil
onStateChanged:^(SSDKResponseState state, NSDictionary *userData, SSDKUser *user, NSError *error) {
switch (state) {
case SSDKResponseStateSuccess:
[self showAlertWithTitle:@"授权成功" message:@"微博授权成功"];
// 保存授权信息
[[NSUserDefaults standardUserDefaults] setObject:user.credential.token forKey:@"WeiboAccessToken"];
[[NSUserDefaults standardUserDefaults] setObject:user.uid forKey:@"WeiboUserID"];
[[NSUserDefaults standardUserDefaults] synchronize];
break;
case SSDKResponseStateFail:
[self showAlertWithTitle:@"授权失败" message:[NSString stringWithFormat:@"%@", error]];
break;
case SSDKResponseStateCancel:
[self showAlertWithTitle:@"授权取消" message:@"用户取消授权"];
break;
default:
break;
}
}];
}
四、高级功能与优化
4.1 分享内容优化
1. 图片处理优化
// Android: 图片压缩和格式优化
private String optimizeImageForShare(Bitmap originalBitmap) {
// 1. 压缩图片尺寸(微博限制最大4MB)
int maxWidth = 1024;
int maxHeight = 1024;
float scale = Math.min((float)maxWidth / originalBitmap.getWidth(),
(float)maxHeight / originalBitmap.getHeight());
if (scale < 1) {
originalBitmap = Bitmap.createScaledBitmap(originalBitmap,
(int)(originalBitmap.getWidth() * scale),
(int)(originalBitmap.getHeight() * scale), true);
}
// 2. 压缩质量
File file = new File(getExternalFilesDir(null), "optimized_share.jpg");
try {
FileOutputStream out = new FileOutputStream(file);
originalBitmap.compress(Bitmap.CompressFormat.JPEG, 85, out);
out.flush();
out.close();
return file.getAbsolutePath();
} catch (IOException e) {
e.printStackTrace();
return null;
}
}
// iOS: 图片压缩和格式优化
- (UIImage *)optimizeImageForShare:(UIImage *)originalImage {
// 1. 调整尺寸
CGSize targetSize = CGSizeMake(1024, 1024);
if (originalImage.size.width > targetSize.width || originalImage.size.height > targetSize.height) {
CGFloat widthRatio = targetSize.width / originalImage.size.width;
CGFloat heightRatio = targetSize.height / originalImage.size.height;
CGFloat scaleFactor = MIN(widthRatio, heightRatio);
CGSize scaledSize = CGSizeMake(originalImage.size.width * scaleFactor, originalImage.size.height * scaleFactor);
UIGraphicsBeginImageContext(scaledSize);
[originalImage drawInRect:CGRectMake(0, 0, scaledSize.width, scaledSize.height)];
UIImage *scaledImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
originalImage = scaledImage;
}
// 2. 压缩质量
NSData *imageData = UIImageJPEGRepresentation(originalImage, 0.85);
return [UIImage imageWithData:imageData];
}
2. 文本内容处理
// Android: 文本长度检查和特殊字符处理
private String processTextContent(String text) {
// 微博限制140字符(旧版)或2000字符(新版),建议控制在140以内
if (text.length() > 140) {
text = text.substring(0, 137) + "...";
}
// 处理特殊字符,避免编码问题
text = text.replace("\n", " ").replace("\r", " ");
return text;
}
4.2 错误处理与用户反馈
统一的错误处理机制:
// Android: 统一错误处理
private void handleShareError(Throwable error) {
String message;
if (error instanceof WeiboException) {
WeiboException weiboError = (WeiboException) error;
switch (weiboError.getErrorCode()) {
case 21319:
message = "授权过期,请重新授权";
// 可以引导用户重新授权
showReAuthDialog();
break;
case 21327:
message = "分享内容包含敏感信息";
break;
default:
message = "微博分享失败: " + weiboError.getMessage();
}
} else if (error instanceof NetworkException) {
message = "网络连接失败,请检查网络设置";
} else {
message = "分享失败: " + error.getMessage();
}
Toast.makeText(this, message, Toast.LENGTH_LONG).show();
}
private void showReAuthDialog() {
new AlertDialog.Builder(this)
.setTitle("重新授权")
.setMessage("微博授权已过期,需要重新授权才能继续分享")
.setPositiveButton("重新授权", (dialog, which) -> {
// 执行重新授权
Platform weibo = ShareSDK.getPlatform(Weibo.NAME);
weibo.removeAccount(true); // 清除旧授权
weibo.SSOSetting(true);
weibo.showUser(null); // 触发授权
})
.setNegativeButton("取消", null)
.show();
}
// iOS: 统一错误处理
- (void)handleShareError:(NSError *)error {
NSString *message;
if (error.code == 21319) {
message = @"授权过期,请重新授权";
[self showReAuthDialog];
} else if (error.code == 21327) {
message = @"分享内容包含敏感信息";
} else if (error.code == -1009) {
message = @"网络连接失败,请检查网络设置";
} else {
message = [NSString stringWithFormat:@"分享失败: %@", error.localizedDescription];
}
[self showAlertWithTitle:@"分享失败" message:message];
}
- (void)showReAuthDialog {
UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"重新授权"
message:@"微博授权已过期,需要重新授权才能继续分享"
preferredStyle:UIAlertControllerStyleAlert];
[alert addAction:[UIAlertAction actionWithTitle:@"重新授权" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
// 执行重新授权
[ShareSDK cancelAuthorize:SSDKPlatformTypeSinaWeibo];
[self authorizeWeibo];
}]];
[alert addAction:[UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:nil]];
[self presentViewController:alert animated:YES completion:nil];
}
4.3 性能优化建议
1. 异步处理
// Android: 使用异步任务处理图片和网络操作
private void shareWithAsyncProcessing() {
new AsyncTask<Void, Void, HashMap<String, Object>>() {
@Override
protected HashMap<String, Object> doInBackground(Void... voids) {
// 在后台线程处理图片压缩等耗时操作
HashMap<String, Object> params = new HashMap<>();
params.put("Text", processTextContent(editTextContent.getText().toString()));
if (imageViewPreview.getDrawable() != null) {
Bitmap bitmap = ((BitmapDrawable) imageViewPreview.getDrawable()).getBitmap();
String imagePath = optimizeImageForShare(bitmap);
if (imagePath != null) {
params.put("Image", imagePath);
}
}
return params;
}
@Override
protected void onPostExecute(HashMap<String, Object> params) {
// 在主线程执行分享
Platform weibo = ShareSDK.getPlatform(Weibo.NAME);
weibo.share(params);
}
}.execute();
}
2. 内存管理
// iOS: 自动释放池管理大图内存
- (void)shareImageWithMemoryManagement {
@autoreleasepool {
UIImage *originalImage = [UIImage imageNamed:@"large_image"];
UIImage *optimizedImage = [self optimizeImageForShare:originalImage];
NSMutableDictionary *shareParams = [NSMutableDictionary dictionary];
[shareParams SSDKSetupShareParamsByText:@"分享内容"
images:@[optimizedImage]
url:nil
title:nil
type:SSDKContentTypeImage];
[ShareSDK share:SSDKPlatformTypeSinaWeibo
parameters:shareParams
onStateChanged:^(SSDKResponseState state, NSDictionary *userData, SSDKContentEntity *contentEntity, NSError *error) {
// 处理结果
}];
}
}
4.4 监控与统计
添加分享统计:
// Android: 分享统计
private void trackShareEvent(String platform, String contentType, boolean success) {
// 可以集成友盟、Firebase等统计SDK
// 这里仅作示例
Map<String, String> params = new HashMap<>();
params.put("platform", platform);
params.put("content_type", contentType);
params.put("success", String.valueOf(success));
// 发送统计事件
// Analytics.logEvent("share", params);
}
// iOS: 分享统计
- (void)trackShareEvent:(NSString *)platform contentType:(NSString *)contentType success:(BOOL)success {
// 可以集成友盟、Firebase等统计SDK
// 这里仅作示例
NSDictionary *params = @{
@"platform": platform,
@"content_type": contentType,
@"success": success ? @"YES" : @"NO"
};
// 发送统计事件
// [Analytics logEvent:@"share" parameters:params];
}
五、常见问题与解决方案
5.1 授权失败问题
问题1:授权失败,错误码21319
- 原因:授权过期或授权信息被清除
- 解决方案:
// Android: 清除旧授权并重新授权 Platform weibo = ShareSDK.getPlatform(Weibo.NAME); weibo.removeAccount(true); // 清除授权信息 weibo.SSOSetting(true); weibo.showUser(null); // 触发授权流程
问题2:SSO授权失败,fallback到网页授权
- 原因:未安装微博客户端或微博客户端版本过低
- 解决方案:这是正常行为,ShareSDK会自动处理。如需强制SSO,可检查微博客户端是否安装:
// Android: 检查微博是否安装 private boolean isWeiboInstalled() { try { getPackageManager().getPackageInfo("com.sina.weibo", 0); return true; } catch (PackageManager.NameNotFoundException e) { return false; } }
5.2 分享内容被屏蔽
问题:分享内容被微博屏蔽或审核不通过
- 原因:内容包含敏感词、链接或图片违规
- 解决方案:
- 内容过滤:
// 敏感词过滤(示例) private String filterSensitiveWords(String text) { String[] sensitiveWords = {"敏感词1", "敏感词2", "赌博", "色情"}; for (String word : sensitiveWords) { text = text.replace(word, "***"); } return text; } - 图片合规性:确保图片不包含违规内容
- 链接白名单:只分享微博白名单内的链接
- 内容过滤:
5.3 图片分享失败
问题:图片分享失败,提示”图片格式不支持”
原因:图片格式、大小或路径问题
解决方案:
// Android: 确保图片格式和大小正确 private boolean validateImage(String imagePath) { File file = new File(imagePath); if (!file.exists() || file.length() == 0) { return false; } // 检查文件大小(微博限制4MB) if (file.length() > 4 * 1024 * 1024) { return false; } // 检查图片格式 Bitmap bitmap = BitmapFactory.decodeFile(imagePath); return bitmap != null; }
5.4 回调不触发
问题:分享后没有收到回调
- 原因:回调配置错误或Activity被销毁
- 解决方案:
- 确保在AndroidManifest.xml中正确配置了Intent Filter
- 确保在Activity中正确处理onNewIntent
- 确保在iOS的AppDelegate中正确处理openURL
5.5 多平台同时分享
问题:如何同时分享到多个平台
解决方案:
// Android: 批量分享 private void shareToMultiplePlatforms() { String text = editTextContent.getText().toString(); String imagePath = saveBitmapToFile(bitmap); // 分享到微博 Platform weibo = ShareSDK.getPlatform(Weibo.NAME); HashMap<String, Object> weiboParams = new HashMap<>(); weiboParams.put("Text", text); weiboParams.put("Image", imagePath); weibo.share(weiboParams); // 分享到微信(示例) Platform wechat = ShareSDK.getPlatform(Wechat.NAME); HashMap<String, Object> wechatParams = new HashMap<>(); wechatParams.put("Text", text); wechatParams.put("Image", imagePath); wechat.share(wechatParams); }
六、最佳实践与安全建议
6.1 安全最佳实践
1. 密钥安全管理
- 不要将微博App Secret硬编码在客户端代码中
- 建议:通过后端服务器进行OAuth授权,客户端只保存access token
- 实现方案:
// Android: 从服务器获取授权配置 private void initShareSDKFromServer() { // 从服务器获取微博App Key(不包含App Secret) String appKey = getServerConfig("weibo_app_key"); if (appKey != null) { Platform weibo = ShareSDK.getPlatform(Weibo.NAME); // 只设置App Key,不设置App Secret // 实际授权通过后端进行 } }
2. 权限最小化
- 只在需要时请求权限
- Android 11+使用分区存储(Scoped Storage)
- iOS使用PhotoPicker代替直接访问相册
6.2 用户体验优化
1. 分享前预览
// Android: 分享前预览
private void showSharePreview(String text, String imagePath) {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("分享预览");
View view = getLayoutInflater().inflate(R.layout.dialog_share_preview, null);
TextView textPreview = view.findViewById(R.id.text_preview);
ImageView imagePreview = view.findViewById(R.id.image_preview);
textPreview.setText(text);
if (imagePath != null) {
imagePreview.setImageBitmap(BitmapFactory.decodeFile(imagePath));
}
builder.setView(view);
builder.setPositiveButton("确认分享", (dialog, which) -> {
// 执行分享
performShare(text, imagePath);
});
builder.setNegativeButton("取消", null);
builder.show();
}
2. 分享进度提示
// iOS: 显示分享进度
- (void)showShareProgress {
UIAlertController *progressAlert = [UIAlertController alertControllerWithTitle:@"分享中..."
message:nil
preferredStyle:UIAlertControllerStyleAlert];
UIActivityIndicatorView *indicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];
indicator.color = [UIColor grayColor];
[indicator startAnimating];
[progressAlert.view addSubview:indicator];
[self presentViewController:progressAlert animated:YES completion:nil];
// 3秒后自动消失(防止卡死)
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[progressAlert dismissViewControllerAnimated:YES completion:nil];
});
}
6.3 合规性建议
1. 遵守平台规则
- 仔细阅读微博开放平台的使用条款
- 确保分享内容符合社区规范
- 及时处理用户投诉和举报
2. 用户隐私保护
- 明确告知用户分享内容
- 提供取消分享的选项
- 不收集不必要的用户信息
3. 数据存储
- 定期清理缓存的分享文件
- 不存储用户的授权信息到不安全的位置
- 遵守GDPR等隐私法规
七、总结
通过ShareSDK集成微博分享功能,开发者可以快速实现跨平台的社交分享能力,大幅提升开发效率。本文从环境配置、代码实现、高级优化到问题排查,提供了完整的解决方案。关键要点包括:
- 正确配置:确保微博开放平台和ShareSDK的配置信息准确无误
- 权限管理:合理处理授权流程,及时更新过期的授权
- 内容优化:对分享内容进行预处理,确保格式和大小符合要求
- 错误处理:建立完善的错误处理机制,提供良好的用户反馈
- 安全合规:保护用户隐私,遵守各平台规则
随着微博API的不断更新,建议定期关注官方文档和ShareSDK的版本更新,及时调整集成方案。同时,可以结合业务需求,扩展更多高级功能,如分享统计、用户画像分析等,进一步提升应用的社交传播效果。
