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

Share Extension将应用添加到系统分享列表

怎么把自己的应用添加到系统分享面板的列表中,并打开应用处理分享的文件、预览文件?今天将实验这个问题。

系统相册点击分享 ->获取图片发送或上传-> 拉起客户端

实现步骤

第一步: 在主工程中创建Share Extension扩展Target

注:扩展不能单独创建,必须依赖于应用工程项目,因此如果你还没有创建一个应用工程,先去创建一个。

1、file—>new——>target

2、然后选择”iOS” -> “Application Extension” -> “Share Extension”,点击“Next”。如图:

3、给扩展起个名字(ImageShare),点击“Finish”

4.这时候会提示创建一个Scheme,点击“Activate”

创建Share Extension完成。编译运行。XCode中会弹出界面让我们选择一个iOS的App来运行Extension(真机有图片)。如图:

第二步:配置shareExtension

创建shareExtension目录之后,会出现4个文件其中

ShreViewController 是默认的分享界面
MainInterface.storyboard 是默认的storyboard。如果用代码写UI,则可删除(有坑)
Info.plist : 里面的版本号必须要和主工程的版本号一致,否则审核可能被拒。NSExtension非常重要,它决定你扩展在什么情况出现, 什么情况消失。比如我们的工程是最多只允许图片5张+视频5个,超出后将在分享菜单项上看不到,可以这样设置:

如果不想使用模板提供的storyboard文件,打开share的info.plist 移除NSExtensionMainStoryboard 键值对,并添加NSExtensionPrincipalClass键值对,使用自己创建的myShareViewController的名字作为值。

myShareViewController 中的代码

#import "myShareViewController.h"@interface myShareViewController ()
@property (nonatomic, strong) NSMutableArray *imagesArr;
@property (nonatomic, strong) NSString *ImagesStr;
@property (nonatomic, strong) UIView *bacView;
@property (nonatomic, strong) UIView *nanView;
@property (nonatomic, strong) UIButton *cancelButton;
@property (nonatomic, strong) UIButton *postButton;
@property (nonatomic, strong) UIScrollView *bigImageScroll;
@end@implementation myShareViewController
- (void)viewDidLoad {[super viewDidLoad];self.imagesArr = [NSMutableArray array];self.ImagesStr = nil;self.view.backgroundColor = [UIColor colorWithRed:0.00 green:0.00 blue:0.00 alpha:0.50];self.bacView = [[UIView alloc] initWithFrame:CGRectMake(30, [UIScreen mainScreen].bounds.size.height/2-200, [UIScreen mainScreen].bounds.size.width-60, 400)];self.bacView.layer.cornerRadius = 5;self.bacView.layer.masksToBounds = YES;self.bacView.backgroundColor = [UIColor whiteColor];[self.view addSubview:self.bacView];///self.nanView = [[UIView alloc] initWithFrame:CGRectMake(0, 64, [UIScreen mainScreen].bounds.size.width-60, 0.5)];self.nanView.backgroundColor = [UIColor lightGrayColor];[self.bacView addSubview:self.nanView];///self.cancelButton = [UIButton buttonWithType:UIButtonTypeSystem];[self.cancelButton setTitle:@"取消" forState:UIControlStateNormal];self.cancelButton.tintColor = [UIColor orangeColor];self.cancelButton.frame = CGRectMake(10, 22, 50, 20);[self.bacView addSubview:self.cancelButton];[self.cancelButton addTarget:self action:@selector(cancelButtonAction) forControlEvents:UIControlEventTouchUpInside];///self.postButton = [UIButton buttonWithType:UIButtonTypeSystem];[self.postButton setTitle:@"send" forState:UIControlStateNormal];self.postButton.tintColor = [UIColor orangeColor];self.postButton.frame = CGRectMake(self.bacView.frame.size.width-60, 22, 50, 20);[self.bacView addSubview:self.postButton];[self.postButton addTarget:self action:@selector(postButtonAction) forControlEvents:UIControlEventTouchUpInside];dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{// 耗时的操作 获取选中的图片的imagefor (NSExtensionItem *item in self.extensionContext.inputItems) {NSInteger count = item.attachments.count;for (NSItemProvider *itemProvider in item.attachments) {if ([itemProvider hasItemConformingToTypeIdentifier:@"public.image"]) {[itemProvider loadItemForTypeIdentifier:@"public.image" options:nil completionHandler:^(UIImage *image, NSError *error) {[self.imagesArr addObject:image];dispatch_async(dispatch_get_main_queue(), ^{if (self.imagesArr.count == count) {[self createScrollView];}});}];}}}});
}
/// 数组转成”,"间隔的字符串方便存取
-(NSString *)stringTOjson:(NSMutableArray *)temps{return [temps componentsJoinedByString:@","];
}
- (void)createScrollView{self.bigImageScroll = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 64, self.bacView.frame.size.width, 400-64)];self.bigImageScroll.pagingEnabled = YES;[self.bacView addSubview:self.bigImageScroll];self.bigImageScroll.backgroundColor = [UIColor whiteColor];self.bigImageScroll.contentSize = CGSizeMake(self.imagesArr.count*self.bacView.frame.size.width, 0);for (NSInteger i = 0; i<self.imagesArr.count; i++) {UIImageView *image = [[UIImageView alloc] initWithFrame:CGRectMake(i*self.bacView.frame.size.width, 0, self.bacView.frame.size.width, 400-64)];[image setContentScaleFactor:[[UIScreen mainScreen] scale]];image.contentMode =  UIViewContentModeScaleAspectFit;image.clipsToBounds  = YES;[self.bigImageScroll addSubview:image];image.backgroundColor = [UIColor whiteColor];image.image = self.imagesArr[i];}NSUserDefaults *userDefaults = [[NSUserDefaults alloc] initWithSuiteName:@"group.com.devlzz.--.ImageShare"];imageKeyArr 存储图片data的key数组NSMutableArray *imageKeyArr = [NSMutableArray array];for (UIImage *image in self.imagesArr) {//UIImage转换为NSDataNSData *imageData = UIImagePNGRepresentation(image);NSString *key = [self ret32bitString];[userDefaults setObject:imageData forKey:key];[imageKeyArr addObject:key];}[userDefaults setObject:[self stringTOjson:imageKeyArr] forKey:@"shareImageArr"];//用于标记是新的分享[userDefaults setBool:YES forKey:@"newshare"];
}
/// 32位随机字符串
- (NSString *)ret32bitString{char data[32];for (int x=0;x<32;data[x++] = (char)('A' + (arc4random_uniform(26))));return [[NSString alloc] initWithBytes:data length:32 encoding:NSUTF8StringEncoding];
}
- (void)cancelButtonAction{[self.extensionContext cancelRequestWithError:[NSError errorWithDomain:@"CustomShareError" code:NSUserCancelledError userInfo:nil]];
}
- (void)postButtonAction{// 执行分享内容处理  拉起寄主App(customURL是怎么来的?调研openUrl)NSLog(@"postButtonAction");NSString *customURL = @"cloudschool://";UIResponder* responder = self;while ((responder = [responder nextResponder]) != nil){if([responder respondsToSelector:@selector(openURL:)] == YES){[responder performSelector:@selector(openURL:) withObject:[NSURL URLWithString:customURL]];[self.extensionContext completeRequestReturningItems:nil completionHandler:NULL];}}
}
@end

解析:

  1. 上述代码中处理了图片(改成自己的key:group.com.devlzz.--.ImageShare)

    NSUserDefaults *userDefaults = [[NSUserDefaults alloc] initWithSuiteName:@"group.com.devlzz.--.ImageShare"];

发送按钮事件中调起载体APP,通过openURL 的方式打开了app 的。
NSString *customURL = @“cloudschool://”;

在工程的info.plist 中设置URL Scheme:cloudschool

到这里 可以拉起宿主App.

宿主App中获取图片的存储数组

使用App Groups服务,使自己的应用之间通过NSUserDefaults进行相互的数据传输,然后分别打开容器应用和分享应用的项目配置的Capabilities页签,激活App Groups特性,添加App groups 格式是:“group.+bundle identifier”如图:

到这里应用和扩展的App Groups服务都已经启动,接下来就是要进行数据传输了,上面说到,我们可以用NSUserDefaults、NSFileManager以及CoreData三种方式进行传输,在这里本人使用NSUserDefaults方法进行数据传输,因为个人觉得更简单,但需要注意的是,要想设置或访问Group的数据,不能在使用standardUserDefaults方法来获取一个NSUserDefaults对象了。应该使用initWithSuiteName:方法来初始化一个NSUserDefaults对象,其中的SuiteName就是创建的Group的名字,然后利用这个对象来实现跨应用的数据读写。

存储成功后,最后就是在容器APP获取分享数据。在容器APP中AppdelegateapplicationDidBecomeActive方法中发送一个同志,让接受通知的地方显示出存储的数据。

实现获取,代码如下:group.com.devlzz.--.ImageShare 改成自己的

- (void)applicationDidBecomeActive:(UIApplication *)application {
NSUserDefaults *userDefaults = [[NSUserDefaults alloc] initWithSuiteName:@"group.com.devlzz.--.ImageShare"];
if ([userDefaults boolForKey:@"newshare"]){[[NSNotificationCenter defaultCenter] postNotificationName:@"kShareBackImageData" object:nil];}
}

接受通知的地方

 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(getShareImage) name:@"kShareBackImageData" object:nil];
- (void)getShareImage
{// 获取共享的UserDefaults  注意黄色字体与ImageShare的App groups匹配NSUserDefaults *userDefaults = [[NSUserDefaults alloc] initWithSuiteName:@"group.com.devlzz.--.ImageShare"];if ([userDefaults boolForKey:@"newshare"]){NSArray  *array = [[userDefaults objectForKey:@"shareImageArr"] componentsSeparatedByString:@","];NSMutableArray *imagesDataArr = [NSMutableArray array];/// 取出图片datafor (NSString *key in array) {NSData *data = [userDefaults objectForKey:key];[imagesDataArr addObject:data];// 下面是一个ImageView 显示分享过来的数据self.shareImageView.image = [UIImage imageWithData:data];}//重置分享标识[userDefaults setBool:NO forKey:@"newshare"];}
}

上面就拿到了分享的数据了,实现了数据的共享。

参看:

将App添加到系统分享列表(相册和截屏)

iOS PDF之旅(二)将PDF文件Open In MyApp

shareExtension 全介绍

(0097)iOS开发之应用间的分享系列(2)相关推荐

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

    (0096)iOS开发之应用间的分享系列(1) (0097)iOS开发之应用间的分享系列(2) 前两篇都是讲的分别是 将自己的应用添加到系统的分享面板 将图片通过分享面板分享到自己的应用中并显示. 这 ...

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

    分享系列: (1)应用间的分享概要 (2) Share Extension将应用添加到系统分享列表 (3) 在自己的应用中调起系统分享面板分享到面板上的其他应用中 (0097)iOS开发之应用间的分享 ...

  3. iOS开发之线程间的MachPort通信与子线程中的Notification转发

    如题,今天的博客我们就来记录一下iOS开发中使用MachPort来实现线程间的通信,然后使用该知识点来转发子线程中所发出的Notification.简单的说,MachPort的工作方式其实是将NSMa ...

  4. iOS 开发之几个 Demo 分享网站

    OSChina 前往 OSChina Code4App 前往 Code4App CocoaChina 前往 CocoaChina 码云 前往码云

  5. iOS开发的就业形势怎么样?

    以下是 100offer 整理的关于 iOS 开发就业形势的报告,看完就你知道做 iOS 开发多有"钱"途了. 在创业约等于做APP的互联网市场,几乎每一家互联网公司都需要 iOS ...

  6. ios 开发 微信分享失败_一个失落的孩子如何在失败的情况下从失败变成了iOS开发人员...

    ios 开发 微信分享失败 by Jordan LaGrone 乔丹·拉格隆(Jordan LaGrone) 一个失落的孩子如何在失败的情况下从失败变成了iOS开发人员 (How a lost kid ...

  7. iOS开发常见技术链接分享

    1.iOS中打包成IPA包的四种方法 http://www.jianshu.com/p/dd2b66cbf097 2.斯坦大学公开课iOS http://open.163.com/special/op ...

  8. ios开发学习-手势交互(Gesture)效果源码分享

    qianqianlianmeng ios开发学习-手势交互(Gesture)效果源码分享 All Around Pull View 介绍:实现视图四个方向(上下左右)都能够拖动更新(pull to r ...

  9. [分享]iOS开发-UI篇:CAlayer层的属性

    iOS开发UI篇-CAlayer层的属性 一.position和anchorPoint 1.简单介绍 CALayer有2个非常重要的属性:position和anchorPoint @property ...

最新文章

  1. 日期控件判断是否为空
  2. Mysql启动自己主动设置max_connections为其它值
  3. 如何对memcache的数据(key-value)进行遍历操作
  4. python爬图mzitu_小白学 Python 爬虫(16):urllib 实战之爬取妹子图
  5. ubuntu 11.10英文界面下中文字体显示楷体的问题
  6. Python网络爬虫入门篇
  7. 安恒如何扫描oracle,安恒明鉴数据库弱点扫描器
  8. 怎么给图片加滤镜?这三个实用方法教会你
  9. QT 扁平化界面风格,自定义TabWidget控件
  10. JAVA12_09学习总结(Java注解,JavaScript)
  11. 核电站计算机专业是干什么的,什么叫核电站?它是干什么用的呢?
  12. 【云驻共创】华为云之锁与权限为您的数仓保驾护航
  13. 基于像元二分模型的植被覆盖度反演--像元二分法
  14. 分享马化腾在3Q大战后写给腾讯全体员工的一封信
  15. 飞书二开系列之创建测试企业与企业应用等准备工作(一)
  16. 航嘉650计算机电源,搞机也不是那么容易搞的 — Huntkey 航嘉 MVPLAND K650 650w电脑主机电源 简测...
  17. php集群管理自动采集cns,CNS平台集成Expect自动化脚本配置功能
  18. 『Json压缩』掌握在.NET中压缩Json为一行的多种方法
  19. 彻底禁用搜狗输入法的SGNews.exe
  20. ROS wiki 上包的目录列表

热门文章

  1. seafile服务端的搭建
  2. 教务查询子系统时序图
  3. php中文乱码问题解决方案
  4. 【Quartz】Quartz
  5. oracle 学习小结11
  6. CentOS 7下使用Gitolite搭建Git私服
  7. jenkins job构建后汇总结果到同一个文本文档中去
  8. Node.js 快速了解
  9. 【BZOJ1951】【SDOI2010】古代猪文 Lucas定理、中国剩余定理、exgcd、费马小定理
  10. 海量数据库解决方案2011032301