移动开发平台 mPaaS 分享

By | 2021年4月23日

此功能仅在 10.1.60 以及以上基线版本中支持,客户端需在原生代码中自行实现分享功能。

onShareAppMessage

Page 中定义 onShareAppMessage 函数,设置该页面的分享信息。

  • 每个 Page 页面的右上角菜单中默认会显示 分享 按钮,重写了 onShareAppMessage 函数,只是自定义分享内容。
  • 该接口在用户点击 分享 按钮时调用。
  • 此事件需要返回一个 Object,用于自定义分享内容。

入参

参数 类型 说明 最低版本
from String 触发来源:

  • button:页面页分享按钮触发;
  • menu:右上角分享按钮触发。
1.10.0
target Object 如果 from 值为 button,则 target 为触发这次分享的 button,否则为 undefined。 1.10.0
webViewUrl String 页面中包含 web-view 组件时,返回当前 web-view 的 URL。 1.6.0

返回值

名称 类型 必填 描述 最低版本
title String 自定义分享标题。
desc String 自定义分享描述:由于分享到微博只支持最大长度 140 个字,因此建议长度不要超过该限制。
path String 自定义分享页面的路径,path 中的自定义参数可在小程序生命周期的 onLoad 方法中获取(参数传递遵循 http get 的传参规则)。客户端实现分享场景时,该字段在原生代码的名称对应为 page
imageUrl String 自定义分享小图标元素,支持网络图片路径、apFilePath 路径和相对路径。 1.4.0
bgImgUrl String 自定义分享预览大图,建议尺寸 750×825,支持网络图片路径、apFilePath 路径和相对路径。 1.9.0
success Function 分享成功后回调。 1.4.0
fail Function 分享失败后回调。 1.4.0

代码示例

  
  1. Page({
  2. onShareAppMessage() {
  3. return {
  4. title: '小程序示例',
  5. desc: '小程序官方示例 Demo,展示已支持的接口能力及组件。',
  6. path: 'page/component/component-pages/view/view?param=123'
  7. };
  8. },
  9. });

页面内发起分享

说明:基础库版本 1.1.0 开始支持。

通过给 button 组件设置属性 open-type="share",可以在用户点击按钮后触发 Page.onShareAppMessage() 事件,并唤起分享面板,如果当前页面没有定义此事件,则点击后无效果。相关组件:button

App.onShareAppMessage

可以在 App(Object) 构造函数中设置全局的分享 onShareAppMessage 配置,当调用分享时,如果未配置页面级的分享设置则会使用全局的分享设置。

my.hideShareMenu(Object)

说明:基础库版本 1.7.0 开始支持,低版本需做
兼容处理

隐藏分享按钮。

入参

名称 类型 必填 说明
success Function 调用成功的回调函数。
fail Function 调用失败的回调函数。
complete Function 调用结束的回调函数(调用成功、失败都会执行)。

代码示例

  
  1. my.hideShareMenu();

客户端扩展实现

由于分享的实现自定义程度比较高,因此目前暂不提供原生的小程序分享功能,需要您自己实现。

实现方式

  1. 小程序端发起分享时会调用 shareTinyAppMsg 的 JSAPI,它会将 JS 中 onShareAppMessage 方法返回的对象中的参数透传给客户端。
  2. 客户端侧需实现自定义 JS 插件处理 shareTinyAppMsg 事件。关于 JS 插件如何实现,需分别参考 Android 自定义 JSAPIiOS 自定义 JSAPI

Android 代码示例

说明:小程序右上角选项菜单中的分享按钮默认隐藏,需要通过配置容器开关显示,详情参见
容器配置
  • 在小程序代码中发起分享示例如下:
        
    1. Page({
    2. data: {
    3. height: 0,
    4. title: '感谢体验!\n有任何建议欢迎反馈'
    5. },
    6. onLoad() {
    7. const { windowHeight, windowWidth, pixelRatio } = my.getSystemInfoSync();
    8. this.setData({
    9. height: windowHeight * 750 / windowWidth
    10. })
    11. },
    12. onShareAppMessage() {
    13. return {
    14. title: '结果页',
    15. desc: '成功获取到结果',
    16. myprop: 'hello', //自定义参数,如果文档中字段不满足需求,可自行增加,会被透传至客户端
    17. path: 'pages/result/result'
    18. }
    19. }
    20. });
  • 客户端侧 H5 插件代码示例如下:

        
    1. package com.mpaas.demo.nebula;
    2. import com.alibaba.fastjson.JSONObject;
    3. import com.alipay.mobile.antui.dialog.AUNoticeDialog;
    4. import com.alipay.mobile.h5container.api.H5BridgeContext;
    5. import com.alipay.mobile.h5container.api.H5Event;
    6. import com.alipay.mobile.h5container.api.H5EventFilter;
    7. import com.alipay.mobile.h5container.api.H5SimplePlugin;
    8. public class ShareTinyMsgPlugin extends H5SimplePlugin {
    9. private static final String ACTION_SHARE = "shareTinyAppMsg";
    10. @Override
    11. public void onPrepare(H5EventFilter filter) {
    12. super.onPrepare(filter);
    13. filter.addAction(ACTION_SHARE);
    14. }
    15. @Override
    16. public boolean handleEvent(H5Event event, final H5BridgeContext context) {
    17. String action = event.getAction();
    18. if (ACTION_SHARE.equals(action)) {
    19. JSONObject param = event.getParam();
    20. String title = param.getString("title");
    21. String desc = param.getString("desc");
    22. String myprop = param.getString("myprop");
    23. String path = param.getString("page");
    24. String appId = event.getH5page().getParams().getString("appId");
    25. // 此处可调用分享组件,实现后续功能
    26. String message = "应用ID: " + appId + "\n"
    27. + "title: " + title + "\n"
    28. + "desc: " + desc + "\n"
    29. + "myprop: " + myprop + "\n"
    30. + "path: " + path + "\n";
    31. AUNoticeDialog dialog = new AUNoticeDialog(event.getActivity(),
    32. "分享结果", message, "分享成功", "分享失败");
    33. dialog.setPositiveListener(new AUNoticeDialog.OnClickPositiveListener() {
    34. @Override
    35. public void onClick() {
    36. JSONObject result = new JSONObject();
    37. result.put("success", true);
    38. context.sendBridgeResult(result);
    39. }
    40. });
    41. dialog.setNegativeListener(new AUNoticeDialog.OnClickNegativeListener() {
    42. @Override
    43. public void onClick() {
    44. context.sendError(11, "分享失败");
    45. }
    46. });
    47. dialog.show();
    48. //
    49. return true;
    50. }
    51. return false;
    52. }
    53. }

iOS 代码示例

  • 小程序右上角的分享按钮默认为隐藏,您可以在容器初始化时,设置以下接口,以显示分享按钮:

    说明:需手动引入对应头文件
    #import <TinyappService/TASUtils.h>

        
    1. - (void)application:(UIApplication *)application afterDidFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    2. ...
    3. [TASUtils sharedInstance].shoulShowSettingMenu = YES;
    4. ...
    5. }
  • 自定义实现 shareTinyAppMsg JsApi,接受小程序页面透传的参数:
    shareTinyAppMsg

  • MPJsApi4ShareTinyAppMsg 的实现类中,您可以获取到小程序页面分享的参数,进行业务处理。示例代码如下:

        
    1. #import <NebulaPoseidon/NebulaPoseidon.h>
    2. @interface MPJsApi4ShareTinyAppMsg : PSDJsApiHandler
    3. @end
    4. #import "MPJsApi4ShareTinyAppMsg.h"
    5. #import <MessageUI/MessageUI.h>
    6. @interface MPJsApi4ShareTinyAppMsg()<APSKLaunchpadDelegate>
    7. @property(nonatomic, strong) NSString *shareUrlString;
    8. @end
    9. @implementation MPJsApi4ShareTinyAppMsg
    10. - (void)handler:(NSDictionary *)data context:(PSDContext *)context callback:(PSDJsApiResponseCallbackBlock)callback
    11. {
    12. [super handler:data context:context callback:callback];
    13. NSString * appId = context.currentSession.createParam.expandParams[@"appId"];
    14. NSString * page = data[@"page"]?:@"";
    15. NSString * title = data[@"title"]?:@"";
    16. NSString * desc = data[@"desc"]?:@"";
    17. // 拼接分享的内容,调用分享 SDK
    18. self.shareUrlString = [NSString stringWithFormat:@"http://appId=%@&page=%@&title=%@&desc=desc", appId, page, title, desc];
    19. [self openPannel];
    20. }
    21. - (void)openPannel {
    22. NSArray *channelArr = @[kAPSKChannelWeibo, kAPSKChannelWeixin, kAPSKChannelWeixinTimeLine, kAPSKChannelSMS, kAPSKChannelQQ, kAPSKChannelQQZone, kAPSKChannelDingTalkSession, kAPSKChannelALPContact, kAPSKChannelALPTimeLine];
    23. APSKLaunchpad *launchPad = [[APSKLaunchpad alloc] initWithChannels:channelArr sort:NO];
    24. launchPad.tag = 1000;
    25. launchPad.delegate = self;
    26. [launchPad showForView:[[UIApplication sharedApplication] keyWindow] animated:YES];
    27. }
    28. #pragma mark - APSKLaunchpadDelegate
    29. - (void)sharingLaunchpad:(APSKLaunchpad *)launchpad didSelectChannel:(NSString *)channelName {
    30. [self shareWithChannel:channelName tag:launchpad.tag];
    31. [launchpad dismissAnimated:YES];
    32. }
    33. - (void)shareWithChannel:(NSString *)channelName tag:(NSInteger)tag{
    34. APSKMessage *message = [[APSKMessage alloc] init];
    35. message.contentType = @"url";//类型分"text","image", "url"三种
    36. message.content = [NSURL URLWithString:self.shareUrlString];
    37. message.icon = [UIImage imageNamed:@"MPShareKit.bundle/Icon_Laiwang@2x.png"];
    38. message.title = @"这里是网页标题";
    39. message.desc = @"这里是描述信息";
    40. APSKClient *client = [[APSKClient alloc] init];
    41. client.disableToastDisplay = YES;
    42. [client shareMessage:message toChannel:channelName completionBlock:^(NSError *error, NSDictionary *userInfo) {
    43. if(!error) {// 成功
    44. [AUToast presentToastWithin:[[UIApplication sharedApplication] keyWindow]
    45. withIcon:AUToastIconSuccess
    46. text:@"分享成功"
    47. duration:2
    48. logTag:@"demo"];
    49. } else {// 失败
    50. NSString *desc = error.localizedFailureReason.length > 0 ? error.localizedFailureReason : @"分享失败";
    51. [AUToast presentToastWithin:[[UIApplication sharedApplication] keyWindow]
    52. withIcon:AUToastIconNone
    53. text:desc
    54. duration:2
    55. logTag:@"demo"];
    56. NSLog(@"error = %@", error);
    57. }
    58. }];
    59. }
    60. @end

请关注公众号获取更多资料

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注