iOS Extension Share 图片分享, 跳转到APP, 自定义界面, 获取数据

2,349 阅读3分钟

关于系统相册图片分享到自家APP的流程

Simulator Screenshot - iPhone 14 Pro - 2023-04-07 at 09.20.45.png

创建分享扩展

创建项目, 然后在工具栏选择 File -> New -> Target

image.png

选择Share Extension

image.png

Product Name随便填写, 我这里以Share作为名字, 填写完成后点击Finish

image.png

创建完成后, 此时项目左侧多了一个Share目录(根据你填写的名字查找是否存在对应的目录, 若不存在则根据上述流程重新创建)

image.png

查看这个位置的工程名,选择Share(上面创建的名字)

image.png

若是真机调试, 则需选择真机系统的对应版本

image.png

并且Share也要改成和上面一样的版本,否则有可能运行不起来

image.png

此时Command+R运行程序, 在弹出的窗口选择Photos(如果显示的是中文, 则选择照片), 点击Run

image.png

选择任意一张图片, 点击左下角分享

image.png

此时就能看见我们的Demo APP出现在界面中了

image.png

点击我们的APP, 会弹出系统自带的默认分享界面

image.png

跳转到自家APP操作

在跳转到APP之前, 需在工程进行URL Types的配置, 在工程TARGETS项目中, 选择上方的Info选项卡, 拉到最下, 打开URL Types选项, 点击红框里的+号, 在URL Schemes里填写你要跳转的名称, 我这里直接以项目名Demo作示例

image.png

找到我们之前的Share目录(你之前创建的名字), 找到ShareViewController.m(这是官方默认生成的文件名, 和我们创建的Share无关)

ShareViewController对应的就是系统自带的分享界面, 其中图中"发布"点击触发的是-(void)didSelectPost方法

在-(BOOL)isContentValid方法中,我们可以设置一些默认值操作, 比如textView的placeholder默认值(placeholder是官方源文件提供的属性)

image.png image.png

在-(void)didSelectPost方法中编写以下代码

image.png

`- (void)didSelectPost {

    UIResponder * responder = [self nextResponder];

    while((responder = [responder nextResponder]) != nil) {

        if([responder respondsToSelector: @selector(openURL:)] == YES) {

            //打开APP

            [responder performSelector: @selector(openURL:) withObject:[NSURL URLWithString:[NSString stringWithFormat:@"URL Schemes填写的名字://"]]];

            //执行分享内容处理

            [self.extensionContext completeRequestReturningItems:@[] completionHandler:nil];

            break;

       }

    }

}`

运行程序, 点击发送, 此时已成功跳转到我们的 APP

image.png

如果不需要发送界面, 想通过直接点击APP图标就进行跳转, 则把上述跳转方法编写在-(BOOL)isContentValid方法里

image.png

`- (BOOL)isContentValid {

    UIResponder * responder = [self nextResponder];

    while((responder = [responder nextResponder]) != nil) {

        if([responder respondsToSelector: @selector(openURL:)] == YES) {

            //打开APP

            [responder performSelector: @selector(openURL:) withObject:[NSURL URLWithString:[NSString stringWithFormat:@"URL Schemes填写的名字://"]]];

            //执行分享内容处理

            [self.extensionContext completeRequestReturningItems:@[] completionHandler:nil];

            break;

       }

    }

    return YES;

}`

运行程序, 点击APP图标, 此时成功通过点击APP图标跳转

1.gif

自定义界面

在默认发送界面中, 可以在-(NSArray *)configurationItems方法中仿cell控件, 效果如下

image.png

image.png

若需另外自定义界面, 则在Share目录里创建新的控制器, 继承UIViewController, 并删掉ShareViewController文件

image.png

在Share目录下的Info属性列表中, 在NSExtension属性下

添加NSExtensionPrincipalClass, 右边value设置成自定义控制器的文件名(这里以CustomViewController作示例)

然后删掉NSExtensionMainStoryboard属性

image.png

运行程序, 点击APP图标

2.gif

获取默认界面数据

获取分享的图片

image.png

`- (void)didSelectPost {

    NSArray * inputItems = self.extensionContext.inputItems;

    NSExtensionItem * extensionItem = inputItems.firstObject;

    NSArray * attachments = extensionItem.attachments;

    NSItemProvider * itemProvider = attachments.firstObject;

    NSString * imageIdentifier = itemProvider.registeredTypeIdentifiers.firstObject;

    if ([itemProvider hasItemConformingToTypeIdentifier:imageIdentifier]) {

        [itemProvider loadDataRepresentationForTypeIdentifier:imageIdentifier completionHandler:^(NSData * _Nullable data, NSError * _Nullable error) {

       //获取图片,在此进行后续操作        self.image = [UIImage imageWithData:data];

       [self.extensionContext completeRequestReturningItems:@[] completionHandler:nil];

       }];

    }

}`

获取分享的文本内容

image.png