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];
相关推荐
亘元有量-流量变现2 分钟前
ASO优化全流程实操指南:从基础到迭代,精准提升App曝光与转化
android·ios·harmonyos·aso优化·方糖试玩
zhangjikuan891 小时前
iOS屏幕适配方案
ios
tangweiguo0305198717 小时前
SwiftUI布局完全指南:从入门到精通
ios·swift
T1an-121 小时前
最右IOS岗一面
ios
坏小虎1 天前
Expo 快速创建 Android/iOS 应用开发指南
android·ios·rn·expo
光影少年1 天前
Android和iOS原生开发的基础知识对RN开发的重要性,RN打包发布时原生端需要做哪些配置?
android·前端·react native·react.js·ios
北京自在科技1 天前
Find My 修复定位 BUG,AirTag 安全再升级
ios·findmy·airtag
Digitally1 天前
如何不用 USB 线将 iPhone 照片传到电脑?
ios·电脑·iphone
Sim14802 天前
iPhone将内置本地大模型,手机端AI实现0 token成本时代来临?
人工智能·ios·智能手机·iphone
Digitally2 天前
如何将 iPad 上的照片传输到 U 盘(4 种解决方案)
ios·ipad