跳转到主要内容
PRODUCT DOCUMENTS

快速找到所需文档,高效完成接入与排障

浏览产品文档与友盟 Skill,展开目录并阅读正文。

SDK方法(钉钉)

前置检查

  1. 本文介绍钉钉的分享和登录功能,可参见钉钉接入分享、钉钉接入登录、常见问题。

  2. 确保已在钉钉开放平台申请到应用的Client ID,用于初始化友盟SDK的appId配置项。

  3. @umeng/share从1.1.10版本支持钉钉,确保已按照快速开始文档完成SDK安装与集成。

  4. 分享和登录完成后,需要通过显式Want跳转回您的应用。因此回调Ability必须在 module.json5 中配置 "exported": true(默认为 false),否则钉钉无法外部唤起您的 App。

  5. 支持 API 15 及以上。

功能说明

一、判断钉钉是否安装

  1. 在 module.json5 中增加如下固定配置:

image

  1. 调用钉钉安装方法

import { DingTalk } from '@umeng/share';

DingTalk.isInstalled((result: Record<string, boolean>) => {
  // result.installed 为 true 表示钉钉已安装
  console.log('安装钉钉回调:', result.installed);
});

二、分享面板

ShareBoard分享面板组件可在 UI 页面中按需使用,控制是否展示。

visible可选,若配置则分享或取消会自动关闭面板,若配置则根据开发者限制面板的显示状态,不会自动关闭。

confirm 必选,点击面板确认分享的回调,"dingtalk"表示分享到钉钉平台。

cancel必选,分享面板点击取消的回调。

import { ShareBoard, ddConfig, DingTalk } from '@umeng/share';

ShareBoard({
  visible: this.visible, // 可选,若不传则分享/取消后面板自动关闭;若传入则由开发者完全控制显隐
  confirm: (pl: string) => {
    if (pl === 'dingtalk') { // 分享到钉钉平台
      // 以分享文本为例
      let textObj: ddConfig.TextObject = {
        mText: '友盟分享SDK支持钉钉的登录和分享功能了~',
      };
      DingTalk.shareText(textObj, (result: object) => {
        console.log(`文本回调: ${JSON.stringify(result)}`);
      });
    }
  },
  cancel: () => {
    this.visible = false;
    console.log('取消分享');
  },
});    

三、分享文本

分享文本到钉钉对话框,文本最大 6KB,且不可为空。

mText 必选,文本内容,限制 6KB。

callbackAbility 可选,分享回调的 Ability 名称,默认 EntryAbility。

targetAppBundleName 可选,目标应用的 BundleName,默认为标准钉钉。

import { DingTalk, ddConfig} from '@umeng/share';

const textObj: ddConfig.TextObject = {
  mText: '分享文本内容到钉钉',
  // callbackAbility: 'EntryAbility',
  // targetAppBundleName: 'com.dingtalk.hmos'
};
DingTalk.shareText(textObj, (result: object) => {
  console.log('文本回调', JSON.stringify(result));
});

四、分享图片

分享图片到钉钉对话框。
注意:分享图片仅支持uri格式,每次只能分享一张图片。

mImageUri 必选,图片路径,大小不限(建议 1GB 以内,避免发送失败)。

callbackAbility 可选,分享回调的 Ability 名称,默认 EntryAbility。

targetAppBundleName 可选,目标应用的 BundleName,默认为标准钉钉。

import { DingTalk, ddConfig} from '@umeng/share';

// 以从相册选取照片为例,参见文档下方getPictureUriFromAlbum方法调试。
// const uris: string[] = await this.getPictureUriFromAlbum('image'); 
 
const imageObj: ddConfig.ImageObject = {
  mImageUri: "", // uris[0]
  // callbackAbility: 'EntryAbility',
  // targetAppBundleName: 'com.dingtalk.hmos.aliding'
};

DingTalk.shareImageUri(imageObj, (result: object) => {
  console.log('图片回调:', JSON.stringify(result));
});

五、分享网页链接

分享网页链接到钉钉对话框。

mUrl 必选,网页地址链接。

mTitle 可选,网页标题。

mThumbUrl 可选,网页缩略图链接。

callbackAbility 可选,分享回调的 Ability 名称,默认 EntryAbility。

targetAppBundleName 可选,目标应用的 BundleName,默认为标准钉钉。

import { DingTalk, ddConfig} from '@umeng/share';

const webObj: ddConfig.WebPageObject = {
  mUrl: 'https://www.umeng.com/',
  mTitle: '分享网页标题',
  mThumbUrl: 'https://img.alicdn.com/imgextra/i2/O1CN01OQQ7ec1MNmf3xFWAX_!!6000000001423-2-tps-96-96.png',
  // callbackAbility: 'EntryAbility',
  // targetAppBundleName: 'com.dingtalk.hmos'
};

DingTalk.shareWebPage(webObj, (result: object) => {
  console.log('网页链接回调', JSON.stringify(result));
});

六、钉钉登录

  • 钉钉授权登录允许第三方应用通过钉钉进行用户身份验证。

  • 授权后应用可获取一次性授权码(authCode),再用该授权码向钉钉平台请求访问令牌(access_token),进而获取用户基本信息(如昵称、头像、手机号等)。

  • 友盟SDK已封装钉钉登录的前端授权流程,登录方法会返回authCode。

  • 开发者获取到authCode后,请参考钉钉开放平台官方文档 的“步骤五”完成后续的 access_token 的获取及用户信息查询。

登录方式:若用户已安装钉钉,则跳转钉钉 App 拉起授权登录页;否则通过 H5 登录并授权

import { DingTalk, ddConfig } from '@umeng/share';

const params: ddConfig.LoginConfig = {
  /** 必传,固定值 code,授权通过后返回 authCode */
  responseType: 'code',
  /** 必传,应用授权作用域(实际授权页面以应用注册配置为准)
   *  支持两种值:
   *  - 'openid':授权后获得用户 openid
   *  - 'openid%20corpid':实际对应 "openid corpid",授权后获得用户 openid 和登录时选择的组织 corpId
   */
  scope: 'openid',
  /** 必传,固定值 consent,会进入授权确认页 */
  prompt: 'consent',
  /** 必传,授权成功后通过 Want 唤起指定的 Ability(需在 module.json5 中配置 "exported": true) */
  callBackAbilityName: 'EntryAbility',
  /** 非必传,任意填写,授权登录后原样返回 */
  nonce: 'nonce 参数测试',
  /** 非必传,用于保持请求和回调状态,可防止 CSRF 攻击,建议设置为随机数加 session 校验 */
  state: 'state 参数测试',
  /** 非必传,指定跳转的钉钉版本 BundleName,不填默认标准版 */
  targetBundleName: 'com.dingtalk.hmos',
  /** 非必传,true 时钉钉未安装不保留登录状态,每次都需要重新登录,默认 false */
  webForceLogin: true
};

DingTalk.login(params, this, (result: object) => {
  console.log('登陆回调', JSON.stringify(result));
});

七、其他参考方法

  1. 从手机相册选取照片,返回uris的示例方法,供开发调试时参考。

import common from '@ohos.app.ability.common';
import { fileIo as fs, fileUri } from '@kit.CoreFileKit';
import { photoAccessHelper } from '@kit.MediaLibraryKit';

// 选取相册照片示例,返回选中图片uri的数组格式,即uris。
async getPictureUriFromAlbum(type: 'video'|'image'): Promise<string[]> {
  let PhotoSelectOptions = new photoAccessHelper.PhotoSelectOptions();
  if (type === 'video') {
    PhotoSelectOptions.MIMEType = photoAccessHelper.PhotoViewMIMETypes.VIDEO_TYPE;
    PhotoSelectOptions.maxSelectNumber = 1;
  } 
  if (type === 'image') {
    PhotoSelectOptions.MIMEType = photoAccessHelper.PhotoViewMIMETypes.IMAGE_TYPE;
    PhotoSelectOptions.maxSelectNumber = 18;
  }
  let photoPicker = new photoAccessHelper.PhotoViewPicker();
  let photoSelectResult: photoAccessHelper.PhotoSelectResult = await photoPicker.select(PhotoSelectOptions);
  let selectPhoto = photoSelectResult.photoUris;
  console.warn(`选中的图片: ${JSON.stringify(selectPhoto)}`);
  // 将选中的图片转uri路径
  const allPath: string[] = selectPhoto.reduce((m: string[], itemPath) => {
    let albumPath = itemPath;
    let context = getContext(this) as common.UIAbilityContext;
    let filePath = `${context.filesDir}/original-${Date.now()}.${type === 'video' ? 'mp4' : 'jpg'}`;
    let file: fs.File | undefined;
    file = fs.openSync(albumPath, fs.OpenMode.READ_ONLY);
    fs.copyFileSync(file.fd, filePath);
    fs.closeSync(file);
    let uri: string = fileUri.getUriFromPath(filePath); // uri路径
    m.push(uri);
    return m;
  }, []);
  console.log(`选中的图片uri地址: ${JSON.stringify(allPath)}`);
  return allPath;
}