美文网首页iOS开发文章库移动开发之——界面开发友盟
iOS分享---使用友盟分享(自定义分享面板)

iOS分享---使用友盟分享(自定义分享面板)

作者: 倾兰特 | 来源:发表于2017-01-11 16:15 被阅读6181次

在新的项目中,需要实现分享功能,比较后接入友盟分享。友盟分享的使用文档以及常见问题都非常的详细,接入也较为简单。只是分享面板与我们的App风格不太相符,所以自定义了一个分享面板。

项目地址在这里

实现的过程

1. ShareView

  • .h文件中,主要属性及初始化方法
//  点击按钮block回调
@property (nonatomic,copy) void(^btnClick)(NSInteger);

//  头部提示文字
@property (nonatomic,copy) NSString *proStr;

//  设置弹窗背景蒙板灰度(0~1)
@property (nonatomic,assign) CGFloat duration;

/**
 *  初始化
 *
 *  @param titleArray 标题数组
 *  @param imageArray 图片数组(如果不需要的话传空数组(@[])进来)
 *  @param proTitle   最顶部的标题  不需要的话传@""
 *
 *  @return ShareView
 */

- (instancetype)initWithShareHeadOprationWith:(NSArray *)titleArray andImageArry:(NSArray *)imageArray andProTitle:(NSString *)proTitle;
  • 初始化时,为视图添加手势,设置背景蒙板灰度,加载自定义视图
- (instancetype)initWithShareHeadOprationWith:(NSArray *)titleArray andImageArry:(NSArray *)imageArray andProTitle:(NSString *)proTitle {
    
    self = [super init];
    if (self) {
        
        _shareBtnTitleArray = titleArray;
        _shareBtnImageArray = imageArray;
        _protext = proTitle;
        
        self.frame = CGRectMake(0, 0, ScreenWidth, ScreenHeight);
        //  背景,带灰度
        self.backgroundColor = WINDOW_COLOR;
        //  可点击
        self.userInteractionEnabled = YES;
        //  点击背景,收起底部分享面板,移除本视图
        UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tappedCancel)];
        [self addGestureRecognizer:tapGesture];
        
        //  加载分享面板
        [self loadUIConfig];
    }
    return self;
}

  • 加载视图,依次添加分享的按钮,视图显示时,主要分享面板从底部弹出
/**
 加载自定义视图,按钮的tag依次为(200 + i)
 */
- (void)loadUIConfig {
    
    [self addSubview:self.bgView];
    [self.bgView addSubview:self.topSheetView];
    [self.bgView addSubview:self.cancelBtn];
    
    self.proLbl.text = _protext;
    //  按钮
    for (NSInteger i = 0; i < self.shareBtnTitleArray.count; i++) {
        
        CGFloat x = self.bgView.bounds.size.width / 3 * ( i % 3);
        CGFloat y = LABEL_HEIGHT + (i / 3) * LINE_HEIGHT;
        CGFloat w = self.bgView.bounds.size.width / 3;
        CGFloat h = 70;
        
        CGRect frame =  CGRectMake(x, y, w, h);
        ImageWithLabel *item = [ImageWithLabel imageLabelWithFrame:frame Image:[UIImage imageNamed:self.shareBtnImageArray[i]] LabelText:self.shareBtnTitleArray[i]];
        item.labelOffsetY = 6;
        
        item.tag = 200 + i;
        UITapGestureRecognizer *tapGes = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(itemClick:)];
        [item addGestureRecognizer:tapGes];
        [self.topSheetView addSubview:item];
        
        [self.buttons addObject:item];
    }
    //  弹出
    [UIView animateWithDuration:ANIMATE_DURATION animations:^{
        self.bgView.frame = CGRectMake(0, ScreenHeight - CGRectGetHeight(self.bgView.frame), ScreenWidth, CGRectGetHeight(self.bgView.frame));
    }];
    
    //  icon 动画
    [self iconAnimation];
}

  • 背景面板(这是一排三个的设计,个人认为更好看一些,由于本次分享平台较少,并没有限制高度或者做多高之后可以滚动。。。)
- (UIView *)bgView {
    
    if (_bgView == nil) {
        
        _bgView = [[UIView alloc] init];
        
        //  根据图标个数,计算行数,计算 backgroundView 的高度
        NSInteger index;
        if (_shareBtnTitleArray.count % 3 == 0) {
            
            index = _shareBtnTitleArray.count / 3;
        } else {
            
            index = _shareBtnTitleArray.count / 3 + 1;
        }
        _bgView.frame = CGRectMake(0, ScreenHeight, ScreenWidth, BUTTON_HEIGHT + (_protext.length == 0 ? 0 : 45) + LINE_HEIGHT * index);
    }
    return _bgView;
}
  • 点击背景面板或者取消按钮
/**
 点击取消
 */
- (void)tappedCancel {
    
    [UIView animateWithDuration:ANIMATE_DURATION animations:^{
        [self.bgView setFrame:CGRectMake(0, ScreenHeight, ScreenWidth, 0)];
        self.alpha = 0;
    } completion:^(BOOL finished) {
        if (finished) {
            [self removeFromSuperview];
        }
    }];
}

  • 这是一个借用了 Facebook 开源框架写的图标弹出动画,有点像今日头条的分享面板(😳)。代码简洁效果炫酷,你值得拥有(😬)。
/**
 做一个 icon 依次粗线的弹簧动画
 */
- (void)iconAnimation {
    
    CGFloat duration = 0;
    
    for (UIView *icon in self.buttons) {
        CGRect frame = icon.frame;
        CGRect toFrame = icon.frame;
        frame.origin.y += frame.size.height;
        icon.frame = frame;
        
        POPSpringAnimation *animation = [POPSpringAnimation animationWithPropertyNamed:kPOPViewFrame];
        animation.toValue = [NSValue valueWithCGRect:toFrame];
        animation.beginTime = CACurrentMediaTime() + duration;
        animation.springBounciness = 10.0f;
        
        [icon pop_addAnimation:animation forKey:kPOPViewFrame];
        
        duration += 0.07;
    }
}

2. 创建与配置

  • 判断设备中是否安装了要分享的平台对应的App(微博平台不用判断):
BOOL hadInstalledWeixin = [[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"weixin://"]];
BOOL hadInstalledQQ = [[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"mqq://"]];
  • 将安装的了App对应的图标和标题放入数组;

  • 实现 Button 点击的 Block 回调(例),回调的方法里根据不同的 type 设置不同的分享内容:

case 0: {
    // 微信
    [self shareTextToPlatformType:UMSocialPlatformType_WechatSession shareType:type model:model];
}
  • 将分享面板展示:
[[UIApplication sharedApplication].keyWindow addSubview:shareView];

3. 区分不同的平台,设置分享内容

  • 创建分享消息对象(U-Share SDK类):
UMSocialMessageObject *messageObject = [UMSocialMessageObject messageObject];
//设置文本
messageObject.text = @"";
  • 分享多媒体对象,例分享网页(U-Share SDK方法):
UMShareWebpageObject *webPageObject = [UMShareWebpageObject shareObjectWithTitle:model.title descr:model.detail thumImage:model.thumImage];
webPageObject.webpageUrl = model.url;
messageObject.shareObject = webPageObject;
  • 调用分享接口(U-Share SDK方法)
[[UMSocialManager defaultManager] shareToPlatform:platformType messageObject:messageObject currentViewController:self completion:^(id data, NSError *error) {
    if (error) {
        Log(@"************Share fail with error %@*********",error);
        [SVProgressHUD showErrorWithStatus:@"分享失败"];
        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
            [SVProgressHUD dismiss];
        });
    }else{
        Log(@"response data is %@",data);
        [SVProgressHUD showSuccessWithStatus:@"分享成功"];
        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
            [SVProgressHUD dismiss];
        });
    }
}];

4. 外部调用

ShareModel *model = [ShareModel shareAppModel];
// 分享
[CommonUtils shareBoardBySelfDefinedWithType:ShareTypeApp model:model];

实现的效果

这 个 尺 寸 非 常 的 完 美.png

遇到的问题

  1. 最开始配置好各个分享平台的 URL Scheme 之后,分享功能仍然无法正常使用,经检查是因为 iOS 9 的白名单问题。加入后解决。
  2. 由于是自定义的分享面板,在调用时需要判断当前设备中是否安装了相应的平台的应用,如 QQ、Wechat等。如果当前设备中没有安装某个应用而面板中带有该平台的分享图标,在 App 审核时可能不会被通过。友盟自带的分享面板已经做过这层判断。

相关文章

  • 友盟分享

    友盟分享1、引入头文件 2、遵循协议 3、开始分享分为两种情况:一是系统自带的分享面板,二是自定义分享面板。使用友...

  • iOS分享---使用友盟分享(自定义分享面板)

    在新的项目中,需要实现分享功能,比较后接入友盟分享。友盟分享的使用文档以及常见问题都非常的详细,接入也较为简单。只...

  • 使用友盟分享时,不弹出自带分享面板

    使用友盟分享的默认分享面板不弹出,我遇到的原因是因为storyboard与AppDelegate中代码设置的UIW...

  • 2019-01-16

    iOS友盟分享面板无法弹出问题 - 简书

  • 友盟分享

    使用友盟分享的过程中,发现一个坑,照着官方文档进行,调用分享面板的代码,如下 打开的面板中,点击QQ是会出现200...

  • 友盟图片分享与自定义分享按钮

    本章介绍两点: 1. 图片分享 2. 自定义分享按钮 最近在用友盟分享时,发现图片分享并没有详细的介绍,本次就把友...

  • 友盟分享qq错误码:9001007

    用友盟集成QQ分享,遇到QQ好友分享提示 第三方app没有权限 错误码:9001007 iOS上线发布后,才能正常...

  • 友盟分享朋友圈分享失败微信好友分享可以

    最近做分享集成了友盟的分享模块,分享页面是自己做的没有用友盟自己的,我的分享就是分享一个图片,微信朋友可以分享,但...

  • 友盟分享

    导入库 UMengSocialCOM 在app启动时进行初始化 调用分享功能 自定义页面分享教程 iOS 友盟登录和分享

  • 友盟分享弹不出控制面板

    问题:使用友盟分享时 控制面板弹不出来 没有反应 解决方法: 删除Main.storybord 将info里面对应...

网友评论

  • okios:为什么微博的不用判断是否已安装呢?
  • minjing_lin:哇哦,针对是否安装对应的视图,准备自己写个那,看到你的不总自己造轮子了,哈哈:smile:
  • JohnayXiao:代码写得太棒了!不过好像有个逻辑bug哦,如果你的手机上装了微信,而没有装QQ的话,那么问题就来了。这时当你点微信图标时,代码会执行QQ的分享操作哦!
    JohnayXiao:@倾兰特 哈哈,我应该感谢你才是,站在你的肩膀上我节省了不少时间:smile:
    倾兰特:@JohnayXiao 非常感谢指出,之前确实没有注意到,已经改正,代码稍后提交。再次感谢~
  • vivianny_7899:露珠,你的demo地址打不开啊啊啊!!
    倾兰特:我打得开啊😯。。
  • Polo1004:怎么判断做软件安装这层判断啊 我也是自定义的分享
    旭丶Joy:
    BOOL hadInstalledWeixin = [[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"weixin://"]];
    BOOL hadInstalledQQ = [[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"mqq://"]];
  • jian建:友盟没有这个方法 [self shareTextToPlatformType:UMSocialPlatformType_WechatSession shareType:type model:model];
    jian建:@倾兰特 我也是按照你这个方法写的,谢谢
    倾兰特:@jian建 这是自己写的方法,方法里是分类别调起友盟
    jian建:qq 1374265636
  • RhythmMaster:有没有demo,给个地址,谢谢
    vivianny_7899:@倾兰特 打不开 快看看
    倾兰特:加到文章头部了。
  • 旭丶Joy:真可爱.厉害
    倾兰特:。。。秒回复?

本文标题:iOS分享---使用友盟分享(自定义分享面板)

本文链接:https://www.haomeiwen.com/subject/dgfopttx.html