关于系统相册图片分享到自家APP的流程
创建分享扩展
创建项目, 然后在工具栏选择 File -> New -> Target
选择Share Extension
Product Name随便填写, 我这里以Share作为名字, 填写完成后点击Finish
创建完成后, 此时项目左侧多了一个Share目录(根据你填写的名字查找是否存在对应的目录, 若不存在则根据上述流程重新创建)
查看这个位置的工程名,选择Share(上面创建的名字)
若是真机调试, 则需选择真机系统的对应版本
并且Share也要改成和上面一样的版本,否则有可能运行不起来
此时Command+R运行程序, 在弹出的窗口选择Photos(如果显示的是中文, 则选择照片), 点击Run
选择任意一张图片, 点击左下角分享
此时就能看见我们的Demo APP出现在界面中了
点击我们的APP, 会弹出系统自带的默认分享界面
跳转到自家APP操作
在跳转到APP之前, 需在工程进行URL Types的配置, 在工程TARGETS项目中, 选择上方的Info选项卡, 拉到最下, 打开URL Types选项, 点击红框里的+号, 在URL Schemes里填写你要跳转的名称, 我这里直接以项目名Demo作示例
找到我们之前的Share目录(你之前创建的名字), 找到ShareViewController.m(这是官方默认生成的文件名, 和我们创建的Share无关)
ShareViewController对应的就是系统自带的分享界面, 其中图中"发布"点击触发的是-(void)didSelectPost方法
在-(BOOL)isContentValid方法中,我们可以设置一些默认值操作, 比如textView的placeholder默认值(placeholder是官方源文件提供的属性)
在-(void)didSelectPost方法中编写以下代码
`- (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
如果不需要发送界面, 想通过直接点击APP图标就进行跳转, 则把上述跳转方法编写在-(BOOL)isContentValid方法里
`- (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图标跳转
自定义界面
在默认发送界面中, 可以在-(NSArray *)configurationItems方法中仿cell控件, 效果如下
若需另外自定义界面, 则在Share目录里创建新的控制器, 继承UIViewController, 并删掉ShareViewController文件
在Share目录下的Info属性列表中, 在NSExtension属性下
添加NSExtensionPrincipalClass, 右边value设置成自定义控制器的文件名(这里以CustomViewController作示例)
然后删掉NSExtensionMainStoryboard属性
运行程序, 点击APP图标
获取默认界面数据
获取分享的图片
`- (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];
}];
}
}`