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

本文介绍了如何在iOS应用中创建并集成Share Extension,以实现从系统相册和截屏中选择图片进行分享的功能。详细步骤包括创建Share Extension Target、配置Info.plist、自定义Controller,并展示了如何在宿主App中获取分享的图片数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

 

2.1 创建Share Extension扩展Target

1、file—>new——>target

2、iOS—> Application Extension—>Share Extension,点击Next

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

 

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

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

然后点击“Run”来进行调试运行启动系统照片,如图: 

 

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

NSExtensionActivationSupportsImageWithMaxCount(数字6是规定最多可以选择6张图片)

 

 

 

 

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:@"发送" 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.Micteach.Parents.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)

    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];

        }

    }

}

到这里 可以拉起宿主App

下面是如何在宿主App中获取图片的存储数组

使用App Groups服务,使自己的应用之间通过NSUserDefaults进行相互的数据传输

到开发者中心为创建的ImageShare工程添加App ID ,,打开ImageShare工程和宿主工程的App services的App groups 功能(由于我的工程使用的automatically manage signing 所以未到开发者中心创建App ID,直接在工程开启App Groups后自动生成的,对于不是automatically manage signing具体的过程自己研究一下吧)

然后分别打开容器应用和分享应用的项目配置的Capabilities页签,激活App Groups特性,添加App groups  格式是:“group.+bundle identifier”如图:

 

在宿主App的Appdelegate中获取分享数据

- (void)applicationDidBecomeActive:(UIApplication *)application {

    //获取共享的UserDefaults  注意黄色字体与ImageShare的App groups匹配

    NSUserDefaults *userDefaults = [[NSUserDefaults alloc] initWithSuiteName:@"group.com.Micteach.Parents.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];

    }

        //重置分享标识

        [userDefaults setBool:NO forKey:@"newshare"];

    }

}

imagesDataArr便是获取到的图片的数组,,具体接下来是将图片进行发送还是上传服务器等操作,,按照自己的逻辑来操作。。。。。。。。。。。。。。。。

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值