ios文件管理,沙盒机制以及如何操作“文件”APP,把文件共享到文件app

首先,系统是一个整体,那每个app是相互独立的,系统为每个app分配了一定的存储空间,也就是我们说的沙盒,每个app有自己独立的沙盒,文件存储在沙盒中,正常情况下app相互之间数据是不可以共享以及访问的,我们在手机上也是看不到每个应用的沙盒的。相互共享访问需要做相关的一些处理才可以,这个后面讲。

1、沙盒

每个iOS程序都有一个独立的文件系统(存储空间),而且只能在对应的文件系统中进行操作,此区域被称为沙盒

下面这个就是一个完整的沙盒目录

Documents: 该目录用于存放用户生成的文件,用户可以直接访问(itunes备份时会备份)。

Library: 该目录用于存放应用的支持文件和数据,通常不需要用户的直接访问。

Caches: Library下的Caches目录用于存放缓存数据,可以被系统清理。

tmp: 临时目录,用于存放临时文件,系统可能会在应用不运行时清除这些文件。

2、把沙盒中的文件共享到"文件"app中

我们说每个app有自己的沙盒,并且沙盒中的文件不能被其他app访问,但是我们有时候需要把app内部的文件暴露出来怎么办呢,比如我在app中下载文件,下载完后希望大家手机可以找到这个文件并常看。这个需求其实是可以实现的,ios系统自带一个叫做文件的app,假如我们能把沙盒的文件弄到这个文件app中来不就解决问题了吗?

首先系统的"文件"这个app不是可以管理全部的app下的文件,他只能管理对"文件"这个app开放权限的APP,所以想要把文件弄到这个文件app中,就需要给app开放被文件来管理的权限。

操作如下:

(1)首先打开开发者账号,选择你要添加icloud的boundid把icloud配置勾选上

(2)项目工程配置

点击Caoablity左侧的加号,搜索iCloud,然后添加即可

(3)设置info.plist

第一个是在info.plist中添加Application supports iTunes file sharing,并设置成YES,这个有权限使 iTunes 分享你文件夹内的内容

第二个是在info.plist中添加Supports opening documents in place,并设置成YES,它保证了你文件夹内本地文件的获取权限

(4)控制哪些文件显示在文件app,哪些不显示

首先只有可以被itunes备份的文件才会分享到文件app中,上面我们说沙盒的几个目录也提到,Documents文件夹下的文件会被分享,所以想要文件在文件app中显示,只需要把文件移动到Documents目录下就可以

3、如何实现两个app共享一份数据

首先这里涉及两个app,这两个app必须在一个开发者账号下,通过创建一个App Groups来实现这个功能,也就是两个app对应一个App Groups

(1)创建App Groups

打开开发者账号,选择Identifiers下面的App Groups,选择之后点continue

然后确认就行了,到这里两个app共同需要的App Groups就创建好了

(2)开发者账号中分别找到两个app项目对应的bundleID,选择之后编辑,在bundleID里添加刚才创建好的App Groups

(3)配置工程

分别打开两个程序,切换到Capabilities选项卡,找到App Groups选项,刷新一下,将App developer中的App Groups同步下来,然后勾选上咱们刚才创建的开发组。

Xcode中配置App Groups

当我们配置完以后,会在文件目录下多出来一个.entitlements的文件。

(4)用代码创建实现共享文件

通过NSFileManager的方式主 App写入数据

objectivec 复制代码
//Main App 通过TextField来向共享文件appGroup.txt中写入数据
- (void)textFieldDidEndEditing:(UITextField *)textField {
    //获取App Group的共享目录
    NSURL *groupURL = [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:@"GroupID"];
    NSURL *fileURL = [groupURL URLByAppendingPathComponent:@"appGroup.txt"];
    
    //写入文件
    [textField.text writeToURL:fileURL atomically:YES encoding:NSUTF8StringEncoding error:nil];
}

通过NSUserDefaults的方式主 App写入数据

objectivec 复制代码
NSUserDefaults *sharedDefaults = [[NSUserDefaults alloc] initWithSuiteName:"GroupID"];
[sharedDefaults setObject:fileName forKey:FileKey];
[sharedDefaults synchronize];

接下来通过NSFileManager的方式子app读取数据

objectivec 复制代码
//Sub App 通过获取appGroup.txt中的数据,展现在label上

//获取App Group的共享目录
    NSURL *groupURL = [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:@"GroupID"];
    NSURL *fileURL = [groupURL URLByAppendingPathComponent:@"appGroup.txt"];
    
    //读取文件
    NSString *str = [NSString stringWithContentsOfURL:fileURL encoding:NSUTF8StringEncoding error:nil];
    self.shareLabel.text = str;

通过NSUserDefaults的方式子app读取数据

objectivec 复制代码
NSUserDefaults *sharedDefaults = [[NSUserDefaults alloc] initWithSuiteName:"GroupID"];
NSString *fileName = [sharedDefaults objectForKey:FileKey];
相关推荐
2501_916008896 小时前
iOS应用开发工具全面解析:如何选择与优化开发效率
ide·vscode·ios·objective-c·个人开发·swift·敏捷流程
a4493153626 小时前
iPhone Face ID 故障的分层诊断——原深感系统与主板加密配对机制
macos·ios·电脑·cocoa·iphone
白玉cfc6 小时前
【iOS】内存五大分区
macos·ios·cocoa
二流小码农10 小时前
鸿蒙开发:以登录案例了解代码架构MVVM
android·ios·harmonyos
GitLqr11 小时前
别在 Flutter 的 main() 里乱锁屏幕方向,小心 iPad 分屏功能被你搞没了
android·flutter·ios
a44931536215 小时前
iPhone 基带故障诊断——无服务/搜索不到网络的芯片级维修实录
网络·macos·ios·电脑·iphone
Summer-Bright17 小时前
消费者 AI 变现竞争:从“一家独大“到“iOS vs Android“,谁在为 AI 买单?
android·人工智能·ios·ai·自然语言处理·agi
a44931536218 小时前
iPhone 充电故障的全链路诊断——从 Lightning/USB-C 接口到 Tristar 充电 IC
c语言·macos·ios·电脑·硬件架构·iphone
大龄秃头程序员2 天前
揭秘 KVC 底层:Objective-C KVC 究竟依赖了哪些 Runtime 能力
objective-c