SDK方法(钉钉)
前置检查
确保已在钉钉开放平台申请到应用的Client ID,用于初始化友盟SDK的appId配置项。
@umeng/share从1.1.10版本支持钉钉,确保已按照快速开始文档完成SDK安装与集成。
分享和登录完成后,需要通过显式Want跳转回您的应用。因此回调Ability必须在
module.json5中配置"exported": true(默认为false),否则钉钉无法外部唤起您的 App。支持 API 15 及以上。
功能说明
一、判断钉钉是否安装
在
module.json5中增加如下固定配置:

调用钉钉安装方法
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));
});
七、其他参考方法
从手机相册选取照片,返回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;
}