微信分享,分享与收藏功能 /iOS开发手册

微信分享,分享与收藏功能 /iOS开发手册

开发者在 App 中在集成微信 SDK 后,可调用接口实现,以下依次是文字、图片、视频、网页、小程序、音乐视频类型分享的示例。

WXMediaMessage (微信媒体消息内容)说明

字段类型含义备注
titleNSString消息标题限制长度不超过512Bytes
descriptionNSString描述内容限制长度不超过1KB
thumbDataNSData缩略图的二进制数据限制内容大小不超过32KB
mediaObjectNSObject多媒体数据对象可以为WXImageObject、WXMusicVideoObject、WXVideoObject、WXWebpageObject等
messageExtNSString额外信息mediaObject为 WXMusicVideoObject 时,从微信音乐播放器内跳回,会携带该参数,长度不能超过2k。(iOS、Android双平台要一致)

SendMessageToWXReq(SendMessageToWX请求类)

分享或收藏的目标场景,通过修改 SendMessageToWXReq 的 scene 字段实现。

字段类型含义备注
textNSString发送消息的文本内容
bTextBOOL是否文本消息发送消息的类型,包括文本消息和多媒体消息两种,两者只能选择其一,不能同时发送文本和多媒体消息
messageWXMediaMessage发送消息的多媒体内容|
sceneint发送的目标场景分享到对话:
WXSceneSession
分享到朋友圈:
WXSceneTimeline
分享到收藏:
WXSceneFavorite

示例

一、文字类型分享示例

SendMessageToWXReq *req = [[SendMessageToWXReq alloc] init];
req.bText = YES;
req.text = @"分享的内容";
req.scene = WXSceneSession;
[WXApi sendReq:req];

二、图片类型分享示例

WXImageObject 多媒体消息中包含的图片数据对象

字段类型含义备注
imageDataNSData图片的二进制数据内容大小不超过10MB
UIImage *image = [UIImage imageNamed:@"res2.png"];
imageData = UIImageJPEGRepresentation(image, 0.7);
   
WXImageObject *imageObject = [WXImageObject object];
imageObject.imageData = imageData;

WXMediaMessage *message = [WXMediaMessage message];
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"res5"
                                                     ofType:@"jpg"];
message.thumbData = [NSData dataWithContentsOfFile:filePath];
message.mediaObject = imageObject;

SendMessageToWXReq *req = [[SendMessageToWXReq alloc] init];
req.bText = NO;
req.message = message;
req.scene = WXSceneTimeline;
[WXApi sendReq:req];

三、视频类型分享示例

WXVideoObject 多媒体消息中包含的视频数据对象

字段类型含义备注
videoUrlNSString视频链接限制长度不超过10KB
videoLowBandUrlNSString供低带宽的环境下使用的视频链接限制长度不超过10KB

注意:videoUrl和 videoLowBandUrl 不能同时为空

WXVideoObject *videoObject = [WXVideoObject object];
videoObject.videoUrl = @"视频url";
videoObject.videoLowBandUrl = @"低分辨率视频url";
WXMediaMessage *message = [WXMediaMessage message];
message.title = @"标题";
message.description = @"描述";
[message setThumbImage:[UIImage imageNamed:@"缩略图.jpg"]];
message.mediaObject = videoObject;
SendMessageToWXReq *req = [[SendMessageToWXReq alloc] init];
req.bText = NO;
req.message = message;
req.scene = WXSceneSession;
[WXApi sendReq:req];

四、网页类型分享示例

WXWebpageObject 多媒体消息中包含的网页数据对象

字段类型含义备注
webpageUrlNSStringhtml链接限制长度不超过10KB
WXWebpageObject *webpageObject = [WXWebpageObject object];
webpageObject.webpageUrl = @"https://open.weixin.qq.com";
WXMediaMessage *message = [WXMediaMessage message];
message.title = @"标题";
message.description = @"描述";
[message setThumbImage:[UIImage imageNamed:@"缩略图.jpg"]];
message.mediaObject = webpageObject;
SendMessageToWXReq *req = [[SendMessageToWXReq alloc] init];
req.bText = NO;
req.message = message;
req.scene = WXSceneSession;
[WXApi sendReq:req];

五、小程序类型分享示例

WXMiniProgramObject 多媒体消息中包含的小程序数据对象

字段类型含义备注
webpageUrlNSString兼容低版本的网页链接限制长度不超过10KB
userNameNSString小程序的userName小程序原始 ID 获取方法:登录小程序管理后台 – 设置 – 基本设置 – 帐号信息
pathNSString小程序的页面路径小程序页面路径;对于小游戏,可以只传入 query 部分,来实现传参效果,如:传入 “?foo=bar”
hdImageDataNSData小程序新版本的预览图二进制数据,6.5.9及以上版本微信客户端支持限制大小不超过128KB,自定义图片建议长宽比是 5:4。
withShareTicketBOOL是否使用带 shareTicket 的分享通常开发者希望分享出去的小程序被二次打开时可以获取到更多信息,例如群的标识。可以设置 withShareTicket 为true,当分享卡片在群聊中被其他用户打开时,可以获取到shareTicket,用于获取更多分享信息。详见小程序获取更多分享信息 ,最低客户端版本要求:6.5.13
miniprogramTypeWXMiniProgramType小程序的类型,默认正式版,1.8.1及以上版本开发者工具包支持分享开发版和体验版小程序正式版: WXMiniProgramTypeRelease;
测试版: WXMiniProgramTypeTest;
体验版: WXMiniProgramTypePreview;
WXMiniProgramObject *object = [WXMiniProgramObject object];
object.webpageUrl = webpageUrl;
object.userName = userName;
object.path = path;
object.hdImageData = hdImageData;
object.withShareTicket = withShareTicket;
object.miniProgramType = programType;
WXMediaMessage *message = [WXMediaMessage message];
message.title = @"小程序标题";
message.description = @"小程序描述";
message.thumbData = nil;  //兼容旧版本节点的图片,小于32KB,新版本优先
                          //使用 WXMiniProgramObject 的hdImageData属性
message.mediaObject = object;
SendMessageToWXReq *req = [[SendMessageToWXReq alloc] init];
req.bText = NO;
req.message = message;
req.scene = WXSceneSession;  //目前只支持会话
[WXApi sendReq:req];

六、音乐视频类型分享示例

该类型需要OpenSDK 1.8.9以及以上版本

WXMusicVideoObject 多媒体消息中包含的音乐视频数据对象

字段类型含义备注
musicUrlNSString音频网页的 URL 地址必填,限制长度不超过10KB
musicDataUrlNSString音频数据的 URL 地址必填,限制长度不超过10KB
singerNameNSString歌手名必填,限制长度不超过1KB
durationUInt32音乐时长,歌曲时间必填,不能为0,单位:毫秒,
hdAlbumThumbDataNSData高清专辑封面图选填,大小不超过1MB
albumNameNSString音乐专辑名称选填
songLyricNSString歌词信息 LRC格式选填,长度不能超过32K
musicGenreNSString音乐流派选填
issueDateUInt64发行时间 Unix 时间戳选填,单位:秒
identificationNSString音乐标识符选填,建议填写,用户在微信音乐播放器内跳回应用时会携带该参数,可用于唯一标识一首歌,微信侧不理解(iOS、Android双平台要一致)

发送 MV 到微信:

WXMusicVideoObject *mvObject = [WXMusicVideoObject object];
mvObject.musicUrl = @"音乐url";
mvObject.musicDataUrl = @"音乐数据url";
mvObject.singerName = @"歌手名";
mvObject.duration = 60 * 1000; //音乐时长,毫秒
mvObject.hdAlbumThumbData = hdAlbumThumbData; //高清专辑封面图
mvObject.albumName = @"专辑名";
mvObject.musicGenre = @"音乐流派";
mvObject.issueDate = 1611116532; //发行时间 Unix 时间戳
mvObject.identification = @"test-identification"; //音乐标识符 

WXMediaMessage *message = [WXMediaMessage message];
message.title = @"歌曲名称";//必填,不能为空
message.messageExt = @"额外信息"; //微信跳回时会带上

[message setThumbImage:[UIImage imageNamed:@"缩略图.jpg"]];
message.mediaObject = mvObject;
SendMessageToWXReq *req = [[SendMessageToWXReq alloc] init];
req.bText = NO;
req.message = message;
req.scene = WXSceneSession;
[WXApi sendReq:req];

处理从微信音乐播放器内跳回:

#pragma mark - WXApiDelegate

- (void)onReq:(BaseReq *)req {
    if ([req isKindOfClass:[LaunchFromWXReq class]]) {
        LaunchFromWXReq *launchReq = (LaunchFromWXReq *)req;
        NSString* messageExt = launchReq.message.messageExt;  //分享到微信时的透传额外信息字字段
        if ([launchReq.message.mediaObject isKindOfClass:WXMusicVideoObject.class]) {
            WXMusicVideoObject *musicVideoObject = (WXMusicVideoObject *)launchReq.message.mediaObject;
            NSString *identification = musicVideoObject.identification; //分享到微信时的音乐标识符字段
            //应用可以根据 messageExt 和identification处理逻辑
        }
    }
}

音乐视频类型使用说明:

  1. 注意事项:
    • 音乐视频类型与音乐类型不同,分享至微信的音乐视频消息,直接点击好友会话或朋友圈下的分享内容会跳转到微信原生播放器,可以对音乐作品辅以视频制作成音乐视频,进行点赞、评论、发送给朋友、分享到朋友圈、发布至视频号等。
    • 在播放器里点击跳转入口会跳转回App,没有安装 App 时会打开 musicUrl 链接。
  2. 音乐视频类型分享,请开发者特别注意必填的字段有:
    • WXMediaMessage.title:歌曲名称
    • WXMusicVideoObject.musicUrl:音频网页的 URL 地址
    • WXMusicVideoObject.musicDataUrl:音频数据的 URL 地址
    • WXMusicVideoObject.singerName:歌手名
    • WXMusicVideoObject.duration:歌曲时长,单位为毫秒
  3. 第三方应用在分享时设置的字段 WXMediaMessage.messageExt 字段与WXMusicVideoObject.identification 需要保证 Android 与iOS平台是一致的,否则跨平台分享的消息跳转回应用无法保证能够跳转到对应歌曲。
  4. 无论 WXMediaMessage.mediaObject 类型是什么,WXMediaMessage.messgeExt 字段均会透传是应用在分享时写入的数据,应用可使用该字段进行应用低版本的兼容处理。

注意事项

  1. 发起分享的 App 与小程序属于同一微信开放平台帐号。
  2. 支持分享小程序类型消息至会话,暂不支持分享至朋友圈。
  3. 若客户端版本低于6.5.6或在 iPad 客户端接收,小程序类型分享将自动转成网页类型分享。开发者必须填写网页链接字段,确保低版本客户端能正常打开网页链接。
  4. 对于音乐视频类型的分享,需按照如下格式发送邮件至 hansenxu@tencent.com
    • 邮件主题:帐号 XXX 关于音乐视频类 appmsg 的分享功能申请;
    • 邮件内容:需提供移动应用 appid 和需分享的音频网页的域名信息;
    • 要求:
      • 申请帐号需为已完成主体认证的帐号;
      • 申请“音乐视频类型的分享权限”需先完成“音乐类型的分享权限”,且申请的移动应用的 appid 和域名需一致;
      • 音乐视频类型的分享权限会涉及到相关法务协议的签署,具体签订流程和开通结果请参考邮件回复结果。

微信开放平台Android接入指南

微信开放平台Android接入指南

Android接入指南

注 1:jCenter 服务将在2021年5月1日之后关停,微信 SDK 已迁移到 Maven Central,请开发者及时修改引用仓库。

注 2:微信 SDK 改成通过 Gradle 的方式发布到 Maven Central,包名做了相应修改,从原来的 com.tencent.mm.sdk 修改为 com.tencent.mm.opensdk,需要开发者修改对应的 import 语句。

注 3:接入Open SDK的开发者,请先认真阅读《微信Open SDK个人信息处理规则》并确保对 OpenSDK 的接入使用情况符合上述规则的相关要求。

注 4:本文为微信 Android 终端开发工具的新手使用教程,只涉及教授 SDK 的使用方法,默认读者已经熟悉 IDE 的基本使用方法(Android Studio(推荐) 或 Eclipse),以及具有一定的编程知识基础等。

关于openSDK6.8.0的更新说明

微信将于近期发布 targetSdkVersion 30的客户端版本,因Android11系统特性,该微信版本在Android 11及以上系统版本的设备上运行时,授权登录、分享、微信支付等功能受到影响,可能无法正常使用。为了适配 Android 系统新版本特性,保证微信功能正常使用,请第三方应用2021年11月1日之前进行更新,点击查看更新指引

目录

接入指南

1.申请你的 AppID

请到 开发者应用登记页面 进行登记,登记并选择移动应用进行设置后,将该应用提交审核,只有审核通过的应用才能进行开发。

2.下载 SDK 及 API 文档

Android Studio 环境下:

  • 在 build.gradle 文件中,添加如下依赖即可:
dependencies {
    api 'com.tencent.mm.opensdk:wechat-sdk-android:+'
}

(从6.8.0版本开始,请使用 wechat-sdk-android )

  • 由于 jCenter 服务关停,需要修改成引用 Maven Central,在项目的根 build.gradle 文件中,添加如下代码即可:
buildscript {
    repositories {
        jcenter()       // 原有 jCenter 引用可继续保留
        mavenCentral()
    }
}

allprojects {
    repositories {
        jcenter()      // 原有 jCenter 引用可继续保留
        mavenCentral()
    }
}

特别注意,目前 Maven Central仅支持部分版本:6.6.4、6.6.5、6.6.23、6.7.0、6.7.9、6.8.0,建议开发者升级至最新版本6.8.0。后续所有版本更新都会上传至Maven Central。

Eclipse 环境下:

请前往资源下载页下载最新 SDK 包。

3.搭建开发环境

Android Studio 环境下:

在 Android Studio 中新建你的工程,并保证网络设置可以成功从 Maven Central 下载微信 SDK 即可。

Eclipse 环境下:

[1] 在 Eclipse 中建立你的工程。

[2] 在工程中新建一个 libs 目录,将开发工具包中 libs 目录下的 libammsdk.jar 复制到该目录中(如下图所示,建立了一个名为 SDK_Sample 的工程,并把 jar 包复制到 libs 目录下)。

[3] 右键单击工程,选择 Build Path 中的 Configure Build Path…,选中 Libraries 这个 tab,并通过 Add Jars…导入工程 libs 目录下的 libammsdk.jar 文件。(如下图所示)。

在你需要使用微信终端 API 的文件中导入相应的类。

import com.tencent.mm.opensdk.openapi.WXTextObject;

4.在代码中使用开发工具包

[1] 注册到微信

要使你的程序启动后微信终端能响应你的程序,必须在代码中向微信终端注册你的 id。(如下图所示,可以在程序入口 Activity 的 onCreate 回调函数处,或其他合适的地方将你的应用 id 注册到微信。注册函数示例如下图所示。

	// APP_ID 替换为你的应用从官方网站申请到的合法appID
private static final String APP_ID = "wx88888888";

// IWXAPI 是第三方 app 和微信通信的 openApi 接口
private IWXAPI api;

private regToWx() {
    // 通过 WXAPIFactory 工厂,获取 IWXAPI 的实例
    api = WXAPIFactory.createWXAPI(this, APP_ID, true);

    // 将应用的 appId 注册到微信
    api.registerApp(APP_ID);

   //建议动态监听微信启动广播进行注册到微信
  registerReceiver(new BroadcastReceiver() {
   @Override
   public void onReceive(Context context, Intent intent) {

     // 将该 app 注册到微信
    api.registerApp(Constants.APP_ID);
   }
  }, new IntentFilter(ConstantsAPI.ACTION_REFRESH_WXAPP));

}

[2] 发送请求或响应到微信

现在,你的程序要发送请求或发送响应到微信终端,可以通过 IWXAPI 的 sendReq 和 sendResp 两个方法来实现。

boolean sendReq(BaseReq req);

sendReq 是第三方 app 主动发送消息给微信,发送完成之后会切回到第三方 app 界面。

boolean sendResp(BaseResp resp);

sendResp 是微信向第三方 app 请求数据,第三方 app 回应数据之后会切回到微信界面。

sendReq 的实现示例,如下图所示:

//初始化一个 WXTextObject 对象,填写分享的文本内容
WXTextObject textObj = new WXTextObject();
textObj.text = text;

//用 WXTextObject 对象初始化一个 WXMediaMessage 对象
WXMediaMessage msg = new WXMediaMessage();
msg.mediaObject = textObj;
msg.description = text;

SendMessageToWX.Req req = new SendMessageToWX.Req();
req.transaction = String.valueOf(System.currentTimeMillis());  //transaction字段用与唯一标示一个请求
req.message = msg;
req.scene = mTargetScene;

//调用 api 接口,发送数据到微信
api.sendReq(req);

需要注意的是,SendMessageToWX.Req 的 scene 成员,如果 scene 填 WXSceneSession,那么消息会发送至微信的会话内。如果 scene 填 WXSceneTimeline(微信 4.2 以上支持,com.tencent.mm.opensdk.constants.Build.java 里面定义了各个功能支持的版本号,如果需要检查微信版本支持 API 的情况, 可调用 IWXAPI 的 getWXAppSupportAPI 方法,比如,要判断微信是否支持分享到朋友圈功能,可以如下所示进行判断:

if (api.getWXAppSupportAPI() >= Build.TIMELINE_SUPPORTED_SDK_INT) {
    //do share
}

那么消息会发送至朋友圈。scene 默认值为 WXSceneSession。

sendResp 的实现与 SendReq 类似,如下图所示:

// 初始化一个 WXTextObject 对象
WXTextObject textObj = new WXTextObject();
textObj.text = text;

// 用 WXTextObject 对象初始化一个 WXMediaMessage 对象
WXMediaMessage msg = new WXMediaMessage(textObj);
msg.description = text;

// 构造一个Resp
GetMessageFromWX.Resp resp = new GetMessageFromWX.Resp();
// 将 req 的transaction设置到 resp 对象中,其中 bundle 为微信传递过来的 Intent 所带的内容,通过getExtras()方法获取
resp.transaction = new GetMessageFromWX.Req(bundle).transaction;
resp.message = msg;

//调用 api 接口,发送数据到微信
api. sendResp (resp) ;

具体要发送的内容由第三方 app 开发者定义,具体可参考微信开发工具包中的 SDK Sample Demo 源码。

[3] 接收微信的请求及返回值

如果你的程序需要接收微信发送的请求,或者接收发送到微信请求的响应结果,需要下面 3 步操作:

a. 在你的包名相应目录下新建一个 wxapi 目录,并在该 wxapi 目录下新增一个 WXEntryActivity 类,该类继承自 Activity(例如应用程序的包名为 net.sourceforge.simcpux,则新添加的类如下图所示)

并在 manifest 文件里面加上exported、taskAffinity及 launchMode 属性,其中 exported 设置为true,taskAffinity设置为你的包名,launchMode设置为singleTask,例如:

<activity
    android:name=".wxapi.WXEntryActivity"
    android:label="@string/app_name"
    android:theme="@android:style/Theme.Translucent.NoTitleBar"
    android:exported="true"
    android:taskAffinity="填写你的包名"
    android:launchMode="singleTask">
</activity>

b. 实现 IWXAPIEventHandler 接口,微信发送的请求将回调到 onReq 方法,发送到微信请求的响应结果将回调到 onResp 方法

c. 在 WXEntryActivity 中将接收到的 intent 及实现了 IWXAPIEventHandler 接口的对象传递给 IWXAPI 接口的 handleIntent 方法,示例如下图:

api.handleIntent(getIntent(), this);


当微信发送请求到你的应用,将通过 IWXAPIEventHandler 接口的 onReq 方法进行回调,类似的,应用请求微信的响应结果将通过 onResp 回调。

注意事项

[1]如果需要混淆代码,为了保证 sdk 的正常使用,需要在 proguard.cfg 加上下面两行配置:

-keep class com.tencent.mm.opensdk.** {
    *;
}

-keep class com.tencent.wxop.** {
    *;
}

-keep class com.tencent.mm.sdk.** {
    *;
}

[2]如果需要运行 SDK Sample 工程,需要通过指定的 debug.keystore 来进行签名:

Android Studio 环境下:

signingConfigs {
    debug {
        storeFile file("../debug.keystore")
    }
}

Eclipse 环境下:

请查阅文档《如何运行 SDK Demo 工程 》

至此,你已经能使用微信 Android 开发工具包的 API 内容了。如果想更详细了解每个 API 函数的用法,请查阅 Android 平台参考手册 或自行下载阅读微信 SDK Sample Demo 源码。

前往下载微信 SDK 示例代码

Android 11-更新 openSDK 适配

针对微信 targetSdkVersion 30的客户端版本,因Android11系统特性,该微信版本在Android 11及以上系统版本的设备上运行时,授权登录、分享、微信支付等功能受到影响,可能无法正常使用。为了适配 Android 系统新版本特性,保证微信功能正常使用,请第三方应用2021年11月1日之前进行如下更新:

适配方案

  1. 第三方应用需要更新微信 Android SDK至6.8.0版本,引用代码如下:
dependencies {
    api 'com.tencent.mm.opensdk:wechat-sdk-android:6.8.0'
    // 或者直接引用最新版本
    // api 'com.tencent.mm.opensdk:wechat-sdk-android:+'
}

无论第三方应用 targetSdkVersion 是否升级为30,均需要进行微信 Android SDK版本升级适配。

  1. targetSdkVersion升级到30的第三方应用,由于Android 11 软件包可见性 特性的影响,OpenSDK的接口可能无法正常拉起微信,从而无法使用微信的部分功能,需要在主工程的AndroidManifest.xml 中增加标签,代码如下:
<manifest package="com.example.app">

      ...

      // 在应用的 AndroidManifest.xml 添加如下<queries>标签
    <queries>
        <package android:name="com.tencent.mm" />   // 指定微信包名
    </queries>

      ...

</manifest>

注:添加以上标签之后,需要开发者升级编译工具,否则会出现编译错误。

  • Android Studio 需要升级至 3.3 及以上,建议升级至 4.0 及以上版本
  • Android SDK Build-Tools 需要升级至 30 及以上版本
  • com.android.tools.build:gradle 需要升级至 3.6.0 版本及以上

验证流程

  1. 环境准备:
  2. 验证流程:

(1) 安装第三方应用后,首次触发微信登录功能。(注:该操作前务必不要触发任何分享、跳转等 openSDK 功能)

(2) 若成功完成微信登录功能,即验证 openSDK 更新成功。

(2) 若签名验证失败,收到回调errcode=-6,则需开发者重新检查步骤1和2是否完成。

targetSdkVersion升级到30的第三方应用,具体适配详情另可参考文档Android 11 系统策略更新,请开发者及时适配