友盟集成(十四) —— 分享的工程实践(一)

版本记录

版本号 时间
V1.0 2018.06.22

前言

相信很多人用过友盟,包括友盟的第三方登录、分享以及统计。这里我们就分几个模块进行详细的说明 —— 移动统计(U - App)、网站统计(U - Web)、消息推送(U - Push)、社会化分享(U - Share)、游戏统计(U - Game)、互联网运营数据服务(Dplus) - 多维度、一站式、精细化数据管理服务。感兴趣的可以看上面几篇。
1. 友盟集成(一) —— UShare模块之快速集成(一)
2. 友盟集成(二) —— UShare模块之快速集成(二)
3. 友盟集成(三) —— UShare模块之第三方登录(一)
4. 友盟集成(四) —— UShare模块之进阶说明之第三方平台SDK说明(一)
5. 友盟集成(五) —— UShare模块之进阶说明之分享到第三方平台(二)
6. 友盟集成(六) —— UShare模块之进阶说明之分享面板UI(三)
7. 友盟集成(七) —— UShare模块之进阶说明之自定义平台(四)
8. 友盟集成(八) —— UShare模块之进阶说明之U-Share API说明(五)
9. 友盟集成(九) —— UShare模块之UShare常见问题 (六)
10. 友盟集成(十) —— UShare模块之UShare日志说明 (七)
11. 友盟集成(十一) —— 几个遇到的坑之QQ授权名称的设置(一)
12. 友盟集成(十二) —— 几个遇到的坑之HTTP分享到微博失败(二)
13. 友盟集成(十三) —— 几个遇到的坑之分享到QQ不显示缩略图(三)

分享界面的搭建

这个分享设计图如下所示:

友盟集成(十四) —— 分享的工程实践(一)_第1张图片

这个其实没什么好说的,就简单的说几点吧。

  • 定义一个单独的View类JJShareMenuView,并设置代理到直播间VC中。
  • 尽量用xib少用纯代码方式,因为xib更加直观而且在类中的代码会很少,看着更加清爽。
  • 别忘记配置白名单,因为iOS9以后就已经要求这么做了。
  • 别忘记配置URL scheme,在Info - URL Types,这个不同平台配置方式不同,具体怎么配置,在三方登录的时候已经说过了。

视图层次没什么好说的,就这些吧。


模型的创建

在分享前我们需要从服务端拉取数据,拉取数据以后需要转化为我们客户端分享需要的数据类型。

这里新建一个类JJShareModel,在这里面进行数据转换,转换后的数据就是待分享的数据。

#import 

@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

具体实现就不多说了,就是将传入的字典以及直播间的Feed流通过处理为该类的属性赋值,获取对应的待分享数据。


开始分享

这里采用一个单例,管理分享和友盟之间的对接,以及从自己的服务端下载数据。

首先根据不同分享类型,构建出不同的分享数据。

// 获取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;
}

接着,调用友盟的方法,进行分享

// 总的方法,根据分享平台、类型以及数据模型进行分享
- (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];
    
    //调用分享接口
    [[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. 解决连续按键分享卡死问题

这里有一个情景就是连续点击分享面板进行分享,这个是不应该这么做的,正确的做法应该是点一个平台进行分享,在获取分享成功还是失败之前是不应该去响应再次的点击的。

这里是在直播间控制器维护一个BOOL属性值。

@property (nonatomic, assign) BOOL isShareing;

在分享的代理方法中,加上这段代码

if (self.isShareing == YES) {
    return;
}
self.isShareing = YES;

然后接受分享成功或者失败的通知,在通知方法里面重置状态

//分享成功
- (void)shareSuccessNotification
{
    self.isShareing = NO;
}

//分享失败
- (void)shareFailureNotification
{
    self.isShareing = NO;
}

这就可以了吗,不可以,有的时候我们会按Home键从QQ等平台回到我们的APP这时候没有重置状态isShareing还是YES,这样我们就没办法进行第二次分享了。

所以要在下面这个方法中重置状态

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onApplicationNotification:) name:UIApplicationDidBecomeActiveNotification object:nil];

- (void)onApplicationNotification:(NSNotification *)notify 
{    
    if(notify.name == UIApplicationDidBecomeActiveNotification) {
        self.isShareing = NO;
    }
}

后记

本篇主要讲述了分享的工程实现以及遇到的几个问题,感兴趣的给个赞或者关注~~~~

友盟集成(十四) —— 分享的工程实践(一)_第2张图片

你可能感兴趣的:(友盟集成(十四) —— 分享的工程实践(一))