(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), ^{
        // 耗时的操作 获取选中的图片的image
        for (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转换为NSData
        NSData *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];
        /// 取出图片data
        for (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 全介绍

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值