IOS打开对应后缀文件

通过ShareExtension打开

点击文件共享后出现的上方列表,如下图

  • info.plist 中添加 Document types
<key>CFBundleDocumentTypes</key>
<array>
<dict>
<key>CFBundleTypeName</key>
<string>RAR Archive</string>
<key>LSHandlerRank</key>
<string>Alternate</string>
<key>LSItemContentTypes</key>
<array>
<string>com.rarlab.rar-archive</string>
</array>
</dict>
</array>

其中 CFBundleTypeName是名字, LSItemContentTypes填对应的UTI

这里如果LSItemContentTypes没填对的话在系统分享列表就不会出现我们的宿主app

UTI也就是统一类型标识符是一个字符串,它唯一地标识被认为具有“类型”的一类实体。是苹果用于识别文件类型的。

这样就可以实现了,在AppDelegate中的

override func application(_: UIApplication, open url: URL, options _: [UIApplication.OpenURLOptionsKey: Any] = [:]) -> Bool {
//处理逻辑
return true
}

方法中实现对应逻辑处理

通过ActionExtension打开

  • 创建ActionExtension

    具体过程就不介绍了,有了这个扩展可以在长按文件分享时将自己的app加入分享的列表

    创建ActionExtension

  • 添加对应的规则

    也就是此扩展支持处理哪些种类的文件

    在ActionExtension的info.plist中添加**NSExtensionActivationRule **key

    如果value为Dictionary,则可以添加苹果自带的规则

    • 最多支持多少文件: NSExtensionActivationSupportsFileWithMaxCount

    • 支持txt文件: NSExtensionActivationSupportsText

    • 支持图片: NSExtensionActivationSupportsImageWithMaxCount

      还有很多其他的规则可以自行查看 点我跳转

      如果设置为TRUEPREDICATE表示可以分享任意内容

    但是这些规则可能都有局限性

    所以苹果提供了自定义规则的方法,有一套对应的语法有兴趣可以看看

    NSExtensionActivationRule的value类型改为string

    SUBQUERY (
    extensionItems, $extensionItem,
    SUBQUERY (
    $extensionItem.attachments, $attachment,
    ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "public.text"
    || ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "org.idpf.epub-container"
    || ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "com.pkware.zip-archive"
    || ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "com.rarlab.rar-archive"
    || ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "org.7-zip.7-zip-archive"
    ).@count >= 1 ).@count > 0

    关键代码在于

    $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "public.text"

    这行代码的意思是允许处理UTI 遵循 "public.text"规则的文件,也就是txt文件

    不清楚的话去看看UTI的定义

    上述代码允许了五种类型txt、epub、zip、rar、7z

    这样规则定好之后,在允许处理的文件类型分享列表中就会出现我们的app了,点击我们app的列表项就需要在ActionExtension中处理对应的逻辑

  • 处理对应文件逻辑

    想要在点击分享后跳转到宿主App,必须创建带有UI的ActionExtension

    因为在extension中UIApplication是不可用的,所以只能另辟蹊径

    通过ASCII码获取到UIApplication

    + (void) openApp:(NSString*)path{
    NSURL *destinationURL = [NSURL URLWithString:[NSString stringWithFormat:@"要跳转的URLScheme",path]];
    // Get "UIApplication" class name through ASCII Character codes.
    NSString *className = [[NSString alloc] initWithData:[NSData dataWithBytes:(unsigned char []){0x55, 0x49, 0x41, 0x70, 0x70, 0x6C, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6F, 0x6E} length:13] encoding:NSASCIIStringEncoding];
    if (NSClassFromString(className)) {
    id object = [NSClassFromString(className) performSelector:@selector(sharedApplication)];
    [object performSelector:@selector(openURL:) withObject:destinationURL];
    }
    }

    然后在viewDidLoad方法中添加处理对应文件的逻辑

    - (void)viewDidLoad {
    [super viewDidLoad];
    BOOL found = NO;
    for (NSExtensionItem *item in self.extensionContext.inputItems) {
    for (NSItemProvider *itemProvider in item.attachments) {
    if ([itemProvider hasItemConformingToTypeIdentifier: type.identifier]) {
    [itemProvider loadItemForTypeIdentifier: type.identifier options:nil completionHandler:^(NSURL *url, NSError *error) {
    //处理对应文件的逻辑
    }];
    found = YES;
    break;
    }
    }
    if (found) {
    break;
    }
    }
    if (!found){
    [self done];
    }
    }

    因为创建的是带UI的ActionExtension,点击分享的列表项会弹出一个底部弹窗,这时我们自己进行一个收起操作,也就是

    [self done];

    跳转到App后一样的是在AppDelegate中去处理相关的逻辑

    override func application(_: UIApplication, open url: URL, options _: [UIApplication.OpenURLOptionsKey: Any] = [:]) -> Bool {
    //处理逻辑
    return true
    }

    PS:有一些UTI是苹果没有的,这时候就需要自己定义或者导入别人定义过的

    参考:https://www.itbaoku.cn/post/939003.html

    https://www.itbaoku.cn/post/939003.html

IOS打开对应后缀文件的更多相关文章

  1. vs打开wixproj后缀文件

    1.在正常情况下vs是无法打开wixproj工程的,能打开也只能是以记事本方式打开该文件本身 2.所以此时需要下载wixtool,安装后即可打开上述类型文件 3.最好也安装好vs对应版本的扩展包 4. ...

  2. iOS崩溃日志ips文件解析

    iOS崩溃日志ips文件解析  一 简介 测试组的同事在进行稳定性测试时,通常会遇到一些崩溃,然后他们会将这些崩溃日志(一般是ips格式的文件)反馈给开发进行分析,但是这些ips文件中的内容通常是如下 ...

  3. iOS 打开本地 其他应用程序(URL Types)

    iOS 打开本地其他应用程序(URL Types) /*前言废话:Xcode是神奇的,是我所见到的编译器中最为神奇的,如:它可以同时运行两个甚至更多Project到我们模拟器上,可以同时使用一个模拟器 ...

  4. Window 注册程序关联后缀文件,双击运行

    一般来说,很多软件都会有自定义后缀的文件,比如.cpp..doc等,那么如果我们想把这些后缀与我们的软件关联起来,如何做呢 #pragma once #include "StdAfx.h&q ...

  5. VS2010 根据模型生成数据库 打开edmx.sql文件时 vs出现无响应的解决方案

    今天在VS2010 sp1+sql server 2008 R2+Win7操作系统下测试ADO.NET 实体数据模型时 ,遇到这样一个问题. 首先建好实体模型,然后"根据模型生成数据库&qu ...

  6. ios项目生成ipa文件方法

    做这些的前提是你配置好了所有的证书,如果还没先去配置证书吧. 1.打开需要生成ipa的ios项目.2.在运行按钮的后面选择ios Device3.点击Product 按钮,选择第五个Archive4. ...

  7. (转)IOS之Info.plist文件简介

    原文:IOS之Info.plist文件简介 http://www.apkbus.com/android-130240-1-1.html (出处: Android开发论坛 - 安卓开发论坛 - Andr ...

  8. 解决win7无法打开chm格式文件的问题

    解决win7无法打开chm格式文件的问题. (一).简单方法(本人用的这个) 1.打开chm2.win7提示安全问题3.chm无法显示内容4.关闭chm5.右键点击chm,点击“解除锁定”,ok  没 ...

  9. MFC 打开外部EXE文件的三种方法

    目前知道三种方式:WinExec,ShellExecute ,CreateProcess,别人已经总结的很好了<vc中调用其他应用程序的方法(函数) winexec,shellexecute , ...

  10. 【iOS系列】-iOS查看沙盒文件图文教程(真机+模拟器)

    [iOS系列]-iOS查看沙盒文件图文教程(真机+模拟器) 1:模拟器 1.1 方法1: 程序中打印一下的地址,能直接前往沙盒路径. NSString *path = [NSSearchPathFor ...

随机推荐

  1. [TK] Tourist Attractions

    题目描述 给出一张有 \(n\) 个点 \(m\) 条边的无向图,每条边有边权. 你需要找一条从 \(1\) 到 \(n\) 的最短路径,并且这条路径在满足给出的 \(g\) 个限制的情况下可以在所有 ...

  2. SuperMap iServer8C证书过期如何解决

    说明:该问题是SuperMap iServer8.0.2和8.1.0版本云许可模块问题,需要手动更新云许可HTTPS证书,可以升级到官网8.1.1/9D/10i等方式进行解决 针对无法升级或者老项目维 ...

  3. python——celery异常consumer: Cannot connect to redis://127.0.0.1:6379/1: MISCONF Redis is configured to save RDB snapshots, but it is currently not able to persist on disk.

    1.检查 Redis 日志: 查看 Redis 的日志文件(通常位于 /var/log/redis/redis-server.log 或者根据你的配置文件中指定的位置),以获取有关错误原因的详细信息. ...

  4. kubernetes的Deployment

    Deployment 在我们发布容器中的服务时,总共有一下几种方式: 将旧的pod停掉,创建新的pod并发布 创建新的pod,然后将旧的pod停掉 滚动式升级.创建一个新的pod,删除一个旧的pod, ...

  5. 妙用编辑器:使用Notepad--正则表达式从命令结果报文快速生成新命令

    应用场景 日常工作中有些维护场景,比如检查设备状态,执行查询命令后,得到精简结果报文,如果要更深入的检查状态,可能还要执行其他命令,逐个对象进行查询,这里涉及到快速从报文生成查询指令的功能. 比如有如 ...

  6. Gitlab私有存储库支持SourceLink 调试之使用proxy方式

    前情概要 在 让你发布的nuget包支持源代码调试#为gitlab的私有源代码项目提供支持 小节中有介绍到如何让gitlab的私有存储库支持SourceLink. 其中有一个方法是说在vs中打开web ...

  7. 云原生周刊 | 使用 kube-reqsizer 自动调整资源配额

    开源项目推荐 kptop Kubernetes API 提供的监控指标非常有限,而 kubectl top 就是利用 Kubernetes API 来查看 Node 和 Pod 的实时资源使用情况.k ...

  8. SpringMvc请求注解@ResponseBody

    1.概念 注解 @ResponseBody,使用在控制层(controller)的方法上. 2.作用 作用:将方法的返回值,以特定的格式写入到response的body区域,进而将数据返回给客户端. ...

  9. 一文彻底弄懂MySQL优化之深度分页

    深度分页(Deep Pagination)在MySQL中指的是对大型数据集进行分页查询时,尤其是当需要获取较后页的数据时,性能可能会受到影响.传统的分页方法在数据量较大时,随着页数的增加,性能会迅速下 ...

  10. Einfuehrung in die Kuenstliche Intelligenz学习笔记

    1.Uninformed Search 1.1 State Space of a Problem 1.2 depth of the search tree and fringe of the sear ...