(0096)iOS开发之应用间的分享系列(1)
(0097)iOS开发之应用间的分享系列(2)
前两篇都是讲的分别是
将自己的应用添加到系统的分享面板
将图片通过分享面板分享到自己的应用中并显示。
这一篇主要讲在iOS客户端不使用第三方框架的前提下,怎么实现分享的功能。在自己的应用中调起系统分享面板分享到面板上的其他应用中
。
苹果从iOS6开始,提供了一个活动列表视图,为分享和操作数据提供了一个统一的服务接口,通过UIActivityViewController
来控制它的呈现和关闭,凡是继承UIActivity
抽象类的子类对象都可以放在列表中呈现出来。如下图所示:
- (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];
}
官方文档解释,UIActivity必须通过继承的方式来使用。如果系统提供的操作不能满足我们的需求,也可以自定义UIActivity,可获取按钮选择事件,手动的进行处理。下面就来手动的实现微博分享操作。
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(@"分享成功");
}
}];
}
关于SLComposeViewController生成实例的方法,需要注意的是iOS11.0之前,可以通过
框架提供的几种枚举类型来生成实例,这些枚举类型在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。
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系统分享方案总结