版本记录
版本号 | 时间 |
---|---|
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不显示缩略图(三)
分享界面的搭建
这个分享设计图如下所示:
这个其实没什么好说的,就简单的说几点吧。
- 定义一个单独的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:@"分享成功"];
}
}];
}
几个分享中遇到的问题
- 解决连续按键分享卡死问题
这里有一个情景就是连续点击分享面板进行分享,这个是不应该这么做的,正确的做法应该是点一个平台进行分享,在获取分享成功还是失败之前是不应该去响应再次的点击的。
这里是在直播间控制器维护一个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;
}
}
后记
本篇主要讲述了分享的工程实现以及遇到的几个问题,感兴趣的给个赞或者关注~~~~