IOS打开对应后缀文件
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的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打开对应后缀文件的更多相关文章
- vs打开wixproj后缀文件
1.在正常情况下vs是无法打开wixproj工程的,能打开也只能是以记事本方式打开该文件本身 2.所以此时需要下载wixtool,安装后即可打开上述类型文件 3.最好也安装好vs对应版本的扩展包 4. ...
- iOS崩溃日志ips文件解析
iOS崩溃日志ips文件解析 一 简介 测试组的同事在进行稳定性测试时,通常会遇到一些崩溃,然后他们会将这些崩溃日志(一般是ips格式的文件)反馈给开发进行分析,但是这些ips文件中的内容通常是如下 ...
- iOS 打开本地 其他应用程序(URL Types)
iOS 打开本地其他应用程序(URL Types) /*前言废话:Xcode是神奇的,是我所见到的编译器中最为神奇的,如:它可以同时运行两个甚至更多Project到我们模拟器上,可以同时使用一个模拟器 ...
- Window 注册程序关联后缀文件,双击运行
一般来说,很多软件都会有自定义后缀的文件,比如.cpp..doc等,那么如果我们想把这些后缀与我们的软件关联起来,如何做呢 #pragma once #include "StdAfx.h&q ...
- VS2010 根据模型生成数据库 打开edmx.sql文件时 vs出现无响应的解决方案
今天在VS2010 sp1+sql server 2008 R2+Win7操作系统下测试ADO.NET 实体数据模型时 ,遇到这样一个问题. 首先建好实体模型,然后"根据模型生成数据库&qu ...
- ios项目生成ipa文件方法
做这些的前提是你配置好了所有的证书,如果还没先去配置证书吧. 1.打开需要生成ipa的ios项目.2.在运行按钮的后面选择ios Device3.点击Product 按钮,选择第五个Archive4. ...
- (转)IOS之Info.plist文件简介
原文:IOS之Info.plist文件简介 http://www.apkbus.com/android-130240-1-1.html (出处: Android开发论坛 - 安卓开发论坛 - Andr ...
- 解决win7无法打开chm格式文件的问题
解决win7无法打开chm格式文件的问题. (一).简单方法(本人用的这个) 1.打开chm2.win7提示安全问题3.chm无法显示内容4.关闭chm5.右键点击chm,点击“解除锁定”,ok 没 ...
- MFC 打开外部EXE文件的三种方法
目前知道三种方式:WinExec,ShellExecute ,CreateProcess,别人已经总结的很好了<vc中调用其他应用程序的方法(函数) winexec,shellexecute , ...
- 【iOS系列】-iOS查看沙盒文件图文教程(真机+模拟器)
[iOS系列]-iOS查看沙盒文件图文教程(真机+模拟器) 1:模拟器 1.1 方法1: 程序中打印一下的地址,能直接前往沙盒路径. NSString *path = [NSSearchPathFor ...
随机推荐
- Nacos 配置加密
Nacos 配置加密 nacos配置加密官网 官网介绍太简单,而且GitHub 网络受限,随缘访问.Gitee 发现有镜像仓库,同步的最新版本 Gitee nacos 镜像仓库 但是官网中提到的加密插 ...
- @Primary ,@Qualifier ,@Autowired ,@Resource作用与区别
首先阐述 @Autowired 和 @Resource 的区别 @Resource 是JDK自带的注解 可以按名称注入也可以按类型注入,默认是按名称注入,没有显式指定名称时,在spring容器中匹配与 ...
- USB总线-Linux内核USB3.0主机控制器驱动初始化流程分析(十三)
1.概述 RK3588有2个USB3.0 DRD控制器,2个USB2.0 Host控制器.USB3.0 DRD控制器既可以做Host,也可以做Device,向下兼容USB2.0和USB1.0.USB3 ...
- qemu的使用
一.QEMU的运行模式 直接摘抄自己<揭秘家用路由器0day漏洞挖掘技术>,网上查了一下也没有找到令人满意的QEMU的使用说明,就采用这本书上的介绍.如果后期能够找到比较满意的QEMU的使 ...
- 数据库运维实操优质文章分享(含Oracle、MySQL等) | 2023年6月刊
本文为大家整理了墨天轮数据社区2023年6月发布的优质技术文章/文档,主题涵盖Oracle.MySQL.PostgreSQL等数据库的安装配置.故障处理.性能优化等日常实践操作,以及常用脚本.注意事项 ...
- 数据库周刊60丨3月国产数据库排行榜出炉;日本银行数据迁移失败致使业务宕机;阿里云RDS PG13发布;亚健康Oracle数据库故障定位;Redis最佳实践;MySQL查询优化……
热门资讯 1.2021年3月国产数据库排行榜:雏凤声清阿里三连 绝代双骄华为合璧 [摘要]2021年3月国产数据库流行度排行榜已出炉,在本月排行的前十名中,TiDB 仍然以领先第二名135分 的优势稳 ...
- JDBC后端实现登录的逻辑
// 包名 package com.zhulx.JDBC; // 导入实例类 import com.zhulx.pojo.Account; import java.sql.Connection; im ...
- oracle中排序分析函数row_number()、rank()、dense_rank() 的区别,与rownum的注意事项
row_number()产生的序号不会重复,即1.2.3... rank()产生的序号会重复,但是会跳号,出现1.2.2.4...的情况 dense_rank()产生的序号会重复,不会跳号,会出现1. ...
- 6.19 成都站云原生 Meetup,KubeSphere 和 APISIX 等你来!
以容器技术和容器编排为基础的云原生应用,被越来越多的企业用户接受和使用,并且在生产环境中使用容器技术的比例逐年增加.KubeSphere 作为一款面向应用的开源容器混合云,经过 3 年的发展和 10 ...
- vscode中整合豆包MarsCode编程助手
豆包MarsCode是字节跳动旗下的一款AI工具,最近在刷帖子时看到已经可以在vscode中通过插件安装MarsCode工具,接下来我们来看下操作流程以及使用效果. 第一步:首先需要注册下豆包账号 豆 ...