(0097)iOS开发之应用间的分享系列(2)
(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
解析:
上述代码中处理了图片
(改成自己的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中Appdelegate
的 applicationDidBecomeActive
方法中发送一个同志,让接受通知的地方显示出存储的数据。
实现获取,代码如下: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)相关推荐
- (0098)iOS开发之应用间的分享系列(3)
(0096)iOS开发之应用间的分享系列(1) (0097)iOS开发之应用间的分享系列(2) 前两篇都是讲的分别是 将自己的应用添加到系统的分享面板 将图片通过分享面板分享到自己的应用中并显示. 这 ...
- (0096)iOS开发之应用间的分享系列(1)
分享系列: (1)应用间的分享概要 (2) Share Extension将应用添加到系统分享列表 (3) 在自己的应用中调起系统分享面板分享到面板上的其他应用中 (0097)iOS开发之应用间的分享 ...
- iOS开发之线程间的MachPort通信与子线程中的Notification转发
如题,今天的博客我们就来记录一下iOS开发中使用MachPort来实现线程间的通信,然后使用该知识点来转发子线程中所发出的Notification.简单的说,MachPort的工作方式其实是将NSMa ...
- iOS 开发之几个 Demo 分享网站
OSChina 前往 OSChina Code4App 前往 Code4App CocoaChina 前往 CocoaChina 码云 前往码云
- iOS开发的就业形势怎么样?
以下是 100offer 整理的关于 iOS 开发就业形势的报告,看完就你知道做 iOS 开发多有"钱"途了. 在创业约等于做APP的互联网市场,几乎每一家互联网公司都需要 iOS ...
- ios 开发 微信分享失败_一个失落的孩子如何在失败的情况下从失败变成了iOS开发人员...
ios 开发 微信分享失败 by Jordan LaGrone 乔丹·拉格隆(Jordan LaGrone) 一个失落的孩子如何在失败的情况下从失败变成了iOS开发人员 (How a lost kid ...
- iOS开发常见技术链接分享
1.iOS中打包成IPA包的四种方法 http://www.jianshu.com/p/dd2b66cbf097 2.斯坦大学公开课iOS http://open.163.com/special/op ...
- ios开发学习-手势交互(Gesture)效果源码分享
qianqianlianmeng ios开发学习-手势交互(Gesture)效果源码分享 All Around Pull View 介绍:实现视图四个方向(上下左右)都能够拖动更新(pull to r ...
- [分享]iOS开发-UI篇:CAlayer层的属性
iOS开发UI篇-CAlayer层的属性 一.position和anchorPoint 1.简单介绍 CALayer有2个非常重要的属性:position和anchorPoint @property ...
最新文章
- 日期控件判断是否为空
- Mysql启动自己主动设置max_connections为其它值
- 如何对memcache的数据(key-value)进行遍历操作
- python爬图mzitu_小白学 Python 爬虫(16):urllib 实战之爬取妹子图
- ubuntu 11.10英文界面下中文字体显示楷体的问题
- Python网络爬虫入门篇
- 安恒如何扫描oracle,安恒明鉴数据库弱点扫描器
- 怎么给图片加滤镜?这三个实用方法教会你
- QT 扁平化界面风格,自定义TabWidget控件
- JAVA12_09学习总结(Java注解,JavaScript)
- 核电站计算机专业是干什么的,什么叫核电站?它是干什么用的呢?
- 【云驻共创】华为云之锁与权限为您的数仓保驾护航
- 基于像元二分模型的植被覆盖度反演--像元二分法
- 分享马化腾在3Q大战后写给腾讯全体员工的一封信
- 飞书二开系列之创建测试企业与企业应用等准备工作(一)
- 航嘉650计算机电源,搞机也不是那么容易搞的 — Huntkey 航嘉 MVPLAND K650 650w电脑主机电源 简测...
- php集群管理自动采集cns,CNS平台集成Expect自动化脚本配置功能
- 『Json压缩』掌握在.NET中压缩Json为一行的多种方法
- 彻底禁用搜狗输入法的SGNews.exe
- ROS wiki 上包的目录列表