版本記錄
版本號 | 時間 |
---|---|
V1.0 | 2018.06.22 |
前言
相信很多人用過友盟瞧挤,包括友盟的第三方登錄锡宋、分享以及統(tǒng)計(jì)。這里我們就分幾個模塊進(jìn)行詳細(xì)的說明 —— 移動統(tǒng)計(jì)
(U - App)
特恬、網(wǎng)站統(tǒng)計(jì)(U - Web)
执俩、消息推送(U - Push)
、社會化分享(U - Share)
癌刽、游戲統(tǒng)計(jì)(U - Game)
役首、互聯(lián)網(wǎng)運(yùn)營數(shù)據(jù)服務(wù)(Dplus)
- 多維度、一站式显拜、精細(xì)化數(shù)據(jù)管理服務(wù)衡奥。感興趣的可以看上面幾篇。
1. 友盟集成(一) —— UShare模塊之快速集成(一)
2. 友盟集成(二) —— UShare模塊之快速集成(二)
3. 友盟集成(三) —— UShare模塊之第三方登錄(一)
4. 友盟集成(四) —— UShare模塊之進(jìn)階說明之第三方平臺SDK說明(一)
5. 友盟集成(五) —— UShare模塊之進(jìn)階說明之分享到第三方平臺(二)
6. 友盟集成(六) —— UShare模塊之進(jìn)階說明之分享面板UI(三)
7. 友盟集成(七) —— UShare模塊之進(jìn)階說明之自定義平臺(四)
8. 友盟集成(八) —— UShare模塊之進(jìn)階說明之U-Share API說明(五)
9. 友盟集成(九) —— UShare模塊之UShare常見問題 (六)
10. 友盟集成(十) —— UShare模塊之UShare日志說明 (七)
11. 友盟集成(十一) —— 幾個遇到的坑之QQ授權(quán)名稱的設(shè)置(一)
12. 友盟集成(十二) —— 幾個遇到的坑之HTTP分享到微博失斣盾(二)
13. 友盟集成(十三) —— 幾個遇到的坑之分享到QQ不顯示縮略圖(三)
分享界面的搭建
這個分享設(shè)計(jì)圖如下所示:
這個其實(shí)沒什么好說的矮固,就簡單的說幾點(diǎn)吧。
- 定義一個單獨(dú)的View類
JJShareMenuView
譬淳,并設(shè)置代理到直播間VC中档址。 - 盡量用xib少用純代碼方式,因?yàn)閤ib更加直觀而且在類中的代碼會很少邻梆,看著更加清爽守伸。
- 別忘記配置白名單,因?yàn)閕OS9以后就已經(jīng)要求這么做了浦妄。
- 別忘記配置
URL scheme
尼摹,在Info - URL Types
,這個不同平臺配置方式不同校辩,具體怎么配置窘问,在三方登錄的時候已經(jīng)說過了。
視圖層次沒什么好說的宜咒,就這些吧惠赫。
模型的創(chuàng)建
在分享前我們需要從服務(wù)端拉取數(shù)據(jù),拉取數(shù)據(jù)以后需要轉(zhuǎn)化為我們客戶端分享需要的數(shù)據(jù)類型故黑。
這里新建一個類JJShareModel
儿咱,在這里面進(jìn)行數(shù)據(jù)轉(zhuǎn)換,轉(zhuǎn)換后的數(shù)據(jù)就是待分享的數(shù)據(jù)场晶。
#import <Foundation/Foundation.h>
@interface JJShareModel : NSObject
@property (nonatomic, copy) NSString *urlStr;
@property (nonatomic, copy) NSString *titleStr;
@property (nonatomic, copy) NSString *descStr;
@property (nonatomic, copy) NSString *text; //對于純文本文本不能為空混埠,否則失敗
@property (nonatomic, copy) NSString *imageStr;
@property (nonatomic, copy) NSString *thumbImageStr;
@property (nonatomic, assign) BOOL isSwitchOn;
- (instancetype)initWithDict:(NSDictionary *)dict feed:(JJFeed *)feed;
@end
具體實(shí)現(xiàn)就不多說了,就是將傳入的字典以及直播間的Feed流通過處理為該類的屬性賦值诗轻,獲取對應(yīng)的待分享數(shù)據(jù)钳宪。
開始分享
這里采用一個單例,管理分享和友盟之間的對接,以及從自己的服務(wù)端下載數(shù)據(jù)吏颖。
首先根據(jù)不同分享類型搔体,構(gòu)建出不同的分享數(shù)據(jù)。
// 獲取messageObject對象
- (UMSocialMessageObject *)gainMessageObjectWithType:(UMSocialPlatformType)platformType model:(JJShareModel *)shareModel shareType:(JJShareToolType)shareType
{
UMSocialMessageObject *messageObject = [UMSocialMessageObject messageObject];
messageObject.text = shareModel.text;
messageObject.title = shareModel.titleStr;
switch (shareType) {
// 純文本分享
case JJShareToolType_Text:
{
messageObject.text = shareModel.text;
}
break;
// 分享圖片
case JJShareToolType_Image:
{
UMShareImageObject *shareObject = [[UMShareImageObject alloc] init];
shareObject.thumbImage = _To_Str(shareModel.thumbImageStr);
[shareObject setShareImage:shareModel.imageStr];
// notice:非https的不能分享圖片半醉,受三方和蘋果政策
// shareObject.thumbImage = @"https://thirdqq.qlogo.cn/qqapp/101477482/214274B4C4204F99A8813FBF36C4504B/40";
// [shareObject setShareImage:@"https://thirdqq.qlogo.cn/qqapp/101477482/214274B4C4204F99A8813FBF36C4504B/40"];
messageObject.shareObject = shareObject;
}
break;
// 分享圖文 只有新浪支持疚俱,微信/QQ僅支持圖或文本分享
case JJShareToolType_ImageAndText:
{
UMShareImageObject *shareObject = [[UMShareImageObject alloc] init];
shareObject.thumbImage = _To_Str(shareModel.thumbImageStr);
[shareObject setShareImage:_To_Str(shareModel.imageStr)];
messageObject.shareObject = shareObject;
}
break;
// Web鏈接,主流的都支持這個類型
case JJShareToolType_Web:
{
UMShareWebpageObject *shareObject = [UMShareWebpageObject shareObjectWithTitle:shareModel.titleStr descr:shareModel.descStr thumImage:shareModel.thumbImageStr];
shareObject.webpageUrl = shareModel.urlStr;
messageObject.shareObject = shareObject;
}
break;
// 音樂鏈接缩多,主流的都支持這種類型
case JJShareToolType_Music:
{
UMShareMusicObject *shareObject = [UMShareMusicObject shareObjectWithTitle:shareModel.titleStr descr:shareModel.descStr thumImage:shareModel.thumbImageStr];
shareObject.musicUrl = shareModel.urlStr;
messageObject.shareObject = shareObject;
}
break;
// 視頻鏈接呆奕,主流的都支持這種類型
case JJShareToolType_Video:
{
UMShareVideoObject *shareObject = [UMShareVideoObject shareObjectWithTitle:shareModel.titleStr descr:shareModel.descStr thumImage:shareModel.thumbImageStr];
shareObject.videoUrl = shareModel.urlStr;
messageObject.shareObject = shareObject;
}
break;
default:
break;
}
return messageObject;
}
接著,調(diào)用友盟的方法衬吆,進(jìn)行分享
// 總的方法梁钾,根據(jù)分享平臺、類型以及數(shù)據(jù)模型進(jìn)行分享
- (void)shareToPlatformWithType:(JJSharePlatformType)platformType model:(JJShareModel *)shareModel shareType:(JJShareToolType)shareType
{
UMSocialPlatformType umPlatformType = [self convertMyTypeToUMPlatformType:platformType];
if (umPlatformType == UMSocialPlatformType_UnKnown || shareModel == nil || shareType == JJShareToolType_Unknown) {
return;
}
UMSocialMessageObject *messageObject = [self gainMessageObjectWithType:umPlatformType model:shareModel shareType:shareType];
//調(diào)用分享接口
[[UMSocialManager defaultManager] shareToPlatform:umPlatformType messageObject:messageObject currentViewController:nil completion:^(id data, NSError *error) {
if (error) {
[[NSNotificationCenter defaultCenter] postNotificationName:kNotification_ShareFailure object:nil];
[JJToastManager showToast:@"分享失敗"];
}
else{
[[NSNotificationCenter defaultCenter] postNotificationName:kNotification_ShareSuccess object:nil];
[JJToastManager showToast:@"分享成功"];
}
}];
}
幾個分享中遇到的問題
- 解決連續(xù)按鍵分享卡死問題
這里有一個情景就是連續(xù)點(diǎn)擊分享面板進(jìn)行分享逊抡,這個是不應(yīng)該這么做的陈轿,正確的做法應(yīng)該是點(diǎn)一個平臺進(jìn)行分享,在獲取分享成功還是失敗之前是不應(yīng)該去響應(yīng)再次的點(diǎn)擊的秦忿。
這里是在直播間控制器維護(hù)一個BOOL屬性值。
@property (nonatomic, assign) BOOL isShareing;
在分享的代理方法中蛾娶,加上這段代碼
if (self.isShareing == YES) {
return;
}
self.isShareing = YES;
然后接受分享成功或者失敗的通知灯谣,在通知方法里面重置狀態(tài)
//分享成功
- (void)shareSuccessNotification
{
self.isShareing = NO;
}
//分享失敗
- (void)shareFailureNotification
{
self.isShareing = NO;
}
這就可以了嗎,不可以蛔琅,有的時候我們會按Home鍵從QQ等平臺回到我們的APP這時候沒有重置狀態(tài)isShareing還是YES胎许,這樣我們就沒辦法進(jìn)行第二次分享了。
所以要在下面這個方法中重置狀態(tài)
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onApplicationNotification:) name:UIApplicationDidBecomeActiveNotification object:nil];
- (void)onApplicationNotification:(NSNotification *)notify
{
if(notify.name == UIApplicationDidBecomeActiveNotification) {
self.isShareing = NO;
}
}
后記
本篇主要講述了分享的工程實(shí)現(xiàn)以及遇到的幾個問題罗售,感興趣的給個贊或者關(guān)注~~~~