引言:为什么选择ShareSDK集成微博分享?

在当今移动应用开发中,社交分享功能已成为提升用户活跃度和应用传播的重要手段。微博作为中国最大的社交媒体平台之一,拥有超过5亿的月活跃用户,为App提供了巨大的流量入口。然而,直接集成微博SDK可能会面临复杂的API调用、版本兼容性问题以及多平台适配的挑战。ShareSDK作为一款成熟的第三方移动开发工具,能够帮助开发者快速实现包括微博在内的多个社交平台分享功能,大大降低了开发门槛和维护成本。

ShareSDK的核心优势在于其统一的API设计,开发者只需编写一次代码,即可支持微信、微博、QQ、Facebook等数十个社交平台。对于微博分享而言,ShareSDK封装了OAuth认证、授权登录、内容分享等复杂流程,提供了简洁的回调机制和错误处理方案。本文将从零开始,详细讲解如何在Android和iOS平台集成ShareSDK并实现微博分享功能,包括环境配置、代码实现、回调处理以及常见问题的解决方案。

一、前期准备与环境配置

1.1 注册微博开放平台账号

在开始集成之前,首先需要在微博开放平台(open.weibo.com)注册开发者账号并创建应用。这一步是获取分享功能必要参数的关键。

具体步骤:

  1. 访问微博开放平台(open.weibo.com)并登录
  2. 进入”我的应用”页面,点击”创建新应用”
  3. 填写应用基本信息,包括应用名称、包名(Android)或Bundle ID(iOS)、应用图标等
  4. 提交审核后,在应用详情页获取App Key和App Secret
  5. 配置应用的签名信息(Android)或Bundle ID(iOS)

重要提示:

  • Android应用的包名必须与代码中的AndroidManifest.xml中声明的包名完全一致
  • iOS应用的Bundle ID必须与Xcode项目中的Bundle Identifier一致
  • 签名信息(MD5)需要使用工具生成,确保与发布版本一致

1.2 注册ShareSDK账号并创建应用

接下来需要在ShareSDK官网(www.mob.com)注册账号并创建应用,获取ShareSDK的App Key。

操作流程:

  1. 访问ShareSDK官网并注册账号
  2. 登录后进入控制台,点击”创建应用”
  3. 填写应用信息,选择平台(Android/iOS)
  4. 获取ShareSDK App Key,该Key将用于代码初始化
  5. 在应用配置中添加微博平台,填写之前获取的微博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框架

  1. 将下载的ShareSDK框架拖入Xcode项目
  2. 在”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 分享内容被屏蔽

问题:分享内容被微博屏蔽或审核不通过

  • 原因:内容包含敏感词、链接或图片违规
  • 解决方案
    1. 内容过滤
      
      // 敏感词过滤(示例)
      private String filterSensitiveWords(String text) {
       String[] sensitiveWords = {"敏感词1", "敏感词2", "赌博", "色情"};
       for (String word : sensitiveWords) {
           text = text.replace(word, "***");
       }
       return text;
      }
      
    2. 图片合规性:确保图片不包含违规内容
    3. 链接白名单:只分享微博白名单内的链接

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被销毁
  • 解决方案
    1. 确保在AndroidManifest.xml中正确配置了Intent Filter
    2. 确保在Activity中正确处理onNewIntent
    3. 确保在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集成微博分享功能,开发者可以快速实现跨平台的社交分享能力,大幅提升开发效率。本文从环境配置、代码实现、高级优化到问题排查,提供了完整的解决方案。关键要点包括:

  1. 正确配置:确保微博开放平台和ShareSDK的配置信息准确无误
  2. 权限管理:合理处理授权流程,及时更新过期的授权
  3. 内容优化:对分享内容进行预处理,确保格式和大小符合要求
  4. 错误处理:建立完善的错误处理机制,提供良好的用户反馈
  5. 安全合规:保护用户隐私,遵守各平台规则

随着微博API的不断更新,建议定期关注官方文档和ShareSDK的版本更新,及时调整集成方案。同时,可以结合业务需求,扩展更多高级功能,如分享统计、用户画像分析等,进一步提升应用的社交传播效果。