移動(dòng)端 H5 多平臺(tái)分享實(shí)踐

這篇文章寫于 2018 年朴沿,部分方法可能已失效

圣誕節(jié)和元旦團(tuán)隊(duì)策劃了兩個(gè)活動(dòng)乒验,都涉及到了在多個(gè)平臺(tái)下的分享,如何按照產(chǎn)品要求實(shí)現(xiàn)多平臺(tái)下一致的分享效果海蔽,包括分享文案的動(dòng)態(tài)生成钥组,在沒有客戶端 Native 方法的幫助下是比較困難的输硝。我們研究了很多分享方案,得到了一套較為完整的分享方案程梦。

系統(tǒng)原生的分享

瀏覽器現(xiàn)在具備了一個(gè)新的實(shí)驗(yàn)性 API navigator.share点把,可以直接拉起系統(tǒng)原生的分享面板,需要網(wǎng)頁(yè)支持通過 HTTPS 訪問屿附。例如:

const share = {
  title: '分享標(biāo)題',
  text: '分享內(nèi)容',
  url: '分享鏈接',
};

navigator.share(share);

這里也有一個(gè)示例項(xiàng)目:https://whut-recruit.netlify.app 郎逃,效果如下:

系統(tǒng)原生分享

Share API 的具體使用可以參考:https://developer.mozilla.org/zh-CN/docs/Web/API/Navigator/share

微信的分享

微信下的分享通過調(diào)用微信提供的 JS-SDK 和引導(dǎo)用戶點(diǎn)擊右上角完成。
使用微信的 JS-SDK 需要引入如下 JS 文件:

<script src="https://res.wx.qq.com/open/js/jweixin-1.6.0.js"></script>

設(shè)置分享內(nèi)容的代碼如下:

wx.config({
  debug: false,
  appId: '公眾號(hào)的appid',
  timestamp: '時(shí)間戳',
  nonceStr: '隨機(jī)字符串',
  signature: '簽名',
  jsApiList: ['onMenuShareTimeline', 'onMenuShareAppMessage', 'onMenuShareQQ', 'onMenuShareWeibo', 'onMenuShareQZone', 'showOptionMenu', 'hideAllNonBaseMenuItem', 'showAllNonBaseMenuItem']
});

wx.ready(function() {
  const share = {
    title: '分享標(biāo)題(朋友圈只顯示標(biāo)題)',
    desc: '分享內(nèi)容',
    imgUrl: '圖片URL',
    link: '分享鏈接(最好是后臺(tái)JS安全域名)',
    success() {
      hideMaskLayer();  // 分享成功拿撩,隱藏引導(dǎo)用戶分享的浮層
    },
    cancel() {
    }
  };
  wx.onMenuShareAppMessage(share);  // 微信好友
  wx.onMenuShareTimeline(share);  // 朋友圈
  wx.onMenuShareQQ(share);  // QQ
  wx.onMenuShareQZone(share);  // QQ空間
  wx.onMenuShareWeibo(share);  // 騰訊微博
});

其中 wx.config 中的參數(shù)由服務(wù)端得到衣厘,具體可參見微信的開發(fā)文檔:https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/JS-SDK.html

注意:必須在公眾號(hào)后臺(tái)設(shè)置 JS 安全域名,否則可能無法調(diào)用

效果如下:

引導(dǎo)用戶分享

分享到朋友圈(自定義文案)

QQ/TIM 的分享

通過 JS API 分享

QQ(以下無特殊說明TIM下同樣有效)下也有設(shè)置分享內(nèi)容的API压恒,同樣需要先引用JSBridge相關(guān)的文件:

<script src="http://open.mobile.qq.com/sdk/qqapi.js"></script>

設(shè)置分享內(nèi)容的代碼如下:

const share = {
    title: '分享標(biāo)題影暴,最大45字節(jié)',
    desc: '分享內(nèi)容,最大60字節(jié)',
    image_url: '圖片URL',
    share_url: '分享鏈接'
};
mqq.data.setShareInfo(share, callback);

需要注意的是:分享鏈接長(zhǎng)度不能超過120字節(jié)探赫,并且必須跟頁(yè)面URL同一個(gè)域名型宙,否則設(shè)置不生效;分享的圖片最小需要200 * 200伦吠,否則分享到QQ空間時(shí)會(huì)被過濾掉妆兑。
設(shè)置完分享內(nèi)容后魂拦,可通過API調(diào)用喚起QQ的分享面板,免去引導(dǎo)的過程搁嗓。

mqq.ui.showShareMenu();

還有一種方法芯勘,QQ提供了監(jiān)聽點(diǎn)擊分享平臺(tái)的事件,當(dāng)點(diǎn)擊Native分享面板中的分享平臺(tái)時(shí)腺逛,會(huì)觸發(fā)此事件荷愕,QQ默認(rèn)的分享行為將不再執(zhí)行。代碼如下:

mqq.ui.setOnShareHandler(function (platform) {
    mqq.ui.shareMessage({
        title: '分享標(biāo)題',
        desc: '分享內(nèi)容',
        share_type: platform,
        share_url: '分享鏈接',
        image_url: '圖片URL',
        sourceName: '掌上理工大',
        back: true
    }, function() {
    });
});

其中platform是分享平臺(tái)類型棍矛,取值如下:

編號(hào) 分享平臺(tái)
0 QQ好友
1 QQ空間
2 微信好友
3 微信朋友圈

通過 meta 標(biāo)簽分享

QQ也支持通過設(shè)置meta標(biāo)簽定義分享內(nèi)容安疗。通過定義itemprop可設(shè)置分享內(nèi)容,同時(shí)為了更好的兼容其它平臺(tái)够委,我們也引入了Open Graph標(biāo)準(zhǔn)荐类。代碼如下:

<meta itemprop="name" property="og:title" content="分享標(biāo)題">
<meta property="og:url" content="分享鏈接">
<meta itemprop="image" property="og:image" content="圖片URL">
<meta name="description" itemprop="description" property="og:description" content="分享描述">

需要注意的是,meta標(biāo)簽需要是服務(wù)端渲染輸出茁帽,通過js生成或修改無效玉罐。

通過URL Scheme喚起QQ分享

還可以通過URL Scheme喚起QQ進(jìn)行分享,該方法的好處在于可以在非QQ環(huán)境下喚起QQ實(shí)現(xiàn)分享脐雪,缺點(diǎn)在于不能設(shè)置分享圖片厌小。代碼如下:

const share = {
    title: '分享標(biāo)題',
    desc: '分享內(nèi)容',
    share_url: '分享鏈接'
};
const url_scheme = '//share/to_fri?src_type=web&version=1&file_type=news&share_id=1103437993&title=' + Base64.encode(share.title) + '&thirdAppDisplayName=5o6M5LiK55CG5bel5aSn&url=' + Base64.encode(share.share_url) + '&description=' + Base64.encode(share.desc);
location.assign('mqqapi:' + url_scheme);
setTimeout(function() {
  location.assign('timapi:' + url_scheme);
}, 2000);

其中分享的參數(shù)在拼入U(xiǎn)RL中時(shí)需要Base64編碼。為了支持TIM下的分享战秋,我們引入了延時(shí)函數(shù),如果喚起QQ失敗該定時(shí)器將會(huì)執(zhí)行喚起TIM讨韭,喚起成功離開了此頁(yè)面將不會(huì)執(zhí)行脂信。QQ和TIM均安裝時(shí)優(yōu)先喚起QQ。
效果如下:

喚起的Native分享

通過分享組件的URL實(shí)現(xiàn)

QQ空間提供了分享組件(可參見:https://connect.qq.com/intro/share)透硝,通過分析該組件可得到分享URL的參數(shù)狰闪。代碼如下:

const share = {
    title: '分享標(biāo)題',
    desc: '分享內(nèi)容',
    image_url: ['圖片URL'],
    share_url: '分享鏈接'
};
let image_urls = share.image_url.map(function(image) {
    return encodeURIComponent(image);
});
location.replace('https://sns.qzone.qq.com/cgi-bin/qzshare/cgi_qzshare_onekey?url=' + encodeURIComponent(share.share_url) + '&site=掌上理工大&title=' + share.title + '&pics=' + image_urls.join('|') + '&summary=' + share.desc);

其中可支持多圖片的分享,圖片URL用豎線分隔濒生。
該方法優(yōu)點(diǎn)在于同樣支持非QQ環(huán)境下的分享埋泵。非QQ下用戶登錄后即可分享,QQ下可免登直接分享罪治。
效果如下:

QQ空間分享組件

微博的分享

通過分享組件的URL實(shí)現(xiàn)

微博同樣提供了分享組件丽声,通過分析URL可得到分享參數(shù)。代碼如下:

const share = {
    title: '分享標(biāo)題',
    image_url: '圖片URL',
    share_url: '分享鏈接'
};
location.replace('https://service.weibo.com/share/share.php?url=' + encodeURIComponent(share.share_url) + '&title=' + share.title + '&appkey=277159429&&ralateUid=1855112015&pic=' + share.image_url + '&searchPic=true');

其中appKey參數(shù)可選觉义,如果設(shè)置微博將會(huì)顯示分享來源為key對(duì)應(yīng)的應(yīng)用名稱(應(yīng)用可在 https://open.weibo.com/ 注冊(cè))雁社;ralateUid參數(shù)可選,指定微博用戶id晒骇,會(huì)在微博尾部at此用戶霉撵;searchPic用于控制是否自動(dòng)爬取頁(yè)面的圖片磺浙,和pic不共存。
效果如下:

微博分享組件

通過微博API自動(dòng)發(fā)送微博

微博提供了API可通過服務(wù)端調(diào)用接口直接發(fā)送一條微博徒坡。

POST https://api.weibo.com/2/statuses/share.json

參數(shù)如下:

必選 類型及范圍 說明編號(hào)
access_token string 采用OAuth授權(quán)方式為必填參數(shù)撕氧,OAuth授權(quán)后獲得。
status string 用戶分享到微博的文本內(nèi)容喇完,必須URL Encode呵曹,文本中不能包含“#話題詞#”,同時(shí)文本中必須包含至少一個(gè)分享的URL何暮,且該URL的域名需要在后臺(tái)設(shè)置奄喂。
pic binary 用戶分享到微博的圖片,僅支持JPEG海洼、GIF跨新、PNG圖片,上傳圖片大小限制為5M坏逢。上傳圖片時(shí)域帐,POST方式提交請(qǐng)求,需要采用multipart/form-data編碼方式是整。
rip string 開發(fā)者上報(bào)的操作用戶真實(shí)IP肖揣,形如:211.156.0.1。

具體可參見:微博開放平臺(tái)

通過 JS API 分享

微博同樣有提供JS-SDK可供調(diào)用Native的方法浮入,在使用前需要在微博開放平臺(tái)申請(qǐng)輕應(yīng)用龙优,并設(shè)置安全域名。
使用微信的JS-SDK需要引入如下js文件:

<script src="http://tjs.sjs.sinajs.cn/open/thirdpart/js/jsapi/mobile.js"></script>

同樣需要先設(shè)置初始化參數(shù)事秀。

WeiboJS.init({
    appkey: '輕應(yīng)用key',
    debug: false,
    timestamp: '時(shí)間戳',
    noncestr: '隨機(jī)字符串',
    signature: '簽名',
    scope: ['openMenu', 'setMenuItems', 'menuItemSelected', 'setSharingContent']
}, function() {
});

有3個(gè)關(guān)于分享的JS API可供使用彤断。

  1. openMenu

該API可調(diào)起Native的分享面板。

WeiboJS.invoke('openMenu');
  1. setSharingContent

該API可設(shè)置分享的內(nèi)容易迹。

WeiboJS.invoke('openMenu', {
    icon: share.title,
    desc: share.desc,
    icon: share.image_url
});
  1. invokeMenuItem

該API可以直接觸發(fā)分享面板中點(diǎn)擊相應(yīng)菜單項(xiàng)宰衙。

WeiboJS.invoke('invokeMenuItem', { 
    code: platform
});

其中platform是分享平臺(tái)類型,取值如下:

編號(hào) 分享平臺(tái)
1001 微博
1002 微博好友圈
1003 微博私信
1004 微信好友
1005 微信朋友圈
1006 微米好友
1007 微米圈
1008 來往(點(diǎn)點(diǎn)蟲)好友
1009 來往(點(diǎn)點(diǎn)蟲)動(dòng)態(tài)
1010 QQ好友
1011 QQ空間
1101 短信
2001 系統(tǒng)瀏覽器
2002 復(fù)制鏈接

通過使用API 1 + API 2(最佳)或API 2 + API 3即可實(shí)現(xiàn)分享睹欲。具體可參見微博的開發(fā)文檔:
http://open.weibo.com/wiki/輕應(yīng)用H5新版JS

支付寶的分享

支付寶同樣提供了JS API供炼,可以很方便的設(shè)置分享內(nèi)容和喚起Native分享面板;不足之處在于不支持分享到QQ窘疮、微信等平臺(tái)袋哼。
使用支付寶的JS-SDK需要引入如下js文件:

<script src="http://a.alipayobjects.com/g/h5-lib/alipayjsapi/3.0.6/alipayjsapi.inc.min.js"></script>

代碼如下:

const share = {
    title: '分享標(biāo)題',
    content: '分享內(nèi)容',
    image: '圖片URL',
    url: '分享鏈接',
    captureScreen: false,
    showToolBar: false
};
ap.share(share, function() {
});

效果如下:

支付寶Native分享

UC 瀏覽器的分享

UC 瀏覽器也提供了JS API調(diào)用Native的分享,支持喚起分享面板和分享到具體平臺(tái)考余。代碼如下:

const share = {
    title: '分享標(biāo)題',
    desc: '分享內(nèi)容',
    image_url: '圖片URL',
    share_url: '分享鏈接'
};
const isiOS = /(iPhone|iPad|iPod)/.test(navigator.userAgent);  // 判斷應(yīng)用平臺(tái)
if (isiOS) {
    if (ucbrowser.web_shareEX) {
        ucbrowser.web_shareEX(
            JSON.stringify({
                title: share.title,
                content: share.desc,
                sourceUrl: share.share_url,
                imageUrl: share.image_url,
                source: '掌上理工大',
                target: platform
            });
        )
    } else {
        ucbrowser.web_share(share.title, share.desc, share.share_url, platform, '', '掌上理工大', share.image_url);
    }
}
else ucweb.startRequest('shell.page_share', [share.title, share.desc, share.share_url, platform, '', '掌上理工大', share.image_url]);

其中platform是分享平臺(tái)類型先嬉,取值如下:

Android編號(hào) iOS編號(hào) 分享平臺(tái)
'WechatFriends' 'kWeixinFriend' 微信好友
'WechatTimeline' 'kWeixin' 微信朋友圈
'QQ' 'kQQ' QQ好友
'Qzone' 'kQZone' QQ空間
'SinaWeibo' 'kSinaWeibo' 微博
undefined undefined 分享面板

調(diào)起分享面板的效果如下:

UC分享面板

調(diào)起微博:

UC調(diào)起微博

QQ 瀏覽器的分享

QQ 瀏覽器也提供了JS API調(diào)用Native的分享,同樣支持喚起分享面板楚堤、生成二維碼和分享到具體平臺(tái)疫蔓。
首先需要引入如下JS文件:

<script src="http://jsapi.qq.com/get?api=app.share"></script>

代碼如下:

browser.app.share({
    title: share.title,
    description: share.desc,
    url: share.share_url,
    img_url: share.image_url,
    from: '掌上理工大',
    to_app: platform
});

其中platform是分享平臺(tái)類型含懊,取值如下:

編號(hào) 分享平臺(tái)
1 微信好友
8 微信朋友圈
4 QQ好友
3 QQ空間
11 微博
5 更多
7 生成二維碼
10 復(fù)制鏈接
undefined 分享面板

調(diào)起分享面板的效果如下:

QQ瀏覽器分享面板

掌上理工大的分享

掌上理工大是我們團(tuán)隊(duì)開發(fā)的一款A(yù)pp。我們同樣通過JSBridge提供了分享能力衅胀。掌上理工大的WebView容器會(huì)在頁(yè)面加載前注入token對(duì)象岔乔,包含了分享接口,Native端使用了友盟SDK執(zhí)行具體的分享邏輯滚躯。該分享方式優(yōu)點(diǎn)在于采用了Native的分享方式雏门,通過調(diào)用QQ、微信掸掏、微博各個(gè)平臺(tái)給App開放的分享能力茁影,分享的體驗(yàn)最佳,并且可以在QQ等平臺(tái)中準(zhǔn)確的顯示分享來源(掌上理工大)丧凤。
分享接口:

token.invokeShare(share.title, share.share_url, platform);

其中platform是分享平臺(tái)類型募闲,取值如下:

編號(hào) 分享平臺(tái)
0 調(diào)用分享面板
1 微信好友
2 微信朋友圈
3 QQ好友
4 QQ空間
5 新浪微博

Native會(huì)取當(dāng)前頁(yè)面截圖作為分享圖片。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末愿待,一起剝皮案震驚了整個(gè)濱河市浩螺,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌仍侥,老刑警劉巖要出,帶你破解...
    沈念sama閱讀 218,755評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異农渊,居然都是意外死亡患蹂,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門腿时,熙熙樓的掌柜王于貴愁眉苦臉地迎上來况脆,“玉大人,你說我怎么就攤上這事批糟。” “怎么了看铆?”我有些...
    開封第一講書人閱讀 165,138評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵徽鼎,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我弹惦,道長(zhǎng)否淤,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,791評(píng)論 1 295
  • 正文 為了忘掉前任棠隐,我火速辦了婚禮石抡,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘助泽。我一直安慰自己啰扛,他們只是感情好嚎京,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著隐解,像睡著了一般鞍帝。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上煞茫,一...
    開封第一講書人閱讀 51,631評(píng)論 1 305
  • 那天帕涌,我揣著相機(jī)與錄音,去河邊找鬼续徽。 笑死蚓曼,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的钦扭。 我是一名探鬼主播纫版,決...
    沈念sama閱讀 40,362評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼土全!你這毒婦竟也來了捎琐?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,264評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤裹匙,失蹤者是張志新(化名)和其女友劉穎瑞凑,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體概页,經(jīng)...
    沈念sama閱讀 45,724評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡籽御,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了惰匙。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片技掏。...
    茶點(diǎn)故事閱讀 40,040評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖项鬼,靈堂內(nèi)的尸體忽然破棺而出哑梳,到底是詐尸還是另有隱情,我是刑警寧澤绘盟,帶...
    沈念sama閱讀 35,742評(píng)論 5 346
  • 正文 年R本政府宣布鸠真,位于F島的核電站,受9級(jí)特大地震影響龄毡,放射性物質(zhì)發(fā)生泄漏吠卷。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評(píng)論 3 330
  • 文/蒙蒙 一沦零、第九天 我趴在偏房一處隱蔽的房頂上張望祭隔。 院中可真熱鬧,春花似錦路操、人聲如沸疾渴。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)程奠。三九已至丈牢,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間瞄沙,已是汗流浹背己沛。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留距境,地道東北人申尼。 一個(gè)月前我還...
    沈念sama閱讀 48,247評(píng)論 3 371
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像垫桂,于是被迫代替她去往敵國(guó)和親师幕。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評(píng)論 2 355