HBuilder webApp開發(七)微信/QQ/新浪/騰訊微博分享
HBuilder是支援微信分享(好友和朋友圈),QQ分享,新浪微博和騰訊微博分享。
但是在使用的過程中,官方給的文件似乎很坑爹。
《分享外掛配置》
《分享外掛開發指南》
都是2014年7月發表的文件,後期也沒看見更新說明;有使用者過來提問,就都給引導去看這兩篇文件,真不知道有什麼好看的。
在公司的專案中,實際也使用了分享。昨天下班回去就重新寫了一下程式碼,弄到半夜12點多。
HBuilder的配置
配置許可權
雙加manifest.json檔案,我們需要先配置許可權(預設是有分享許可權的)所以我們只需要再看看核實一下。
配置相關的appkey
開啟manifest.json的SDK配置檢視。
這些appkey我們可以在其他第三方平臺上面獲取做測試。例如ShareSDK。實際專案中需要實際自己公司的。再勾選對應的平臺。檢視程式碼檢視
程式碼視圖裡面我們只需要看看有這些東西就可以了。不需要修改。
基本介面和工作流程
- 介面
介面裡面我已經把存在的問題和解決方案都列出來了。 - 工作流程
點選右上角的分享按鈕,彈出分享檢視,選擇相應的平臺,然後就會跳轉到對應的平臺,分享成功之後就會返回我們的應用,原生應用也是這樣的流程。但是在HBuilder裡面多了一個更新分享服務,也許就相當無原生裡面的註冊吧。詳細可以看看下面的程式碼。
程式碼
程式碼部分註釋都有了,使用流程也會更加清晰。
<html>
<head>
<meta charset="utf-8">
<title>Hello MUI</title>
<meta name="viewport" content="width=device-width, initial-scale=1,maximum-scale=1,user-scalable=no">
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="black">
<!--標準mui.css-->
<link rel="stylesheet" href="../css/mui.min.css">
<link rel="stylesheet" href="../css/mui.css" />
<!--App自定義的css-->
<style type="text/css">
.share {
float: right;
}
.tip-title {
font-size: 20px;
color: blue;
padding-left: 10px;
}
.content {
padding-top: 5px;
padding-bottom: 10px;
padding-left: 10px;
}
.content span {
color: red;
}
</style>
</head>
<body>
<header class="mui-bar mui-bar-nav">
<a class="mui-action-back mui-icon mui-icon-left-nav mui-pull-left"></a>
<a class="share mui-icon mui-icon-redo" onclick="shareHref()"></a>
<h1 class="mui-title">第三方分享</h1>
</header>
<div class="mui-content">
<span class="tip-title">分享平臺:</span><br>
<div class="content">
1.微信分享:微信好友/微信朋友圈 <br>
2.QQ分享 <br>
3.新浪微博分享 <br>
</div>
<span class="tip-title">注意事項:</span><br>
<div class="content">
<span>
微信分享圖片大小不能超過32kb限制 <br>
</span>
</div>
<span class="tip-title">解決辦法:</span><br>
<div class="content">
1.把分享的圖片的url轉換成圖片物件image; <br>
2.把生成的圖片物件image壓縮後上傳伺服器返回新的圖片的url; <br>
3.分享圖片地址使用壓縮上傳後從伺服器獲取的url; <br>
或者:<br>
第一次伺服器返回的圖片的體積就是32kb以下的. <br>
</div>
</div>
</body>
<script src="../js/mui.min.js"></script>
<script src="../js/mui.zoom.js"></script>
<script src="../js/mui.previewimage.js"></script>
<script src="../js/tools.js" ></script>
<script>
mui.init({
swipeBack:true //啟用右滑關閉功能
});
var Intent = null,
File = null,
Uri = null,
main = null;
var shares = null;
var shareImageUrl = '';
mui.plusReady(function() {
updateSerivces();
if (plus.os.name == "Android") {
Intent = plus.android.importClass("android.content.Intent");
File = plus.android.importClass("java.io.File");
Uri = plus.android.importClass("android.net.Uri");
main = plus.android.runtimeMainActivity();
}
})
/**
* 更新分享服務
*/
function updateSerivces() {
plus.share.getServices(function(s) {
shares = {};
for (var i in s) {
var t = s[i];
shares[t.id] = t;
}
outSet("獲取分享服務列表成功");
}, function(e) {
outSet("獲取分享服務列表失敗:" + e.message);
});
}
/**
* 分享操作
*/
function shareAction(id, ex) {
var s = null;
if (!id || !(s = shares[id])) {
outLine("無效的分享服務!");
return;
}
if (s.authenticated) {
outSet("---已授權---");
shareMessage(s, ex);
} else {
outSet("---未授權---");
s.authorize(function() {
shareMessage(s, ex);
}, function(e) {
outLine("認證授權失敗");
});
}
}
/**
* 傳送分享訊息
*/
function shareMessage(s, ex) {
var msg = {
content: '分享-詳情',
href: 'http://blog.csdn.net/zhuming3834',
title: 'HGDQ-分享測試-title',
content: 'HGDQ-分享測試-content',
thumbs: ['http://img3.3lian.com/2013/v10/4/87.jpg'],
pictures: ['http://img3.3lian.com/2013/v10/4/87.jpg'],
extra: {
scene: ex
}
};
s.send(msg, function() {
outLine("分享成功!");
}, function(e) {
outLine("分享失敗!");
});
}
/**
* 分享按鈕點選事件
*/
function shareHref() {
var ids = [{
id: "weixin",
ex: "WXSceneSession" /*微信好友*/
}, {
id: "weixin",
ex: "WXSceneTimeline" /*微信朋友圈*/
}, {
id: "qq" /*QQ好友*/
}, {
id: "tencentweibo" /*騰訊微博*/
},{
id: "sinaweibo" /*新浪微博*/
}],
bts = [{
title: "傳送給微信好友"
}, {
title: "分享到微信朋友圈"
}, {
title: "分享到QQ"
}, {
title: "分享到騰訊微博"
}, {
title: "分享到新浪微博"
}];
plus.nativeUI.actionSheet({
cancel: "取消",
buttons: bts
},
function(e) {
var i = e.index;
if (i > 0) {
shareAction(ids[i - 1].id, ids[i - 1].ex);
}
}
);
}
// 控制檯輸出日誌
function outSet(msg) {
console.log(msg);
}
// 介面彈出吐司提示
function outLine(msg) {
mui.toast(msg);
}
</script>
</html>
實際使用過程中只需要這麼操作就可以了。
遇見的坑
前天晚上在做原生的iOS時,測試給提了一個bug,有的地方可以調起微信分享,有的不行。以前是出現過這關問題,後來其他同事解決了。前天我就有看了一下之前同事的程式碼,發現了裡面的坑。
之前他們的圖片壓縮是使用的:
UIImageJPEGRepresentation(圖片物件,壓縮係數)
// 專案裡面壓縮係數固定是0.01
使用這個方法做的,之前解決了問題。然後前天在分析中發現這個方法有時會把圖片越壓縮體積越大。比如圖片體積只有37kb,壓縮之後可能會有58kb左右,但是對於500+kb的圖片,壓縮之後的圖片體積可以達到32kb以下。(萬惡的微信,萬惡的32kb限制)。
最後分析了一下分享的圖片是在那裡使用的
左邊的小圖,才是分享出去的。
想想之前自己做二維碼(《CoreImage原生二維碼生成(一)》)的時候,使用過的方法。
我的解決辦法是,直接把呼叫上面UIImageJPEGRepresentation壓縮之後的圖片再壓縮成制定尺寸的圖片,然後分享。
/**
* 大圖片壓縮成制定尺寸的圖片
*
* @param img 需要壓縮的圖片
* @param size 目標尺寸
*
* @return 壓縮後的圖片
*/
+ (UIImage *)scaleTosize:(UIImage *)img size:(CGSize)size{
// 建立一個bitmap的context
// 並把它設定成為當前正在使用的context
UIGraphicsBeginImageContext(size);
[img drawInRect:CGRectMake(0, 0, size.width, size.height)];
UIImage *scaledImage = UIGraphicsGetImageFromCurrentImageContext();
return scaledImage;
}
在上面的二維碼生成中我使用的方法大家可以檢視之前的部落格。
然而在HBuilder裡面分享的圖片的url,即使通過url獲取的圖片最終超過32kb也不能使用微信分享。
解決辦法就是:
1.把分享的圖片的url轉換成圖片物件image;
2.把生成的圖片物件image壓縮後上傳伺服器返回新的圖片的url;
3.分享圖片地址使用壓縮上傳後從伺服器獲取的url;
或者:
第一次伺服器返回的圖片的體積就是32kb以下的。
這個微信分享圖片32kb的限制,昨晚坑了我一下,最後在HBuilder官網去找答案,最後無果。後來想想,前天剛剛解決了這個問題,問題,問題是微信對從蘋果手機端分享出去圖片大小的限制,實際在安卓機器上面是沒限制的。
最後
關於效果圖,大家可以去我的github下載檢視,CSDN上傳圖片不能超過2M.
程式碼下載地址:請點選我!
更新日誌:
2016.07.12
應CSDN網友u012155655 要求,增加騰訊微博分享,github程式碼已更新。