友盟集成(十四) —— 分享的工程實踐(一)

版本記錄

版本號 時間
V1.0 2018.06.22

前言

相信很多人用過友盟,包括友盟的第三方登錄、分享以及統(tǒng)計。這里我們就分幾個模塊進(jìn)行詳細(xì)的說明 —— 移動統(tǒng)計(U - App)、網(wǎng)站統(tǒng)計(U - Web)、消息推送(U - Push)、社會化分享(U - Share)、游戲統(tǒng)計(U - Game)、互聯(lián)網(wǎng)運營數(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分享到微博失?。ǘ?/a>
13. 友盟集成(十三) —— 幾個遇到的坑之分享到QQ不顯示縮略圖(三)

分享界面的搭建

這個分享設(shè)計圖如下所示:

這個其實沒什么好說的,就簡單的說幾點吧。

  • 定義一個單獨的View類JJShareMenuView,并設(shè)置代理到直播間VC中。
  • 盡量用xib少用純代碼方式,因為xib更加直觀而且在類中的代碼會很少,看著更加清爽。
  • 別忘記配置白名單,因為iOS9以后就已經(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

具體實現(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:@"分享成功"];
        }
    }];
}

幾個分享中遇到的問題

  1. 解決連續(xù)按鍵分享卡死問題

這里有一個情景就是連續(xù)點擊分享面板進(jìn)行分享,這個是不應(yīng)該這么做的,正確的做法應(yīng)該是點一個平臺進(jìn)行分享,在獲取分享成功還是失敗之前是不應(yīng)該去響應(yīng)再次的點擊的。

這里是在直播間控制器維護(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;
    }
}

后記

本篇主要講述了分享的工程實現(xiàn)以及遇到的幾個問題,感興趣的給個贊或者關(guān)注~~~~

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容