本系列博客是本人的開發筆記。爲了方便討論,本人新建了一個微信羣(iOS技術討論羣),想要加入的,請添加本人微信:zhujinhui207407,【加我前請備註:iOS 】,本人博客http://www.kyson.cn 也在不停的更新中,歡迎一起討論
背景
首先我們來看一下分享的展示頁面,一般來說是個H5:
如果我們使用了WebViewJavascriptBridge 那麼一個簡單的註冊方法應該是這樣的:
//執行分享
[self.webViewJSbridge registerHandler:@"ios_showSharePage" handler:^(id data, WVJBResponseCallback responseCallback) {
//這裏填寫分享的邏輯
}];
其中ios_showSharePage
是我們Native和H5約定的js方法。調用我們的方法後,一般會展示出一個如下的分享小提示框:
問題提出
點擊任何一個我們跳轉至相應的平臺分享即可。一開始我們通過這種方式非常愉快的進行着迭代,可是突然有一天產品經理覺得寫死不夠靈活,希望我們支持根據後臺的參數來決定展示哪幾個分享平臺。又後來一個產品覺得點擊去分享,再彈ActionSheet需要用戶點擊兩次,比較麻煩,希望我們能通過一次點擊就能實現分享。於是我們好好梳理了一下這兩個需求,提出如下解決方案:
- H5直接給出需要分享的平臺,我們這邊再註冊相應的方法即可
- 與後端商定好所有可能的分享平臺,並約定好相應參數即可。
解決方案
對於第一個問題,我們讓H5直接出一個如下的頁面:
在原先的註冊方法中給予參數,從而讓我們調起相應的平臺即可:
上圖給出了H5的
data
中傳進來的參數,可能看的不是很清楚,這裏打印一下給大家看看:
{
shareType = 2,
channels = (
"wx_moment"
),
thumbUrl = "https://fe.xxxx.cn/marigold/x.0.0/images/xinvitation/share_icon_newx.png",
shareUrl = "https://mp.xxxx.cn/growth/activityx/transporter/register?channel=invite_url&type=transporter#/invitation/login?inviteCode=644599&inviterName=%E6%9D%8E%E5%AE%87%E6%98%A5",
title = "邀請您和我一起做達達騎士,首單額外獎8元現金!",
content = "加入達達騎士成爲衆包配送員,時間自由,多種訂單可選,助您輕鬆月入萬元。"
}
裏面的部分信息打碼處理了,還望大家見諒。
這裏的shareType、channels等參數這裏做個統一解釋:
1.shareType
分享類型
typedef enum : NSUInteger {
/// 文本
DDShareTypeText = 0,
/// 圖片
DDShareTypePicture = 1,
/// 鏈接
DDShareTypeLink = 2,
/// 小程序
DDShareTypeMiniProgram = 3,
/// 拉起小程序
DDShareTypeLaunchMiniProgram = 4,
} DDShareType; // 支持的分享內容
2.channels
分享平臺,有以下幾種:
wx_session/wx_moment/sms/qq
相信不用做過多解釋。當然,我們也在本地寫了相應枚舉來定義:
typedef enum : NSUInteger {
/// 短信
DDSharePlatformSMS = 1,
/// 微信好友
DDSharePlatformWXSession = 2,
/// 微信朋友圈
DDSharePlatformWXTimeline = 3,
/// QQ好
DDSharePlatformQQ = 4,
/// QQ空間
DDSharePlatformQzone,
} DDSharePlatfrom; // 支持的分享平臺
寫字符串是爲了幫助H5理解,我們可以在本地解析寫一個轉換函數將字符串轉爲對應的channel。
3.thumbUrl
縮略圖URL,這個相信大家不陌生。不過大家需要注意的是,一般需要將thumbUrl轉換爲NSData類型來使用,因此我們轉換一下即可:
NSData *thumbData = [NSData dataWithContentsOfURL:[NSURL URLWithString:thumbURL]];
4.shareUrl
分享的URL
5.title
分享的標題
6.content
分享的內容
我們拿到如上data後,可以對data進行相應的處理了: