美文网首页iOS转向全栈之路程序员iOS点点滴滴
iOS系统社交化分享,最不该忽略的

iOS系统社交化分享,最不该忽略的

作者: 苛求帅 | 来源:发表于2018-01-26 21:49 被阅读47次

由于iOS 拥有Airdrop的便捷式分享,以及越加复杂化的社交生态圈,越来越多的项目直接使用系统自带的UIActivityViewController 达成社交化分享,并且进行一些列的自定义操作,方便的处理分享功能。刚好项目中有用到,一直以为很简单的东西还是踩了不少的坑,于是拿出来与大家分享下。

简单实现

  • 系统自带的Facebook,Twitter分享,国内有墙的存在,无法唤起app分享,因此使用自定义处理,方便兼容。
  • 其他使用用户安装的APP自带的分享extension足以。

自定义UIActivity

  • 就是显示在分享中的(UIActivityCategoryAction)第二行(UIActivityCategoryShare)第一行,可自定义显示样式(图标、文字)
  • 需要实现系统hook方法
  • activityVC.excludedActivityTypes 属性,过滤自定义实现的分享type 比如
    activityVC.excludedActivityTypes =    @[UIActivityTypePostToFacebook,UIActivityTypePostToTwitter];
    
    • (void)performActivity 点击事件实现
  • 保存shareItems
    - (BOOL)canPerformWithActivityItems:(NSArray *)activityItems
    {
    self.shareItems = activityItems;
    return YES;
    }
    

最终方案:自定义分享使用富媒体(图片,链接、标题共存),Airdrop以及系统其他APP分享 只使用链接

  • 关键方法 YSShareManager.h
// 根据初始化方式 保存临时变量,以实现富媒体分享
@property (copy ,nonatomic,readonly)NSString *imageUrl;
@property (copy ,nonatomic,readonly)NSString *shareText;
@property (strong ,nonatomic,readonly)UIImage *shareImage;
@property (strong ,nonatomic,readonly)NSURL *shareUrl;

/**
 适应Airdrop 分享最低层传递富媒体  中层action以及Airdrop只传递URL

 @param imgUrl image地址
 @param text 文本
 @param urlStr 链接 不能为空
 */
+ (void)shareWithImageUrl:(nullable NSString*)imgUrl
                     text:(nullable NSString *)text
                      url:(nonnull NSString *)urlStr;
                      
/**
 清除临时储存的变量
 */
+ (void)clearShareKit;
  • YSShareManager.m


UIActivityViewControllerCompletionWithItemsHandler myBlock = ^(NSString *activityType,BOOL completed,NSArray *returnedItems,NSError *activityError) {
        
        NSLog(@"activityType :%@", activityType);
        
        if (completed)  {
            
            [FBSDKAppEvents logEvent:[NSString stringWithFormat:@"share_Success_%@",activityType]];
            
        }
        else  {
            [FBSDKAppEvents logEvent:[NSString stringWithFormat:@"share_Failed_%@",activityType]];
        }
        分享反馈中清空临时保存的变量
        [self clearShareKit];
    };

使用方式

初始化

  • 在appdelegate中或者在分享所在控制器实现添加对应的自定义分享
/**
 添加制定类型分享  控制分享处理方式

 @param option 类型枚举 单个添加
 @param perform 分享动作预设(要做啥子事情)
 */
+ (void)configShareKitAddOneActivityWithType:(YSShareOptionType)type
                             handleBlock:(SharePerform)perform;
/**
 自己去实现 自定义分享  优先级比较上面的type高  两者共存 自定义UIActivity子类使用此方法

 @param activities 自定义分享实例
 */
+ (void)configShareKitWithCustomActivities:(nullable NSArray <UIActivity *>*)activities;
  • 在回调函数中选择使用相应的所需参数,自定义实现规则
YSWeakSelf(self);
    [YSShareManager configShareKitAddOneActivityWithType:YSShareOptionTypeFaceBook handleBlock:^(NSArray * _Nonnull shareItems) {
        [weakself shareToFaceBookWithItems:shareItems];
    }];
  • 举个栗子
 在我们项目中Home页面加载后初始化分享配置
- (void)shareToFaceBookWithItems:(NSArray *)shareItems
{
    //判断服务是否可用
    NSString *shareText = [BGLShareManager shareManager].shareText;
    NSURL *shareURL = [BGLShareManager shareManager].shareUrl;
    UIImage *shareImg = [BGLShareManager shareManager].shareImage;
    
    [FBSDKAppEvents logEvent:@"Share to Facebook"];
    ......
    
}

在详情页发起分享
- (void)clickShareBtnAct:(id)sender{
        // 适配iPad的分享
    [BGLShareManager shareManager].sharePositionView = sender;
    
    NSString *imageUrl = [_bannerImageUrlArr objectAtIndex:_bigImageShowView.currentItemIndex];
    [BGLShareManager shareWithImageUrl:imageUrl text:_pName url:urlStr];
}

爬过的坑

关于Airdrop

  • 不支持图片和 URL 、文字 多种媒体同时传递

  • 单一传递图片时,直接保存到图片浏览器

  • 单一传递URL时,默认打开浏览器,可以使用APP的scheme或者短链接定向打开应用 ,使用- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication 可以接收URL,进行内部处理

  • 单一传递NSString时 自动转换为txt 使用app有注册txt格式app列表打开

针对iPad

由于显示样式完全不同于手机,需要单独处理,发起分享前设置sharePositionView

if (UI_USER_INTERFACE_IDIOM()  == UIUserInterfaceIdiomPhone) {
        [[UIApplication sharedApplication].keyWindow.rootViewController presentViewController:activityVC animated:YES completion:nil];
    }else{
        UIPopoverPresentationController *popover = activityVC.popoverPresentationController;
        if (popover) {
            popover.sourceView = [BGLShareManager  shareManager].sharePositionView;
            popover.permittedArrowDirections = UIPopoverArrowDirectionAny;
        }
        
        [[UIApplication sharedApplication].keyWindow.rootViewController presentViewController:activityVC animated:YES completion:NULL];
    }

短信分享界面不显示取消按钮

项目中可能存在第三方文件
UINavigationController+FDFullscreenPopGesture.m 使用了runtime

  • 解决方案1 :一刀切,这个第三方库已经不再实用新系统
  • 解决方案2 :修改,删除了pod管理这个第三库,手动修改部分过滤条件
    - (void)fd_pushViewController:(UIViewController *)viewController animated:(BOOL)animated
    {
        //过滤MessageUI,并且添加取消按钮
    if ([self isKindOfClass:[MFMessageComposeViewController class]]) {
        [self fd_pushViewController:viewController animated:animated];
        [[self.viewControllers lastObject] navigationItem].rightBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCancel target:self action:@selector(dismissModal:)];
        return;
    }
    }
    

分享功能虽不复杂,但着实资料无多,大多复制粘贴,不如真实使用之后的实践。文采有限,希望君阅之有所收获。

相关文章

  • iOS系统社交化分享,最不该忽略的

    由于iOS 拥有Airdrop的便捷式分享,以及越加复杂化的社交生态圈,越来越多的项目直接使用系统自带的UIAct...

  • iOS12系统应用开发基础教程发送邮件

    iOS12系统应用开发基础教程发送邮件 消息分享是应用社交化和营销的重要途径。除了开发者自己搭建专有的消息分享渠道...

  • iOS系统自带社交分享

    本文针对系统自带的社交分享 目前基本上都舍弃不用了 不如shareSDK 或者友盟的好用 大体步骤如下: >1.引...

  • iOS 系统自带分享,社交分享,复制粘贴,屏幕亮度

    iOS 系统自带分享,社交分享,复制粘贴,屏幕亮度 都是一些系统自带的东西,可以简单的实现一些功能,不是主流的,但...

  • 自动化专业

    专业分享—自动化(工学) 理科报考,文科忽略 1专业介绍: 自动化主要研究电子技术、自动控制、系统...

  • 社交分享

    社交分享 1. 什么是社交分享, 有什么作用? 2. 社交分享的实现方案 系统自带社交分享// 1. 导入Soci...

  • iOS逆向(二)-系统文件层次结构介绍

    可视化方式查看iOS系统文件可视化查看app系统文件方式很多== 在iOS通过Cydia安装Apple File ...

  • iOS 社交分享

    社交分享 苹果系统自带分享 第三方分享 了解 比较火的分享平台 微信 - 是国内唯一一款没有PC原型的软件 新浪微...

  • IOS 社交分享

    很多App中都有个“社交分享”的功能通过用户的分享,让更多的人去了解和使用这个App目前移动互联网应用程序推广的最...

  • 3. iOS文件系统结构

    iOS文件系统结构 可视化方式查看iOS系统文件在iOS通过Cydia安装Apple File Conduit 2...

网友评论

    本文标题:iOS系统社交化分享,最不该忽略的

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