轻应用开发 API


; (function (window) {

    /**
     * Link平台功能接口,使用该模块必须先引入Cordova.js 和 bingotouch.js<br/>包含用户信息获取、通讯录、聊天、签到、应用、服务号等操作接口
     * @namespace app.link
    */
    window.app.link = window.app.link || {};

    /**
      * 获取登陆后的用户信息
      * @method app.link.getLoginInfo
      * @param {function} callback 回调函数,返回登录用户信息
      * @example
      * app.link.getLoginInfo(function(result){
      *      app.alert(result);
      * });
    */
    app.link.getLoginInfo = function (callback) {
        var successCallback = function (result) {
            callback(app.utils.toJSON(result));
        };
        Cordova.exec(successCallback, null, "LinkPlugin", "getLoginInfo", []);
    }


    /**
        * 获取登录用户的AccessToken
        * @method app.link.getToken
        * @param callback {function} 回调函数,返回json对象[{'accessToken': 'xxx'}]
        * @example
        * app.link.getToken(function (result) {
        *        app.alert(result);
        * });
    */
    app.link.getToken = function (callback) {
        var successCallback = function (result) {
            callback(app.utils.toJSON(result));
        };
        Cordova.exec(successCallback, null, "LinkPlugin", "getToken", []);
    }

    /**
      * 获取Link指定的用户(userId)信息
      * @method app.link.getUserInfo
      * @param success {function} 成功回调函数,返回json对象
      * @param fail {function} 失败回调函数,返回错误字符串
      * @param userId {string} 指定用户userId
      * @example
      *     app.link.getUserInfo(function(result){
      *         app.alert(result);
      *     },
      *     function(error){
      *         app.alert(error);
      *     },
      *     'ebdfe3b1-ed9c-425b-aac3-aa6c61d05d0e'
      *     );
    */
    app.link.getUserInfo = function (success, fail, userId) {
        var successCallback = function (result) {
            success(app.utils.toJSON(result));
        };
        Cordova.exec(successCallback, fail, "LinkPlugin", "getUserInfo", [userId]);
    }

    /**
      * 根据手机或者邮箱获取用户信息
      * @method app.link.getUserInfoByCellphoneOrEmail
      * @static
      * @param key {string} 手机号码或者邮箱
      * @param callback {function} 回调函数,返回用户信息
      * @example
      *     app.link.getUserInfoByCellphoneOrEmail("1380013800",function(result){
      *         app.alert(result);
      *     })
    */
    app.link.getUserInfoByCellphoneOrEmail = function (key, callback) {
        var successCallback = function (result) {
            callback(app.utils.toJSON(result));
        };
        Cordova.exec(successCallback, null, "LinkPlugin", "getUserInfoByCellphoneOrEmail", [key]);
    }

    /**
      * 根据loginId获取userId
      * @method app.link.getUserIdWithLoginId
      * @param success {Function} 成功回调,返回userId
      * @param fail {Function} 失败回调函数,返回错误字符串
      * @param loginId {String} 用户loginId
      * @example
      * app.link.getUserIdWithLoginId(function(res){
      *     app.alert(res);
      *  },function(error){
      *     app.alert(error);
      *  }, 'yulsh');
    */
    app.link.getUserIdWithLoginId = function (success, fail, loginId) {
        Cordova.exec(success, fail, "LinkPlugin", "getUserIdWithLoginId", [loginId]);
    }

    // *
    //  * 包括:获取部门成员数据、对通讯录的选人界面操作等
    //  * @class 通讯录


    /**
      * 打开通讯录页面
      * @method app.link.openContactPage
      * @example
      * app.link.openContactPage();
     */
    app.link.openContactPage = function () {
        var params = {
            code: "OpenBuiltIn",
            key: "Contact"
        };
        Cordova.exec(null, null, "LinkPlugin", "launchLinkServiceWithDictionary", [params]);
    }


    /**
     根据部门orgId获取用户信息以及子部门信息
     @method app.link.getChildListByOrgId
     @param callback {Function} 回调函数,返回某部门下的用户以及子部门
     @param orgId {String} 部门orgId
    */
    app.link.getChildListByOrgId = function (callback, orgId) {
        Cordova.exec(callback, null, "LinkPlugin", "getChildListByOrgId", [orgId]);
    }

    /**
      * 根据部门orgId获取该部门的信息
      * @method app.link.getDeptInfoByOrgId
      * @param callback {Function} 回调函数,返回部门信息
      * @param orgId {String} 部门orgId
    */
    app.link.getDeptInfoByOrgId = function (callback, orgId) {
        Cordova.exec(callback, null, "LinkPlugin", "getDeptInfoByOrgId", [orgId]);
    }

    /**
      * 调用Link选人页面(单选)
      * @method app.link.startContactSingleSelector
      * @param successCallback {Function} 成功回调函数,返回json对象
      * @param failCallback {Function} 失败回调函数,返回错误字符串
      * @param title {String} 选人窗口文字说明
      * @param dataType {String} 选择范围:1为用户,2为群组,3为用户+群组 4为部门(组织),5为用户+组织,8为服务号
      * @param extraParams json对象,方便后面扩展,目前有isIncludeDisableUser(是否包含禁用的用户,默认false)
      * hasLatelyChatConversation 是否展示默认联系人
      * isGetSourceId 获取用户的sourceId
      * @example
      * app.link.startContactSingleSelector(function(result){
      *     app.alert(result);
      * },function(){} ,'请选择用户','1');
    */
    app.link.startContactSingleSelector = function (successCallback, failCallback, title, dataType, extraParams) {
        extraParams = $.extend({
            isIncludeDisableUser: false
        }, extraParams);
        if (extraParams.isGetSourceId && dataType == 1) {
            function success(res) {
                app.link.getServerConfigs((params) => {
                    app.get(params.uamUri + '/api/user/by/ids', {
                        ids: res.id
                    }, function (res) {
                        successCallback(res)
                    }, function (err) {
                        failCallback(err)
                    })
                }, (err) => {
                    failCallback(err)
                })
            }
            Cordova.exec(success, failCallback, "LinkPlugin", "startContactSingleSelector", [title, dataType, extraParams]);
        } else {
            Cordova.exec(successCallback, failCallback, "LinkPlugin", "startContactSingleSelector", [title, dataType, extraParams]);
        }
    }

    /**
      * 调用Link选人界面(多选)
      * @method app.link.startContactMulitSelector
      * @param successCallback {Function} 成功回调函数,返回json对象
      * @param failCallback {Function} 失败回调函数,返回错误字符串
      * @param title {String} 选人窗口文字说明
      * @param dataType {String} 选择范围:1为用户,2为群组,3为用户+群组 4为部门(组织),5为用户+组织
      * @param extraParams {Object} json对象,具体可以传入哪些请参看代码
      * isGetSourceId 获取用户的sourceId
      * @example
      * app.link.startContactMulitSelector(
      *    function(result){
      *        app.alert(result);
      *    },
      *    function(error){
      *        app.alert(error);
      *    },
      *    '请选择用户/群组(多选)',
      *    '1',
      *    {
      *      userSelected: [],          //默认选中的用户 id
      *      groupSelected: [],         //默认选中的群组id
      *      organizationSelected: [],  //默认选中的部门id
      *      userIgnore: [],            //禁止选择的用户id
      *      groupIgnore: [],           //禁止选择的群组id
      *      organizationIgnore: [],    //禁止选择的部门id
      *      isIncludeDisableUser:false //是否包含被禁用的人员, 默认是false
      *    }
      * );
    */
    app.link.startContactMulitSelector = function (successCallback, failCallback, title, dataType, extraParams) {
        extraParams = $.extend({
            userSelected: [],
            groupSelected: [],
            organizationSelected: [],
            userIgnore: [],
            groupIgnore: [],
            organizationIgnore: [],
            isIncludeDisableUser: false
        }, extraParams);
        if (extraParams.isGetSourceId && dataType == 1) {
            function success(res) {
                var ids = []
                for (let index = 0; index < res.user.length; index++) {
                    let item = res.user[index];
                    ids.push(item.userId)
                }
                app.link.getServerConfigs((params) => {
                    app.get(params.uamUri + '/api/user/by/ids', {
                        ids: ids.join(',')
                    }, function (res) {
                        successCallback(res)
                    }, function (err) {
                        failCallback(err)
                    })
                }, (err) => {
                    failCallback(err)
                })
            }
            Cordova.exec(success, failCallback, "LinkPlugin", "startContactMulitSelector", [title, dataType, extraParams]);
        } else {
            Cordova.exec(successCallback, failCallback, "LinkPlugin", "startContactMulitSelector", [title, dataType, extraParams]);
        }
    }

    /**
        调用Link里面用户的名片页面
        @method app.link.startUserCard
        @param userId {String} 用户id
        @example
            app.link.startUserCard('ebdfe3b1-ed9c-425b-aac3-aa6c61d05d0e');
    */
    app.link.startUserCard = function (userId) {
        Cordova.exec(null, null, "LinkPlugin", "startUserCard", [userId]);
    }


    /**
      * 打开部门列表
      * @method app.link.openOrgList
      * @param orgId {String} 部门id(可不传)
      * @example
      *     app.link.openOrgList();
     */
    app.link.openOrgList = function (orgId) {
        var params = {
            code: "OpenBuiltIn",
            key: "OrganizationList",
            orgId: orgId || ''
        };
        Cordova.exec(null, null, "LinkPlugin", "launchLinkServiceWithDictionary", [params]);
    }

    /**
      * 查看部门名片页
      * @method app.link.openOrgCard
      * @param orgId {String} 部门id
      * @example
      *     app.link.openOrgCard('02af68fb-dc53-4411-b6c8-d6480cce2234');
     */
    app.link.openOrgCard = function (orgId) {
        var params = {
            code: "OpenBuiltIn",
            key: "OrganizationCard",
            orgId: orgId
        };
        Cordova.exec(null, null, "LinkPlugin", "launchLinkServiceWithDictionary", [params]);
    }

    // *
    //  * 包括:创建群组、打开群组列表等操作
    //  * @class 群组


    /**
        调用Link里面群组的名片页面
        @method app.link.startGroupCard
        @param groupId {String} 群组id
        @example
            app.link.startGroupCard('1456fa37-ebc9-4123-88c0-8b494bab7377');
    */
    app.link.startGroupCard = function (groupId) {
        Cordova.exec(null, null, "LinkPlugin", "startGroupCard", [groupId]);
    }

    /**
      * 创建群组
      * @method app.link.createGroup
      * @param successCallback {Function} 成功回调函数,返回json对象
      * @param failCallback {Function} 失败回调函数,返回错误字符串
      * @param userIds {Array} 默认添加的用户id
      * @example
      * app.link.createGroup(
      *   function(result){
      *       app.alert(result);
      *       //todo
      *   },
      *   function(error){
      *       //app.alert(error);
      *   },
      *   []  //默认选择的用户id
      * );
     */
    app.link.createGroup = function (successCallback, failCallback, userIds) {
        var params = {
            code: "OpenBuiltIn",
            key: "CreateGroup",
            userSelected: userIds || []
        };
        Cordova.exec(successCallback, failCallback, "LinkPlugin", "launchLinkServiceWithDictionary", [params]);
    }

    /**
        打开群组列表
        @method app.link.openGroupList
        @param eCode {String} 企业编码eCode,默认不传,企业互联才需要传
        @example
            app.link.openGroupList();
     */
    app.link.openGroupList = function (eCode) {
        var params = {
            code: "OpenBuiltIn",
            key: "GroupList"
        };
        if (eCode) {
            params.eCode = eCode;
        }
        Cordova.exec(null, null, "LinkPlugin", "launchLinkServiceWithDictionary", [params]);
    }

    /**
        打开群组发公告页面
        @method app.link.sendGroupNotice
        @param groupId {String} 群组id
        @example
            app.link.sendGroupNotice('1456fa37-ebc9-4123-88c0-8b494bab7377');
     */
    app.link.sendGroupNotice = function (groupId) {
        var params = {
            code: "OpenBuiltIn",
            key: "PublishGroupAnnouncement",
            groupId: groupId
        };
        Cordova.exec(null, null, "LinkPlugin", "launchLinkServiceWithDictionary", [params]);
    }

    /**
        打开群组公告列表
        @method app.link.openGroupNoticeList
        @param groupId {String} 群组id
        @example
            app.link.openGroupNoticeList('1456fa37-ebc9-4123-88c0-8b494bab7377');
     */
    app.link.openGroupNoticeList = function (groupId) {
        var params = {
            code: "OpenBuiltIn",
            key: "GroupAnnouncementList",
            groupId: groupId
        };
        Cordova.exec(null, null, "LinkPlugin", "launchLinkServiceWithDictionary", [params]);
    }

    /**
        打开群组签到列表
        @method app.link.openGroupCheckInList
        @param groupId {String} 群组id
        @example
            app.link.openGroupCheckInList('1456fa37-ebc9-4123-88c0-8b494bab7377');
     */
    app.link.openGroupCheckInList = function (groupId) {
        var params = {
            code: "OpenBuiltIn",
            key: "MyCheckIn",
            groupId: groupId
        };
        Cordova.exec(null, null, "LinkPlugin", "launchLinkServiceWithDictionary", [params]);
    }

    // *
    //  * 包括:添加服务号、打开服务号相关界面操作
    //  * @class 服务号


    /**
      * 查看服务号名片页
      * @method app.link.openServiceAccountCard
      * @param accountId {String} 服务号id
      * @example
      *     app.link.openServiceAccountCard("43b80351-2c0a-4e84-a3d0-43eb7d35bc00");
     */
    app.link.openServiceAccountCard = function (accountId) {
        var params = {
            code: "OpenBuiltIn",
            key: "ServiceAccountCard",
            accountId: accountId
        };
        Cordova.exec(null, null, "LinkPlugin", "launchLinkServiceWithDictionary", [params]);
    }

    /**
      * 查看已关注服务号列表
      * @method app.link.openServiceAccountList
      * @example
      *     app.link.openServiceAccountList();
     */
    app.link.openServiceAccountList = function () {
        var params = {
            code: "OpenBuiltIn",
            key: "ServiceAccountList"
        };
        Cordova.exec(null, null, "LinkPlugin", "launchLinkServiceWithDictionary", [params]);
    }

    /**
        打开添加服务号页面
        @method app.link.addServiceAcccount
        @example
            app.link.addServiceAcccount();
     */
    app.link.addServiceAcccount = function () {
        var params = {
            code: "OpenBuiltIn",
            key: "AddServiceAccount"
        };
        Cordova.exec(null, null, "LinkPlugin", "launchLinkServiceWithDictionary", [params]);
    }

    /**
        发送服务号公告
        @method app.link.sendServiceAccountNotice
        @param accountId {String} 服务号id
        @param bulletinType {Int} 公告类型(1文字,2图片,3语音) | 不传此参数时先进入公告类型选择页面
        @example
            app.link.sendServiceAccountNotice("43b80351-2c0a-4e84-a3d0-43eb7d35bc00");
     */
    app.link.sendServiceAccountNotice = function (accountId, bulletinType) {
        var params = {
            code: "OpenBuiltIn",
            key: "SendBulletin",
            accountId: accountId,
            bulletinType: bulletinType
        };
        Cordova.exec(null, null, "LinkPlugin", "launchLinkServiceWithDictionary", [params]);
    }

    // *
    //  * 跟聊天窗口相关的接口
    //  * @class 聊天消息


    /**
      * 打开消息中心页面
      * @method app.link.openMsgCenter
      * @param isShowService {Boolean} 废弃不用
      * @example
        app.link.openMsgCenter();
      */
    app.link.openMsgCenter = function (isShowService) {
        var params = {
            code: "OpenBuiltIn",
            key: "MessageCenter",
            isShowService: isShowService
        };
        Cordova.exec(null, null, "LinkPlugin", "launchLinkServiceWithDictionary", [params]);
    }

    /**
      * 获取未读消息总数
      * @method app.link.getUnreadMessageCount
      * @param success {Function} 成功回调,返回数字
      * @param fail {Function} 失败回调,返回失败信息
      * @example
      * app.link.getUnreadMessageCount(function(result){
      *      app.alert(result);
      * },function(error){
      *      app.alert(error);
      * });
    */
    app.link.getUnreadMessageCount = function (success, fail) {
        Cordova.exec(success, fail, "LinkPlugin", "getUnreadMessageCount", []);
    }

    /**
      * 获取指定帐号id的未读消息数
      * @method app.link.getUnreadMessageCountById
      * @param success {Function} 成功回调函数,返回未读消息数
      * @param talkWithId {String} 这里的帐号包括:用户的id,服务号的id,部门的id,群组的id
      * @example
      *  app.link.getUnreadMessageCountById(function(result){
      *      alert(result);
      *  }, 'ebdfe3b1-ed9c-425b-aac3-aa6c61d05d0e');
    */
    app.link.getUnreadMessageCountById = function (success, talkWithId) {
        var callback = function (result) {
            success(result, talkWithId);
        }
        Cordova.exec(callback, null, "LinkPlugin", "getUnreadMessageCountById", [talkWithId]);
    }

    /**
        调用Link的用户聊天页面
        @method app.link.startUserChat
        @param userId {String} 用户id
        @param userName {String} 用户名称(可选)
        @example
            app.link.startUserChat('ebdfe3b1-ed9c-425b-aac3-aa6c61d05d0e');
    */
    app.link.startUserChat = function (userId, userName) {
        Cordova.exec(null, null, "LinkPlugin", "startUserChat", [userId, userName]);
    }

    /**
        调用Link的群组聊天页面
        @method app.link.startGroupChat
        @static
        @param groupId {String} 群组id
        @param groupName {String} 群组名称(可选)
        @example
            app.link.startGroupChat('1456fa37-ebc9-4123-88c0-8b494bab7377');
    */
    app.link.startGroupChat = function (groupId, groupName) {
        Cordova.exec(null, null, "LinkPlugin", "startGroupChat", [groupId, groupName]);
    }

    /**
        打开服务号聊天界面
        @method app.link.startServiceAccountChat
        @param accountId {String} 服务号id
        @example
            app.link.startServiceAccountChat("43b80351-2c0a-4e84-a3d0-43eb7d35bc00");
     */
    app.link.startServiceAccountChat = function (accountId) {
        Cordova.exec(null, null, "LinkPlugin", "startServiceAccountChat", [accountId]);
    }

    /**
        发送邀约消息(主要用在消息窗口,待补充)
        @method app.link.sendInviteMessage
        @param params {Object} json对象,包含:<br/>toId:发送邀约消息对象id,要看toType是什么类型 <br/>toType:0系统1私聊2群组4部门5服务号 <br/>title:邀约标题 <br/>desc:邀约内容 <br/>action_params:操作指令,具体请咨询产品组
        @example
            var params={toId:'ebdfe3b1-ed9c-425b-aac3-aa6c61d05d0e',toType:1,title:'发送邀约',desc:'邀约描述',action_params:''};
            app.link.sendInviteMessage(params);
     */
    app.link.sendInviteMessage = function (params) {
        params = params || {};
        Cordova.exec(null, null, "LinkPlugin", "sendInviteMessage", [params]);
    }


    // *
    //  * 包括:发表动态,打开群组,个人,工作等动态详情界面
    //  * @class 动态


    /**
      * 发表动态
      * @method app.link.publishMicroblog
      * @param successCallback {Function} 成功回调
      * @param failCallback {Function} 失败回调,返回失败信息
      * @param options {Object} JSON格式,动态参数,具体如下:<br/>
      *     authorID {String} 发表动态的对象id , 可以是用户或用户运营的服务号 (不写默认是当前用户)<br/>
      *     content {String} 动态内容<br/>
      *     privateType {Int}  私密类型 , 0 群组,1 部门, 2 个人 , 3 项目  , 4公开 (默认类型)<br/>
      *     privateInstanceID {String}  私密对象id<br/>
      *     privateName {String} 私密对象名称<br/>
      *     images {Array}  动态图片 (相册图片地址, 建议到动态发表界面再选择图片,这样更加方便)
      * @example
      * app.link.publishMicroblog(function(res){
      *     app.alert(res);
      * },function (error) {
      *     app.alert(error);
      * },{
      *     content : '这是发布到link的一条动态!!'
      * });
    */
    app.link.publishMicroblog = function (successCallback, failCallback, options) {
        var params = $.extend({
            code: "OpenBuiltIn",
            key: "PublishMicroBlog"
        }, options);
        Cordova.exec(successCallback, failCallback, "LinkPlugin", "launchLinkServiceWithDictionary", [params]);
    }

    /**
        打开动态主页
        @method app.link.openMicroblogPage
        @param displayType {Int} 显示类型<br/>
        0 全部<br/>
        1 官方<br/>
        2 群组<br/>
        3 个人<br/>
        4 我的动态<br/>
        5 相互关注<br/>
        6 项目<br/>
        7 随便逛逛
        @example
            app.link.openMicroblogPage(0);
    */
    app.link.openMicroblogPage = function () {
        var params = {
            code: "OpenBuiltIn",
            key: "DcMicroBlog"
        };
        Cordova.exec(null, null, "LinkPlugin", "launchLinkServiceWithDictionary", [params]);
    }

    /**
        打开某人动态主页
        @method app.link.openUserMicroblog
        @param accountId {String} 用户Id
        @example
            app.link.openUserMicroblog('张武韬');
    */
    app.link.openUserMicroblog = function (accountId) {
        var params = {
            code: "OpenBuiltIn",
            key: "BlogCard",
            accountId: accountId
        };
        Cordova.exec(null, null, "LinkPlugin", "launchLinkServiceWithDictionary", [params]);
    }

    /**
         打开某群组动态主页
        @method app.link.openGroupMicroblog
        @param groupId {String} 群组id
        @example
            app.link.openGroupMicroblog('1456fa37-ebc9-4123-88c0-8b494bab7377');
    */
    app.link.openGroupMicroblog = function (groupId) {
        var params = {
            code: "OpenBuiltIn",
            key: "GroupBlogList",
            groupId: groupId
        };
        Cordova.exec(null, null, "LinkPlugin", "launchLinkServiceWithDictionary", [params]);
    }

    /**
      * 打开某项目动态主页
      * @method app.link.startProjectDetail
      * @deprecated
      * @param: projectId{String} 项目id
      * @example
      *     app.link.startProjectDetail('projectId');
    */
    app.link.startProjectDetail = function (projectId) {
        Cordova.exec(null, null, "LinkPlugin", "startProjectDetail", [projectId]);
    }

    /**
        打开某服务号动态主页
        @method app.link.openServiceAccountMicroblog
        @param serviceId {String} 服务号Id
        @param accountName {String} 服务号名称,可省略
        @example
            app.link.openServiceAccountMicroblog('Id');
    */
    app.link.openServiceAccountMicroblog = function (serviceId, accountName) {
        var params = {
            code: "OpenBuiltIn",
            key: "BlogCard",
            accountType: 3,
            serviceId: serviceId,
            accountName: accountName || ''
        };
        Cordova.exec(null, null, "LinkPlugin", "launchLinkServiceWithDictionary", [params]);
    }

    /**
        打开某话题动态主页
        @method app.link.openTopicMicroblog
        @param topic {String} 话题名称
        @example
            app.link.openTopicMicroblog('Link发布会');
    */
    app.link.openTopicMicroblog = function (topic) {
        var params = {
            code: "OpenBuiltIn",
            key: "TopicBlogList",
            topic: topic
        };
        Cordova.exec(null, null, "LinkPlugin", "launchLinkServiceWithDictionary", [params]);
    }

    /**
        打开动态广场
        @method app.link.openBlogSquare
        @deprecated
        @example
            app.link.openBlogSquare();
    */
    app.link.openBlogSquare = function () {
        var params = {
            code: "OpenBuiltIn",
            key: "BlogSquare"
        };
        Cordova.exec(null, null, "LinkPlugin", "launchLinkServiceWithDictionary", [params]);
    }

    /**
        打开动态详情
        @method app.link.openMicroblogDetail
        @param {String} blogId - 动态Id
        @example
            app.link.openMicroblogDetail('0683ecc7-560f-4b7e-92a3-6ce9d690e5be');//这里填写你的动态id
    */
    app.link.openMicroblogDetail = function (blogId) {
        var params = {
            code: "OpenBuiltIn",
            key: "BlogDetail",
            blogId: blogId
        };
        Cordova.exec(null, null, "LinkPlugin", "launchLinkServiceWithDictionary", [params]);
    }

    /**
      * 打开我的动态
      * @method app.link.openMyMicroblog
      * @example
      *     app.link.openMyMicroblog();
    */
    app.link.openMyMicroblog = function () {
        var params = {
            code: "OpenBuiltIn",
            key: "MyBlogCard"
        };
        Cordova.exec(null, null, "LinkPlugin", "launchLinkServiceWithDictionary", [params]);
    }

    // *
    //  * 包括:应用启动、应用市场/中心的相关界面操作
    //  * @class 轻应用


    /**
      * 启动应用市场App
      * @method app.link.runApp
      * @param params{Object} 启动应用的参数,key-value格式为
      *     <br/> { appCode:"应用市场中填写的编码", appUrl:"启动页面相对地址", data:{name:"张三",sex:"male":age:25} }
      *     <br/> 其中data参数也是json对象,启动目标应用后,能够在app.getPageParams里面获取到。
      * @example
      * var params={
      *     appCode:"com.bingo.touch",
      *     data:{
      *         name:"张三",
      *         sex:"male",
      *         gender:23
      *     }
      * }
      * app.link.runApp(params);
    */
    app.link.runApp = function (params) {
        var dataStr = "";
        if (params.data) {
            for (var key in params.data) {
                dataStr += ("\n" + key + "=" + params.data[key]);
            };
        }
        params = "[OpenApp]\nappCode=" + params.appCode + (params.appUrl ? "\nappUrl=" + params.appUrl : "") + dataStr;
        Cordova.exec(null, null, "LinkPlugin", "launchLinkService", [params]);
    }

    /**
     * 启动应用市场App
     * @method app.link.startApp
     * @param params{Object} 启动应用的参数,key-value格式为
     *     <br/> { appCode:"应用市场中填写的编码", appUrl:"启动页面相对地址", data:{name:"张三",sex:"male":age:25} }
     *     <br/> 其中data参数也是json对象,启动目标应用后,能够在app.getPageParams里面获取到。
     * @example
     * var params={
     *     appCode:"com.bingo.touch",
     *     data:{
     *         name:"张三",
     *         sex:"male",
     *         gender:23
     *     }
     * }
     * app.link.startApp(params);
   */
    app.link.startApp = function (params) {
        var dataStr = "";
        if (params.data) {
            for (var key in params.data) {
                dataStr += ("\n" + key + "=" + params.data[key]);
            };
        }
        params = "[OpenApp]\nappCode=" + params.appCode + (params.appUrl ? "\nappUrl=" + params.appUrl : "") + dataStr;
        Cordova.exec(null, null, "LinkPlugin", "startApp", [params]);
    }

    /**
        打开应用桌面
        @method app.link.openAppDesktop
        @deprecated
        @param
        @example
            app.link.openAppDesktop();
    */
    app.link.openAppDesktop = function () {
        var params = {
            code: "OpenBuiltIn",
            key: "DcApp"
        };
        Cordova.exec(null, null, "LinkPlugin", "launchLinkServiceWithDictionary", [params]);
    }

    /**
        打开应用市场
        @method app.link.openAppMarket
        @deprecated
        @example
            app.link.openAppMarket();
    */
    app.link.openAppMarket = function () {
        var params = {
            code: "OpenBuiltIn",
            key: "AppMarket"
        };
        Cordova.exec(null, null, "LinkPlugin", "launchLinkServiceWithDictionary", [params]);
    }

    /**
        打开应用详情页面
        @method app.link.openAppCard
        @deprecated
        @param {String} appCode 应用编码
        @example
            app.link.openAppCard("com.bingo.touch");
    */
    app.link.openAppCard = function (appCode) {
        var params = {
            code: "OpenBuiltIn",
            key: "AppDetail",
            AppCode: appCode
        };
        Cordova.exec(null, null, "LinkPlugin", "launchLinkServiceWithDictionary", [params]);
    }

    // *
    //  * 包括:发起签到、打开签到列表等操作
    //  * @class 签到



    /**
        调用Link的“我要签到”界面
        @method app.link.startCheckIn
        @example
            app.link.startCheckIn();
    */
    app.link.startCheckIn = function () {
        var params = "[StartCheckin]\npushToListOnComplete=false";
        Cordova.exec(null, null, "LinkPlugin", "launchLinkService", [params]);
    }

    /**
        调用Link的“签到列表”界面
        @method app.link.openCheckInList
        @example
            app.link.openCheckInList();
    */
    app.link.openCheckInList = function () {
        var params = "[OpenBuiltIn]\nkey=MyCheckIn";
        Cordova.exec(null, null, "LinkPlugin", "launchLinkService", [params]);
    }

    /**
        打开签到详情页面
        @method app.link.openCheckInDetail
        @param checkinId {String} 签到id
        @example
            app.link.openCheckInDetail('04f612d2-0931-48ea-ade8-6de5a382f8fc');
    */
    app.link.openCheckInDetail = function (checkinId) {
        var params = {
            code: "OpenBuiltIn",
            key: "CheckinDetail",
            checkinId: checkinId
        };
        Cordova.exec(null, null, "LinkPlugin", "launchLinkServiceWithDictionary", [params]);
    }

    // *
    //  * 个人相关设置界面调用接口
    //  * @class 设置


    /**
      * 打开个人信息修改页面
      * @method app.link.openPersonEdit
      * @example
      *     app.link.openPersonEdit();
    */
    app.link.openPersonEdit = function () {
        var params = {
            code: "OpenBuiltIn",
            key: "EditPersonInfo"
        };
        Cordova.exec(null, null, "LinkPlugin", "launchLinkServiceWithDictionary", [params]);
    }

    /**
      * 打开个人设置页面
      * @method app.link.openSetting
      * @example
      *     app.link.openSetting();
    */
    app.link.openSetting = function () {
        var params = {
            code: "OpenSubMenu",
            key: "setting",
            module: "MySelf"
        };
        Cordova.exec(null, null, "LinkPlugin", "launchLinkServiceWithDictionary", [params]);
    }

    /**
        打开关于页面
        @method app.link.openAbout
        @example
            app.link.openAbout();
    */
    app.link.openAbout = function () {
        var params = {
            code: "OpenBuiltIn",
            key: "MyAbout"
        };
        Cordova.exec(null, null, "LinkPlugin", "launchLinkServiceWithDictionary", [params]);
    }

    /**
        打开设置消息通知页面
        @method app.link.openStNotification
        @example
            app.link.openStNotification();
    */
    app.link.openStNotification = function () {
        var params = {
            code: "OpenBuiltIn",
            key: 'StNotification'
        };
        Cordova.exec(null, null, "LinkPlugin", "launchLinkServiceWithDictionary", [params]);
    }

    /**
      * 打开设置手势锁屏页面
      * @method app.link.openStGestureLock
      * @example
      *     app.link.openStGestureLock();
    */
    app.link.openStGestureLock = function () {
        var params = {
            code: "OpenBuiltIn",
            key: 'StGestureLock'
        };
        Cordova.exec(null, null, "LinkPlugin", "launchLinkServiceWithDictionary", [params]);
    }


    /**
      *打开手势锁屏页面,如果没有设置,会先弹出设置界面,如果有设置,则直接弹出解锁页面
      * @method app.link.openCheckGestureLock
      * @param successCallback {function} 成功回调函数
      * @param failCallback {function} 失败回调函数
      * @example app.link.openCheckGestureLock();
    */
    app.link.openCheckGestureLock = function (successCallback, failCallback) {
        var params = {
            code: "OpenBuiltIn",
            key: 'CheckGestureLock'
        };
        Cordova.exec(successCallback, failCallback, "LinkPlugin", "launchLinkServiceWithDictionary", [params]);
    }

    /**
      * 打开设置字体大小页面
      * @method app.link.openStFont
      * @example
      *     app.link.openStFont();
    */
    app.link.openStFont = function () {
        var params = {
            code: "OpenBuiltIn",
            key: 'StFont'
        };
        Cordova.exec(null, null, "LinkPlugin", "launchLinkServiceWithDictionary", [params]);
    }

    /**
      * 打开设备管理页面
      * @method app.link.openStDevice
      * @example
      *     app.link.openStDevice();
    */
    app.link.openStDevice = function () {
        var params = {
            code: "OpenBuiltIn",
            key: 'StDevice'
        };
        Cordova.exec(null, null, "LinkPlugin", "launchLinkServiceWithDictionary", [params]);
    }

    /**
        打开手工同步页面
        @method app.link.openStSync
        @example
            app.link.openStSync();
    */
    app.link.openStSync = function () {
        var params = {
            code: "OpenBuiltIn",
            key: 'StSync'
        };
        Cordova.exec(null, null, "LinkPlugin", "launchLinkServiceWithDictionary", [params]);
    }

    /**
      * 打开清除缓存页面
      * @method app.link.openStCleanCache
      * @example
      *     app.link.openStCleanCache();
    */
    app.link.openStCleanCache = function () {
        var params = {
            code: "OpenBuiltIn",
            key: 'StCleanCache'
        };
        Cordova.exec(null, null, "LinkPlugin", "launchLinkServiceWithDictionary", [params]);
    }

    /**
        打开修改密码页面
        @method app.link.openStModifyPassword
        @example
            app.link.openStModifyPassword();
    */
    app.link.openStModifyPassword = function () {
        var params = {
            code: "OpenBuiltIn",
            key: 'StModifyPassword'
        };
        Cordova.exec(null, null, "LinkPlugin", "launchLinkServiceWithDictionary", [params]);
    }

    /**
      * 打开邀请好友页面
      * @method app.link.openStInvite
      * @example
      *     app.link.openStInvite();
    */
    app.link.openStInvite = function () {
        var params = {
            code: "OpenBuiltIn",
            key: 'StInvite'
        };
        Cordova.exec(null, null, "LinkPlugin", "launchLinkServiceWithDictionary", [params]);
    }

    /**
        打开Link二维码页面
        @method app.link.openStQrcode
        @example
            app.link.openStQrcode();
    */
    app.link.openStQrcode = function () {
        var params = {
            code: "OpenBuiltIn",
            key: 'StQrcode'
        };
        Cordova.exec(null, null, "LinkPlugin", "launchLinkServiceWithDictionary", [params]);
    }

    /**
        注销Link
        @method app.link.logout
        @example
            app.link.logout();
    */
    app.link.logout = function () {
        var params = {
            code: "OpenBuiltIn",
            key: 'StLogout'
        };
        Cordova.exec(null, null, "LinkPlugin", "launchLinkServiceWithDictionary", [params]);
    }


    // *
    //  * 包括:服务同步、自由流、分享、发现服务等界面操作、获取收藏的服务数据、选择网盘文件、小视频、扫一扫等
    //  * @class 其他


    /**
    执行Link同步服务
    @method app.link.execSyncService
    @param type {int} 同步类型。 0:用户信息同步,1:群组信息同步,2:部门信息同步,3:服务号信息同步,4:好友企业同步,5:应用同步
    */
    app.link.execSyncService = function (type) {
        Cordova.exec(null, null, "LinkPlugin", "execSyncService", [type]);
    }

    /**
        打开自由流程页面
        @method app.link.startProcess
        @param processId {String} 流程id
        @param serviceName  {String} 流程名称
        @example
            app.link.startProcess('4b4db781-bdc2-4cfa-a6c0-03cc93bbef3f', '用户反馈');
    */
    app.link.startProcess = function (processId, serviceName) {
        var params = {
            code: "OpenProcess",
            processId: processId,
            serviceName: serviceName
        };
        Cordova.exec(null, null, "LinkPlugin", "launchLinkServiceWithDictionary", [params]);
    }

    /**
      * 打开我的工作页面
      * @method app.link.openProcessMywork
      * @example
      *     app.link.openProcessMywork();
    */
    app.link.openProcessMywork = function () {
        var params = {
            code: "OpenBuiltIn",
            key: "MyWork"
        };
        Cordova.exec(null, null, "LinkPlugin", "launchLinkServiceWithDictionary", [params]);
    }

    /**
        更新Link底部tab角标的数字
        @method app.link.updateTabBadge
        @param badgeValue {String} 角标的内容,这个内容直接更新到tab里面(当不传此值时去除角标)
        @example
            app.link.updateTabBadge('12');
    */
    app.link.updateTabBadge = function (badgeValue) {
        Cordova.exec(null, null, "LinkPlugin", "updateTabBadge", [badgeValue]);
    }

    /**
      * 获取当前Link的主题颜色值
      * @method app.link.getThemeColor
      * @param successCallback{Function} 成功回调,返回颜色值
      * @example
      * app.link.getThemeColor(function(res){
      *     app.alert(res);
      * });
    */
    app.link.getThemeColor = function (successCallback) {

        var callback = function (result) {
            result.background_color = "#" + result.background_color.substring(3);
            successCallback(result); //"#ff0072c6"
        }
        Cordova.exec(callback, null, "LinkPlugin", "getThemeColor", []);
    }

    /**
        启动link里面的服务(待补充)
        @method app.link.launchLinkService
        @param serviceParam{Object} 组合参数(需要用到请联系产品组)
    */
    app.link.launchLinkService = function (serviceParam) {
        Cordova.exec(null, null, "LinkPlugin", "launchLinkService", [serviceParam]);
    }


    /**
      * 注册系统消息监听<br/>注册完成后在页面声明 function nativeCallback(key, param) 就能够监听到消息了。param里面返回  accountType和 accountInstanceId
      * @method app.link.registerReceiver
      * @param key{String} link内部的key,例如 link_unreadMessageChanged 表示未读消息
    */
    app.link.registerReceiver = function (key) {
        Cordova.exec(null, null, "NativeBroadCast", "registerReceiver", [key]);
    }

    /**
      * 外部内容分享到Link里面(待补充)
      * @method app.link.share
      * @param params{Object}
      *     <br/>title: {string} 标题
      *     <br/>content: {string} 分享内容摘要
      *     <br/>icon: {string} 分享的图标地址,支持远程地址,或本地图片
      *     <br/>type: {string} WEBSITE,PICTURE
    */
    app.link.share = function (params, success, fail) {
        params = params || {};
        params.type = params.type || "WEBSITE";
        params.content = params.content || "";
        params.title = params.title || "";
        params.icon = params.icon || "";
        Cordova.exec(success, fail, "LinkPlugin", "share", [params]);
    }

    /**
      * 分享到聊天界面(个人/群组)
      * @method app.link.shareToMessage
      * @param params{Object}
      *     <br/>title: {string} 标题
      *     <br/>content: {string} 分享内容摘要
      *     <br/>icon: {string} 分享的图标地址,支持远程地址,或本地图片
      *     <br/>type: {string} WEBSITE,PICTURE。(4.6.8版本才支持PICTURE类型)
    */
    app.link.shareToMessage = function (params, success, fail) {
        params = params || {};
        params.type = params.type || "WEBSITE";
        params.content = params.content || "";
        params.title = params.title || "";
        params.icon = params.icon || "";
        Cordova.exec(success, fail, "LinkPlugin", "shareToMessage", [params]);
    }

    /**
      * 分享到动态
      * @method app.link.shareToBlog
      * @param params{Object}
      *     <br/>title: {string} 标题
      *     <br/>content: {string} 分享内容摘要
      *     <br/>icon: {string} 分享的图标地址,支持远程地址,或本地图片
      *     <br/>type: {string} WEBSITE,PICTURE。(4.6.8版本才支持PICTURE类型)
    */
    app.link.shareToBlog = function (params, success, fail) {
        params = params || {};
        params.type = params.type || "WEBSITE";
        params.content = params.content || "";
        params.title = params.title || "";
        params.icon = params.icon || "";
        if(params.type == 'PICTURE'){
			if(window.devicePlatform == "iOS"){
				params.content = params.icon;
			}
		}
        Cordova.exec(success, fail, "LinkPlugin", "shareToBlog", [params]);
    }

    /**
      * 分享到系统(Link 4.6.3 以上)
      * @method app.link.shareToSystem
      * @param params{Object}
      *     <br/>title: {string} 标题
      *     <br/>content: {string} 分享内容摘要
      *     <br/>icon: {string} 分享的图标地址,支持远程地址,或本地图片
      *     <br/>type: {string} WEBSITE,PICTURE。(4.6.8版本才支持PICTURE类型)
    */
    app.link.shareToSystem = function (params, success, fail) {
        params = params || {};
        params.type = params.type || "WEBSITE";
        params.content = params.content || "";
        params.title = params.title || "";
        params.icon = params.icon || "";
        params.text = params.content;
		
		if(params.type == 'PICTURE'){
			if(window.devicePlatform == "iOS"){
				params.content = params.icon;
			} else {
				params.filePath = params.icon;
			}
		}
        Cordova.exec(success, fail, "LinkPlugin", "shareToSystem", [params]);
    }

    /**
      * 打开小视频
      * @method app.link.openVideoRecord
    */
    app.link.openVideoRecord = function () {
        var params = {
            code: "OpenBuiltIn",
            key: "VideoCapture"
        };
        Cordova.exec(null, null, "LinkPlugin", "launchLinkServiceWithDictionary", [params]);
    }

    /**
    打开应用中心(旧版叫发现服务)
    @method app.link.openDiscoveryService
    */
    app.link.openDiscoveryService = function () {
        var params = {
            code: "OpenBuiltIn",
            key: "DcService"
        };
        Cordova.exec(null, null, "LinkPlugin", "launchLinkServiceWithDictionary", [params]);
    }

    /**
      * 打开扫一扫
      * @method app.link.scanCode
    */
    app.link.scanCode = function () {
        var params = {
            code: "OpenBuiltIn",
            key: "ScanCode"
        };
        Cordova.exec(null, null, "LinkPlugin", "launchLinkServiceWithDictionary", [params]);
    }

    /**
    打开Link内置浏览器
    @method app.link.openLinkBroswer
    @static
    */
    app.link.openLinkBroswer = function (title, url) {
        var params = {
            code: "OpenUrl",
            title: title,
            url: url
        };
        Cordova.exec(null, null, "LinkPlugin", "launchLinkServiceWithDictionary", [params]);
    }

    /**
    使用BT容器加载页面
    @method app.link.openBtBroswer
    @static
    @param {string} url 页面地址
    */
    app.link.openBtBroswer = function (url) {
        var params = "[BingoTouch]\nurl=" + url;
        Cordova.exec(null, null, "LinkPlugin", "launchLinkService", [params]);
    }


    /**
      * 打开pdf文件:url支持本地以及远程的地址
      * @method app.link.openPdfBroswer
      * @param title {Sting} 标题
      * @param url {Sting} url支持本地以及远程的地址
      * @static
    */
    app.link.openPdfBroswer = function (title, url) {
        var params = {
            name: title,
            uri: url
        }
        if (window.devicePlatform == "android") {
            Cordova.exec(null, null, "LinkPlugin", "fileBrowse", [params]);
        } else if (window.devicePlatform == "iOS") {
            app.link.openLinkBroswer(title, url);
        }
    }

    /**
    获取本地收藏的服务数据
    @method app.link.getFavoriteService
    @param callback {Function} 回调函数,返回json对象
    */
    app.link.getFavoriteService = function (callback) {
        var params = {
            code: "Data",
            key: "GetFavoriteService"
        };
        Cordova.exec(callback, null, "LinkPlugin", "launchLinkServiceWithDictionary", [params]);
    }

    /**
    获取全部收藏数据
    @method app.link.getAllServices
    @param callback {Function} 回调函数,返回json对象
    */
    app.link.getAllServices = function (callback) {
        var params = {
            code: "Data",
            key: "GetAllServices"
        };
        Cordova.exec(callback, null, "LinkPlugin", "launchLinkServiceWithDictionary", [params]);
    }

    /**
       选择文件
       @method app.link.chooseFile
       @param callback {Function} 回调函数,返回文件物理地址字符串
       @example
           app.link.chooseFile(function(result){
               app.alert(result);
           });
   */
    app.link.chooseFile = function (callback) {
        Cordova.exec(callback, null, "LinkPlugin", "chooseFile", []);
    }

    /**
     * 发起选择图片
     * @method app.link.imagePicker
     * @param {array} params.oldFileList  已选择的图片路径 ,只需要 resourceLocal对应的路径即可
     * @param {number} params.maxSelectCount  允许选择图片最大数量
     * @param {function} success [成功回调] [{"resourceSize":100kb,"resourceLocal":"/storage/emulated/0/xxxx", "fullSize": 100000, resourceType: 0}]
     * @param {function} fail    [失败回调]
     */
    app.link.imagePicker = function (success, fail, params) {
        var type = 1;
        params = params || {};
        params.oldFileList = params.oldFileList || [];
        params.maxSelectCount = params.maxSelectCount || 9;
        Cordova.exec(success, fail, "LinkPlugin", "selectResourceFiles", [type, params]);
    }


    /**
     * 压缩图片
     * @method app.link.compressImage
     * @param  {number} quality 图片压缩后的质量1~100,100为不压缩
     * @param  {array} pathArr 图片路径,里面每个元素都是对象 {path:"...",width:200,height:300}
     * @param  {function} success 成功回调函数
     * @param  {function} fail    失败回调函数
     */
    app.link.compressImage = function (quality, pathArr, success, fail) {
        Cordova.exec(success, fail, "LinkPlugin", "compressImage", [quality, pathArr]);
    }

    /**
     * 把本地图片保存到相册
     * @method app.link.saveToGallery
     * @param  {string} sourcePath 本地文件的路径
     * @param  {function} success 成功回调函数。 {path: '相册路径'}
     * @param  {function} fail    失败回调函数
     */
    app.link.saveToGallery = function (sourcePath, success, fail) {
        var params = {
            source: sourcePath
        };
        Cordova.exec(success, fail, "FilePlugin", "saveToGallery", [params]);
    }

    /**
     * 获取语言
     * @method app.link.getLanguage
     * @param  {Function} callback 回调函数,返回 en, zh-cn
     */
    app.link.getLanguage = function (callback) {
        Cordova.exec(callback, null, "LinkPlugin", "getLanguage", []);
    }


    /**
     * 打开云盘
     * @method app.link.openDisk
     */
    app.link.openDisk = function () {
        var params = {
            code: "OpenBuiltIn",
            key: "StartNewDisk",
            naviStyle: 3
        };
        Cordova.exec(null, null, "LinkPlugin", "launchLinkServiceWithDictionary", [params]);
    }

    /**
     * 打开语音助手
     * @method app.link.openSpeechAssistant
     */
    app.link.openSpeechAssistant = function () {
        var params = {
            code: "OpenBuiltIn",
            key: "SpeechAssistant"
        };
        Cordova.exec(null, null, "LinkPlugin", "launchLinkServiceWithDictionary", [params]);
    }


    /**
     * 发起聊天
     * @method app.link.startChat
     */
    app.link.startChat = function () {
        var params = {
            code: "StartChat"
        };
        Cordova.exec(null, null, "LinkPlugin", "launchLinkServiceWithDictionary", [params]);
    }

    /**
     * 打开待办待阅
     * @method app.link.openTodo
     * @param {object} options
     * @param {int} options.defaultIndex 0(待办)/1(待阅)/2(已办)
     */
    app.link.openTodo = function (options) {
        var params = {
            code: "UnityTodo",
            defaultIndex: options.defaultIndex
        };
        Cordova.exec(null, null, "LinkPlugin", "launchLinkServiceWithDictionary", [params]);
    }


    /**
     * 打开邮箱
     * @method app.link.startEmail
     */
    app.link.startEmail = function () {
        var params = {
            code: "OpenBuiltIn",
            key: "StartEmail"
        };
        Cordova.exec(null, null, "LinkPlugin", "launchLinkServiceWithDictionary", [params]);
    }

    /**
     * 打开在线客服
     * @method app.link.openOnlineServicer
     */
    app.link.openOnlineServicer = function () {
        var params = {
            code: "OpenBuiltIn",
            key: "OnlineServicer"
        };
        Cordova.exec(null, null, "LinkPlugin", "launchLinkServiceWithDictionary", [params]);
    }

    /**
     * 获取配置的服务器地址
     * @method app.link.getServerConfigs
     * @param {function} success 成功回调函数,返回json对象,所有的配置地址
     * @param {function} fail 失败回调函数,返回失败错误信息
     */
    app.link.getServerConfigs = function (success, fail) {
        Cordova.exec(success, fail, "LinkPlugin", "getServerConfigs", []);
    }


    /**
     * 浏览多媒体资源,包括图片、视频(android)
     * @method app.link.browseMultiMedia
     * @param {object} params 参数
     * @param {array} params.data 媒体数据对象数组,数据对象{url:"",thumbUrl:"",fileSize:100,fileType:1} fileType: 1图片2视频
     * @param {integer} params.position 初始化位置,默认是0
     * @param {bool} params.isVideoMuteOnFirstPlay 是否静音播放点击进来的视频,默认 false
     * @param {bool} params.isOptionEnable  是否允许进行保存网盘,分享聊天等操作,默认 true
     */
    app.link.browseMultiMedia = function (params) {
        params = $.extend({
            data: [],
            position: 0,
            isVideoMuteOnFirstPlay: false,
            isOptionEnable: true
        }, params);

        Cordova.exec(null, null, "LinkPlugin", "browseMultiMedia", [params]);
    }

    /**
    * sourceId转userId
    * @method app.link.sourceIdToUserId
    * @param {string} sourceId sourceId
    * @param {Function} successCallback 成功回调函数,返回用户信息/服务地址
    * @param {Function} failCallback 失败回调函数,返回错误字符串
    * @param {Object} option 参数
    * @param {string} option.isGetParams 是否传回服务地址
    */
    app.link.sourceIdToUserId = function (sourceId, successCallback, failCallback, option) {
        app.link.getServerConfigs((params) => {
            app.get(params.uamApiUri + '/v1/users/info', {
                sourceId
            }, function (res) {
                if (option && option.isGetParams) {
                    successCallback(res, params)
                } else {
                    successCallback(res)
                }
            }, function (err) {
                failCallback(err)
            })
        }, (err) => {
            failCallback(err)
        })
    }
    /**
    * 根据单个sourceId获取头像
    * @method app.link.getHPicture
    * @param {string} sourceId sourceId
    * @param {Function} successCallback 成功回调函数,返回图片地址
    * @param {Function} failCallback 失败回调函数,返回错误字符串
    */
    app.link.getHPicture = function (sourceId, successCallback, failCallback) {
        app.link.sourceIdToUserId(sourceId, (res, params) => {
            if (res.code == 200) {
                bui.alert(res)
                try {
                    let par = typeof res.returnValue == "string" ? JSON.parse(res.returnValue) : res.returnValue
                    let img = par.data.picture.split('||')[0]
                    if (img != '') {
                        let imgUrl = params.uamUri + '/ui/upload?action=download&filepath=' + img
                        successCallback(imgUrl)
                    } else {
                        successCallback('')
                    }
                } catch (error) {
                    failCallback(error)
                }
            } else {
                failCallback(res)
            }
        }, (err) => {
            failCallback(err)
        }, { isGetParams: true })
    }
    /**
    * 根据sourceId批量获取头像并设置到dom元素方法
    * @method app.link.getHPictures
    * @param className {string} dom元素类名
    */
    app.link.getHPictures = function (className) {
        $.each($(className), (index, item) => {
            if (item.getAttribute('isSuccess') == 'true') return
            app.link.getHPicture(item.getAttribute('sourceId'), (res) => {
                item.src = res
                item.setAttribute('isSuccess', 'true')
            }, (err) => {
                item.setAttribute('isSuccess', 'false')
            })
        })
    }
    /**
    * 固定横竖屏(安卓4.4.2)
    * @method app.link.setScreenOrientation
    * @param params {object} 参数
    * @param params.type {string} 参数值 portrait:竖屏/landscape:横屏/auto:自动
    * @param successCallback {function} 成功回调函数
    * @param failCallback {function} 失败回调函数
    */
    app.link.setScreenOrientation = function (params, successCallback, failCallback) {
        Cordova.exec(successCallback, failCallback, "LinkPlugin", "setScreenOrientation", [params]);
    }

    /**
   * 部门选择用户控件-单选(4.4.2)
   * @method app.link.startOrganUserSingleSelector
   * @param params {object} 参数
   * @param params.title {string} 提示
   * @param params.orgId {string} 部门id
   * @param params.userIgnoreList {Array} 忽略某些用户
   * @param params.userFixSelectedList {Array} 固定选中用户
   * @param successCallback {function} 成功回调函数
   * @param failCallback {function} 失败回调函数
   */
    app.link.startOrganUserSingleSelector = function (successCallback, failCallback, params) {
        Cordova.exec(successCallback, failCallback, "LinkPlugin", "startOrganUserSingleSelector", [params]);
    }

    /**
     * 部门选择控件-多选
     * @method app.link.startOrganUserMultiSelector
     * @param params {object} 参数
     * @param params.title {string} 提示
     * @param params.orgId {string} 部门id
     * @param params.userIgnoreList {Array} 忽略某些用户
     * @param params.userFixSelectedList {Array} 固定选中用户
     * @param successCallback {function} 成功回调函数
     * @param failCallback {function} 失败回调函数
     */
    app.link.startOrganUserMultiSelector = function (successCallback, failCallback, params) {
        Cordova.exec(successCallback, failCallback, "LinkPlugin", "startOrganUserMultiSelector", [params]);
    }

    /**
     * 获取app安装信息
     * @method app.link.getSdcardAppDir
     * @param successCallback {function} 成功回调函数
     * @param failCallback {function} 失败回调函数
     */
    app.link.getSdcardAppDir = function (successCallback, failCallback) {
        Cordova.exec(successCallback, failCallback, "LinkPlugin", "getSdcardAppDir", []);
    }

    /**
     * zoom加入视频会议(4.5.1)
     * @method app.link.joinMeeting
     * @param params {object} 参数
     * @param params.meetingNo {string} 视频会议ID
     * @param params.meetingPwd {string} 视频会议密码
     * @param params.nickName {string} 视频会议名称
     * @param successCallback {function} 成功回调函数
     * @param failCallback {function} 失败回调函数
     */
    app.link.joinMeeting = function (successCallback, failCallback, params) {
        Cordova.exec(successCallback, failCallback, "HuaweiMeeting", "joinMeeting", [params]);
    }

    //   app.fuZhouWpsPlugin.openFile = function (successCallback,failCallback,option) {
    //     Cordova.exec(successCallback, failCallback, "FuZhouWpsPlugin", "openFile",[option]);
    //   }
    /**
    * 设置全屏(安卓)
    * @method app.link.setFullScreen
    * @param successCallback {function} 成功回调函数,返回json对象
    * @param failCallback {function} 失败回调函数,返回错误字符串
    * @param params {object} 参数
    * @param params.isEnable {Boolean} true 全屏 false 取消全屏
    */
    app.link.setFullScreen = function (successCallback, failCallback, params) {
        Cordova.exec(successCallback, failCallback, "LinkPlugin", "setFullScreen", [params]);
    }

    /**
     * Link平台功能接口,使用该模块必须先引入Cordova.js 和 bingotouch.js<br/>获取步数相关操作接口
     * @namespace app.todayStepCount
    */
    window.app.todayStepCount = window.app.todayStepCount || {};

    /**
     * 获取今天的步数
     *
     * 如果需要持续获取步数变化,可以js启用一个定时器,定时调用这个方法
     *   app.todayStepCount.getTodayStepCount(function (data) {
     *      bui.alert("成功回调 data:"+data.stepCount);
     *   },function (data) {
     *       bui.alert("错误回调"+data);
     *   });
     *
     *	成功回调值 
     *  {
     *		"from":	"com.huawei.health",//如果是"from"="com.huawei.health",则是从华为运动健康获取到的数据,否则没有这一个字段
     *      "stepCount":10000,//如果"from"="com.huawei.health",则是从华为健康读取到的步数,否则是原来旧逻辑的步数(非华为手机一般都没有华为健康应用,但用户手动下载华为运动健康应用也可以读取到)
     *	    "nativeStepCount":20000,//原来旧逻辑的步数,如果"from"="com.huawei.health",则有这一个字段,否则没有这一个字段。
     *	}
     *
     *  失败回调值 
     *  {
     *	   "errorMsg":"失败回调说明",
     *     "errorCode":失败回调code,
     *     "from":"com.huawei.health",//为了以后区分是三星健康还是华为运动健康用的。
     *     "nativeStepCount":10000,原来旧逻辑的步数
     *  }
     errorCode和errorMsg对接列表
         1 调用失败 典型场景:没有安装华为运动健康App或者未启动
         2 参数异常 典型场景:不支持某项查询
         4 API调用异常 典型场景:如:一个应用多次注册运动而未进行解注册
         1001 隐私权限校验异常 典型场景:用户未授权,需要提醒用户打开相关权限
         1002 scope校验异常 典型场景:华为未授权对应的scope权限,需要三方开发者到开发者联盟申请。参见申请 HiHealth Kit 服务。
         3  数据校验失败 典型场景:查询参数为 null 或回调函数为 null
         7  参数错误 典型场景:插入数据时起止时间不同,如:插入体重数据
         1003  APP隐私协议未同意异常 典型场景:用户未在华为运动健康App 上同意隐私协议
         -100  没有获取到读取步数的权限(android10上没有华为运动健康的手机,需要申请”获取设备中的健身运动信息“权限才可以获取步数,如果没有权限则报这一个错)
     */
    /**
    * 获取今天步数
    * @method app.todayStepCount.getTodayStepCount
    * @param successCallback {function} 成功回调函数,返回json对象
    * @param failCallback {function} 失败回调函数,返回错误字符串
    */
    app.todayStepCount.getTodayStepCount = function (successCallback, failCallback) {
        Cordova.exec(successCallback, failCallback, "StepCounter", "getTodayStepCount", []);
    }


    /**
     * 只取旧逻辑步数不读华为健康等第三方的步数。(避免如果一直读取华为运动健康步数,但用户又一直拒绝给权限的问题)
     * @method app.todayStepCount.getNativeTodayStepCount
     * @param successCallback {function} 成功回调函数,返回json对象
     * @param failCallback {function} 失败回调函数,返回错误字符串
     */
    app.todayStepCount.getNativeTodayStepCount = function (successCallback, failCallback) {
        Cordova.exec(successCallback, failCallback, "StepCounter", "getTodayStepCount", [{ "from": "native" }]);
    }

    /**
     * 获取除了旧的计步逻辑外,可以对接的第三方运动健康步数来源
     * 例如华为手机上装有运动健康的话就是返回"['com.huawei.health']"
     * @method app.todayStepCount.getStepCountFrom
     * @param successCallback {function} 成功回调函数,返回可用来源:['com.huawei.health']
     */
    app.todayStepCount.getStepCountFrom = function (successCallback) {
        Cordova.exec(successCallback, null, "StepCounter", "getStepCountFrom", []);
    }


    /**
     * 保存步数来源
     * @method app.todayStepCount.savedFrom
     * @param from {Array} 步数来源
     * @param successCallback {function} 成功回调函数
     */
    app.todayStepCount.savedFrom = function (from, successCallback) {
        Cordova.exec(successCallback, null, "StepCounter", "savedFrom", [{ "from": from }]);
    }

    /**
     * 获取已经保存的步数来源
     * @method app.todayStepCount.getStepCountSavedFrom
     * @param successCallback {function} 成功回调函数
     */
    app.todayStepCount.getStepCountSavedFrom = function (successCallback) {
        Cordova.exec(successCallback, null, "StepCounter", "getStepCountSavedFrom", []);
    }

    /**
     * Link平台功能接口,使用该模块必须先引入Cordova.js 和 bingotouch.js<br/>通讯交互相关操作接口
     * @namespace app.broadcast
    */
    window.app.broadcast = window.app.broadcast || {};
    /**
     * 事件注册-跨技术(weex/bt)
     * @method app.broadcast.registerReceiverEvent
     * @param successCallback {function} 成功回调函数,返回json对象
     * @param failCallback {function} 失败回调函数,返回错误字符串
     * @param eventName {string} 事件名称
     * @param receiver {string} 事件回调名称-如:receiver值为callback,那么将触发window.callback()
     */
    app.broadcast.registerReceiverEvent = function (successCallback, failCallback, eventName, receiver) {
        Cordova.exec(successCallback, failCallback, "BroadcastPlugin", "registerReceiver", [{ "receiverId": null, eventName, receiver }]);
    }
    /**
    * 取消事件注册-跨技术(weex/bt)
    * @method app.broadcast.unregisterReceiver
    * @param successCallback {function} 成功回调函数,返回json对象
    * @param failCallback {function} 失败回调函数,返回错误字符串
    * @param receiverId {string} 注册id
    */
    app.broadcast.unregisterReceiver = function (successCallback, failCallback, receiverId) {
        Cordova.exec(successCallback, failCallback, "BroadcastPlugin", "unregisterReceiver", [{ receiverId }]);
    }
    /**
     * 发送注册事件-跨技术(weex/bt)
     * @method app.broadcast.sendBroadcast
     * @param successCallback {function} 成功回调函数,返回json对象
     * @param failCallback {function} 失败回调函数,返回错误字符串
     * @param eventName {string} 事件名称
     * @param params {object} 传参参数
     */
    app.broadcast.sendBroadcast = function (successCallback, failCallback, eventName, params) {
        Cordova.exec(successCallback, failCallback, "BroadcastPlugin", "sendBroadcast", [{ eventName, params }]);
    }

    /**
     * 获取指定文件大小
     * @method app.link.getFlieSize
     * @param successCallback {function} 成功回调函数,返回文件大小
     * @param failCallback {function} 失败回调函数,返回错误字符串
     * @param path {string} 文件路径
     */

    app.link.getFlieSize = function (path, successCallback, failCallback) {
        Cordova.exec(successCallback, failCallback, "FilePlugin", "getSize", [path]);
    }

    /**
     * 删除指定文件
     * @method app.link.deleteFile
     * @param successCallback {function} 成功回调函数
     * @param failCallback {function} 失败回调函数,返回错误字符串
     * @param path {string} 文件路径
    */

    app.link.deleteFile = function (path, successCallback, failCallback) {
        Cordova.exec(successCallback, failCallback, "FilePlugin", "delete", [path]);
    }

    /**
     * 调用手势
     * @method app.link.startGestureLockValidation
     * @param successCallback {function} 成功回调函数
     * @param failCallback {function} 失败回调函数
    */

    app.link.startGestureLockValidation = function (successCallback, failCallback) {
        Cordova.exec(successCallback, failCallback, "LinkPlugin", "startGestureLockValidation", []);
    }

    /**
     * 录屏方法,具有倒计时能力(4.5.6)
     * @method app.link.captureVideo
     * @param successCallback {function} 成功回调函数 返回文件信息 fullPath:文件保存路径 name:文件名称 size: 文件大小
     * @param failCallback {function} 失败回调函数
     * @param params {object} 传参参数
     * @param params.duration {number} 录制时长
     */
    app.link.captureVideo = function (successCallback, failCallback, params) {
        navigator.device.capture.captureVideo(successCallback, failCallback, params);
    }

    /**
     * 压缩方法(在部分的安卓手机上不兼容)
     * @method app.link.transcodeVideo
     * @param successCallback {function} 成功回调函数
     * @param failCallback {function} 失败回调函数
     * @param params {Object}
     * @param params.fileUri {string} 设备上视频的路径
     * @param params.outputFileName {string} 输出文件名称
     */
    app.link.transcodeVideo = function (successCallback, failCallback, params) {
        Cordova.exec(successCallback, failCallback, 'VideoEditor', 'transcodeVideo', [params]);
    }

    /**
     * 获取终端设置的字体大小 小、中、大的值分别对应的是13,16,20(安卓端 4.5.5)
     * @method app.link.getTextSizeSetting
     * @param successCallback {function} 成功回调函数
     * @param failCallback {function} 失败回调函数
    */
    app.link.getTextSizeSetting = function (successCallback, failCallback) {
        Cordova.exec(successCallback, failCallback, 'LinkPlugin', 'getTextSizeSetting', []);
    }

    /**
      * 打开轻应用调试模式(安卓端 4.5.5)
      * @method app.link.startDevMain
      * @param successCallback {function} 成功回调函数
      * @param failCallback {function} 失败回调函数
    */
    app.link.startDevMain = function (successCallback, failCallback) {
        var params = {
            code: "OpenBuiltIn",
            key: "startDevMain"
        };
        Cordova.exec(successCallback, failCallback, "LinkPlugin", "launchLinkServiceWithDictionary", [params]);
    }

    /**
     * 获取link版本(安卓 4.5.5)
     * @method app.link.getVersionInfo
     * @param successCallback {function}  成功回调函数,返回版本信息
     * @param failCallback {function}  失败回调函数
     */
    app.link.getVersionInfo = function (successCallback, failCallback) {
        Cordova.exec(successCallback, failCallback, 'LinkPlugin', 'getVersionInfo', []);
    }

    /**
     * 检测link是否有新版本(安卓端 4.5.5)
     * @method app.link.checkVersion
     * @param successCallback {function}  成功回调函数
     * @param failCallback {function}  失败回调函数
     */
    app.link.checkVersion = function (successCallback, failCallback) {
        var params = {
            code: "OpenBuiltIn",
            key: "CheckVersion"
        };
        Cordova.exec(successCallback, failCallback, "LinkPlugin", "launchLinkServiceWithDictionary", [params]);
    }

    /**
     * 发起选择文件资源
     * @method app.link.selectFiles
     * @param type {number} 范围0~5,0:拍照 1:选择图片  2 本地文件单选  3:云盘文件  4: 界与聊天里的文件跳转后界面相同,选择最近聊天文件和本地文件(仅支持安卓)  5: 本地文件多选
     * @param successCallback {function} 成功回调函数 [{"resourceSize":100kb,"resourceLocal":"/storage/emulated/0/xxxx"}]
     * @param failCallback {function}    失败回调函数
     */
    app.link.selectFiles = function (successCallback, failCallback, type) {
        Cordova.exec(successCallback, failCallback, "LinkPlugin", "selectResourceFiles", [type]);
    }

    /**
     *  根据文件路径转base64
     *  @method app.link.pathToBase64
     *  @param successCallback {function} 成功回调函数 返回base64
     *  @param failCallback {function} 失败回调函数
    */
    app.link.pathToBase64 = function (successCallback, failCallback, params) {
        var fullPath = params.fullPath,
            size = params.size;
        Cordova.exec(successCallback, failCallback, "File", "readAsDataURL", [fullPath, 0, size]);
    }

    /**
     *  根据文件路径获取文件信息
     *  @method app.link.getFileMetadata
     *  @param successCallback {function} 成功回调函数 [{"size":100000,"fullPath":"/storage/emulated/0/xxxx", type: "image/jpeg", "name": "XXX", "lastModifiedDate": "更新时间"}]
     *  @param failCallback {function} 失败回调函数
     *  @param path {string} 文件路径
     */
    app.link.getFileMetadata = function (successCallback, failCallback, path) {
        Cordova.exec(successCallback, failCallback, "File", "getFileMetadata", [path]);
    }

    /**
     * 开始录音(安卓4.5.6)
     * @method app.link.recordStart
     * @param params {Object}  参数对象
     * @param params.savePath {string}  录音的保存路径
     * @param successCallback {function} 成功回调
     * @param failCallback {function} 失败回调
     */
    app.link.recordStart = function (successCallback, failCallback, params) {
        Cordova.exec(successCallback, failCallback, "RecordVoice", "recordStart", [params.savePath]);
    }

    /**
     * 结束录音(安卓4.5.6)
     * @method app.link.recordStop
     * @param successCallback {function} 成功回调,返回录音信息
     * @param failCallback {function} 失败回调
     */
    app.link.recordStop = function (successCallback, failCallback) {
        Cordova.exec(successCallback, failCallback, "RecordVoice", "recordStop", []);
    }

    /**
     * 视频压缩能力(安卓4.5.6)
     * @method app.link.compressedVideo
     * @param successCallback {function} 成功回调函数 返回文件信息 fullPath:文件保存路径 name:文件名称 size: 文件大小
     * @param failCallback {function} 失败回调函数
     * @param params {Object}  参数对象
     * @param params.inputFile {string} 设备上视频的路径
     * @param params.outputFile {string} 输出文件路径
     */
    app.link.compressedVideo = function (successCallback, failCallback, params) {
        var param = {
            args: ['-i', params.inputFile, "-vcodec", "mpeg4", '-b:v', '500k', '-r', '15', params.outputFile, '-y']
        }
        Cordova.exec(successCallback, failCallback, "MediaProcessPlugin", "ffmpeg", [param]);
    }

    /**
     * 云学堂直播-SDK初始化
     * @method app.link.initYXTLiveSdk
     * @param environment {string}  运行环境,值有Develop、Ucstable、Production、Feature
     * @param accessType {string} 接入模式,值有Inner、ForeignMiniCourse、ForeignLive。(该参数iOS无效)
     * @param enableLog {boolean} 日志是否打开。(该参数iOS无效)
     * @param successCallback {function} 成功回调函数
     * @param failCallback {function} 失败回调函数
     * @example
     *  app.link.initYXTLiveSdk(example_environment, example_accessType, example_enableLog, result => {
     *      bui.alert('sdk init success')
     *  },
     *  error => {
     *      bui.alert(error);
     *  })
     */
    app.link.initYXTLiveSdk = function (environment, accessType, enableLog, successCallback, failCallback) {
        if(window.devicePlatform == "iOS"){
            switch(environment){
                case 'Develop':
                    environment = 0;
                break;
                case 'Feature':
                    environment = 1;
                break;
                case 'Ucstable':
                    environment = 2;
                break;
                case 'Production':
                    environment = 3;
                break;
            }
        }
        Cordova.exec(successCallback, failCallback, "YXTLivePlugin", "initLiveSdk", [{environment, accessType, enableLog}]);
    }

    /**
     * 云学堂直播-打开直播
     * @method app.link.openYXTLiveScene
     * @param scene {string} 直播场景,值有 liveRoom(直播间)、liveReplay(直播回放)、miniCourse(微课)
     * @param roomId {string}  直播间 id
     * @param token {string} 鉴权 token
     * @param title {string} 直播或微课的标题。直播回放、微课需要传,直播间不需要传
     * @param successCallback {function} 成功回调函数
     * @param failCallback {function} 失败回调函数
     * @example
     *  app.link.openYXTLiveScene(example_scene, example_roomId, example_token, example_title, result => {
     *      bui.alert('openYXTLiveScene success')
     *  },
     *  error => {
     *      bui.alert(error);
     *  })
     */
    app.link.openYXTLiveScene = function (scene, roomId, token, title, successCallback, failCallback) {
        Cordova.exec(successCallback, failCallback, "YXTLivePlugin", "openYXTLiveScene", [{scene, roomId, token, title}]);
    }
})(window);