(0098)iOS开发之应用间的分享系列(3)

(0096)iOS开发之应用间的分享系列(1)
(0097)iOS开发之应用间的分享系列(2)

前两篇都是讲的分别是
将自己的应用添加到系统的分享面板
将图片通过分享面板分享到自己的应用中并显示。

这一篇主要讲在iOS客户端不使用第三方框架的前提下,怎么实现分享的功能。在自己的应用中调起系统分享面板分享到面板上的其他应用中

UIActivityViewController

苹果从iOS6开始,提供了一个活动列表视图,为分享和操作数据提供了一个统一的服务接口,通过UIActivityViewController来控制它的呈现和关闭,凡是继承UIActivity抽象类的子类对象都可以放在列表中呈现出来。如下图所示:
在这里插入图片描述

UIActivityViewController 使用大致使用步骤:
  • 1 设定分享的内容
- (IBAction)pushLoadBundle:(id)sender {

    // 1. 设定分享的内容
    NSString *shareTitle = @"分享的标题";
    UIImage *shareImage = [UIImage imageNamed:@"suningIcon"];
    
    // 必须要提供url 才会显示分享标签否则只显示图片
    NSURL *shareUrl = [NSURL URLWithString:@"http://www.baidu.com"];
    NSArray *activityItems = @[shareTitle,
                               shareImage,
                               shareUrl];
    
    // 2.创建分享的控制器
    UIActivityViewController *activityVc = [[UIActivityViewController alloc] initWithActivityItems:activityItems applicationActivities:nil];
    // 3.设定不想显示的平台和功能
    activityVc.excludedActivityTypes = @[UIActivityTypePostToFacebook,UIActivityTypeAirDrop];
    
    // 4.设置操作回调,用户点击 菜单按钮后事件执行完成会回调这个block
    activityVc.completionWithItemsHandler = ^(UIActivityType _Nullable activityType, BOOL completed, NSArray * _Nullable returnedItems, NSError * _Nullable activityError) {
        if (completed) {
            NSLog(@"分享成功");
        }else{
            NSLog(@"分享取消");
        }
    };

    // 5.显示分享菜单
    [self presentViewController:activityVc animated:YES completion:nil];
}
  • 2 调起分享面板
    在这里插入图片描述
  • 3 选择分享平台的去向:这里微信

在这里插入图片描述

  • 4 分享结果:成功就可以在微信中查看。
自定义UIActivity

官方文档解释,UIActivity必须通过继承的方式来使用。如果系统提供的操作不能满足我们的需求,也可以自定义UIActivity,可获取按钮选择事件,手动的进行处理。下面就来手动的实现微博分享操作。

1.创建WeiboActivity:

WeiboActivity.h

typedef void(^PerformWeiboActivityBlock)(void);
@interface WeiboActivity : UIActivity
@property (nonatomic,copy)PerformWeiboActivityBlock performWeiboActivityBlock;
@end

WeiboActivity.m

#import "WeiboActivity.h"
@implementation WeiboActivity

+ (UIActivityCategory)activityCategory{
    return UIActivityCategoryShare;
}

- (NSString *)activityType{
    return @"com.myz.share.weibo.post";
}
//显示在列表中的图标
- (UIImage *)activityImage{
    return [UIImage imageNamed:@"share_weibo"];
}
//显示在列表中标题
- (NSString *)activityTitle{
    return @"微博分享";
}

- (BOOL)canPerformWithActivityItems:(NSArray *)activityItems{
    return YES;
}

- (void)prepareWithActivityItems:(NSArray *)activityItems{
}

- (void)performActivity {
    if (self.performWeiboActivityBlock) {
        self.performWeiboActivityBlock();
    }
    [self activityDidFinish:YES];
}
@end

触发面板并分享到微博

- (void)shareToSinaWeibo:(id)btn {
    // 1. 设定分享的内容
    NSString *shareTitle = @"分享的标题";
    UIImage *shareImage = [UIImage imageNamed:@"suningIcon"];
    
    // 必须要提供url 才会显示分享标签否则只显示图片
    NSURL *shareUrl = [NSURL URLWithString:@"http://www.baidu.com"];
    NSArray *activityItems = @[shareTitle, shareImage, shareUrl];
    
    WeiboActivity *weiboActivity = [[WeiboActivity alloc] init];
    weiboActivity.performWeiboActivityBlock = ^{
        [self socialSinaWeibo];
    };
    NSArray * activitys = @[weiboActivity];
    
    UIActivityViewController *activityViewController =    [[UIActivityViewController alloc] initWithActivityItems:activityItems applicationActivities:activitys];
    [self presentViewController:activityViewController animated:YES completion:nil];
    
}

//@import Social
- (void)socialSinaWeibo {
    // 1. 判断设备是否支持指定的分享平台
    // SLComposeViewController:社交分享的视图控制器
    BOOL isAvailable = [SLComposeViewController isAvailableForServiceType:SLServiceTypeSinaWeibo];
    if (isAvailable == NO) {
        NSLog(@"应用不支持新浪微博分享");
        return;
    }
    // 2. 创建分享视图控制器,并指定分享平台
    SLComposeViewController *composeVC = [SLComposeViewController composeViewControllerForServiceType:SLServiceTypeSinaWeibo];
    /* 系统支持的分享功能可以分享的平台
     SOCIAL_EXTERN NSString *const SLServiceTypeTwitter
     SOCIAL_EXTERN NSString *const SLServiceTypeFacebook
     SOCIAL_EXTERN NSString *const SLServiceTypeSinaWeibo
     SOCIAL_EXTERN NSString *const SLServiceTypeTencentWeibo
     SOCIAL_EXTERN NSString *const SLServiceTypeLinkedIn
     */
    
    // 3. 设置分享内容
    [composeVC setInitialText:@"微博分享"];
    [composeVC addImage:[UIImage imageNamed:@"share_weibo.png"]];
    [composeVC addURL:[NSURL URLWithString:@"https://www.baidu.com"]];
    
    // 4. 进入分享界面
    [self presentViewController:composeVC animated:YES completion:^{
        NSLog(@"进入分享界面");
    }];
    // 5. 监听用户操作
    [composeVC setCompletionHandler:^(SLComposeViewControllerResult result) {
        if (result == SLComposeViewControllerResultCancelled) {
            NSLog(@"取消分享");
        }else if (result == SLComposeViewControllerResultDone) {
            NSLog(@"分享成功");
        }
    }];
}

下图框着的自定义的item
在这里插入图片描述

iOS 11 之前微博分享步骤:
  1. 设置后添加微博账户
    在这里插入图片描述
    在这里插入图片描述
  2. 添加之后,回到程序分享
    在这里插入图片描述
  3. 分享结果查看
iOS 11 之后SLComposeViewController 废弃

关于SLComposeViewController生成实例的方法,需要注意的是iOS11.0之前,可以通过<Social/Social.h>框架提供的几种枚举类型来生成实例,这些枚举类型在11.0之后被遗弃了。

SLServiceTypeTwitter
SLServiceTypeFacebook
SLServiceTypeSinaWeibo
SLServiceTypeTencentWeibo
SLServiceTypeLinkedIn

所以iOS 11 之后的自定义分享这种方式调不起微博等分享的。使用SLComposeViewController分享到facebook,SLComposeViewControllerCompletionHandler总是返回SLComposeViewControllerResultCancelled。

只能通过另一种方式:Share Extension。什么是Share Extension?在iOS 8的时候, 苹果开放了几个新特性, 其中一个就是Share Extension。它是苹果系统自带的社会化SDK。而SLComposeViewController支持调用所有的Share Extension。

以下是从网上找来的各个主流App的Share Extension
com.taobao.taobao4iphone.ShareExtension  //  淘宝
com.apple.share.Flickr.post   //  Flickr
com.apple.share.SinaWeibo.post  //   新浪微博
com.laiwang.DingTalk.ShareExtension  //   钉钉
com.apple.mobileslideshow.StreamShareService  //  iCloud
com.alipay.iphoneclient.ExtensionSchemeShare  //   支付宝
com.apple.share.Facebook.post  //   Facebook
com.apple.share.Twitter.post  //   Twitter
com.apple.Health.HealthShareExtension   // 应该是健康管理
com.tencent.xin.sharetimeline  //   微信(好友、朋友圈、收藏)
com.apple.share.TencentWeibo.post  //   腾讯微博
com.tencent.mqq.ShareExtension  //   QQ

iOS 11 之后通过Share Extension 分享。Share Extension 分享请转看文章:
(0097)iOS开发之应用间的分享系列(2)


参看文章
UIActivityViewController使用
iOS系统分享方案总结

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值