iOS转向全栈之路程序员iOS点点滴滴

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

2018-01-26  本文已影响47人  苛求帅

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

简单实现

自定义UIActivity

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

// 根据初始化方式 保存临时变量,以实现富媒体分享
@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;


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];
    };

使用方式

初始化

/**
 添加制定类型分享  控制分享处理方式

 @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

针对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

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

上一篇 下一篇

猜你喜欢

热点阅读