iOS开发之沙盒机制(SandBox)

iOS APP可以在自己的沙盒里读写文件,但是,不可以访问其他APP的沙盒。每一个APP都是一个信息孤岛,相互是不可以进行通信的,唯独可以通过URL Scheme。沙盒里面的文件可以是照片、声音文件、文本、属性列表等。


沙盒机制介绍

沙盒简述:

1.每一个APP都有一个存储空间,就是沙盒.

2.APP之间不能互相通信

3.沙盒根目录结构:Documents, Library, temp


简述一下Documents, Library, temp的区别:

1.Documents:  用于存储用户数据,  iTunes备份和恢复的时候会包括此目录, 所以, 苹果建议将程序中建立的或在程序中浏览到的文件保存在改目录下.

2.Library: 包含两个子目录 : Caches和Preferences.  Caches用来存放用户需要换成的文件, Preferences是APP的偏好设置, 可以通过NSUserDefaults来读取和设置.

3.tmp: 用于存放临时文件,这个可以放一些当APP推出后不需要的文件


打开模拟器沙盒方法

方法一:前往文件夹打开

/Users/ligang/Library/Application Support/iPhone Simulator/ 

直接在Finder->前往->前往文件夹,输入上面的内容即可。记住将ligang换成你的电脑用户名。

方法二:通过Finder一步步查找

模拟器上的APP的沙盒实在用户目录下的资源库里面,但是资源库是隐藏文件夹。所以查看沙盒之前,现将隐藏文件夹显示出来。显示隐藏文件的命令:

defaults write com.apple.finder AppleShowAllFiles -bool true

用心的童鞋会发现,隐藏隐藏文件的命令:

defaults write com.apple.finder AppleShowAllFiles -bool false

查找步骤请看图:

sandbox





iOS开发之获取沙盒路径


获取沙盒根目录

获取沙盒根目录,直接调用NSHomeDirectory():

 //获取沙盒根目录
NSString *directory = NSHomeDirectory();
NSLog(@"directory:%@", directory);

控制台输出:

2015-07-22 00:40:16.185 iOSStrongDemo[1605:555658] directory:/var/mobile/Containers/Data/Application/F9418815-51A9-4A0A-A76C-6FD37C400928

这个是真机的路径,大家有时间的话可以看看模拟器的根目录路径。

获取Documents路径

获取Documents路径如下:

//获取Documents路径
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *path = [paths objectAtIndex:0];
NSLog(@"path:%@", path);

控制台输出:

2015-07-22 00:41:41.397 iOSStrongDemo[1613:556159] path:/var/mobile/Containers/Data/Application/A62B886B-A8F0-4215-B59D-1F505C3997BD/Documents

获取Documents文件夹目录,第一个参数是说明获取Doucments文件夹目录,第二个参数说明是在当前应用沙盒中获取。

获取Library路径

 //获取Library路径
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);
NSString *path = [paths objectAtIndex:0];
NSLog(@"path:%@", path);

控制台输出:

2015-07-22 00:43:15.803 iOSStrongDemo[1619:556638] /var/mobile/Containers/Data/Application/17300507-4643-4DE7-BC68-E13DB19C8D98/Library

获取Caches路径

//获取Caches路径
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
NSString *path = [paths objectAtIndex:0];
NSLog(@"path:%@", path);

控制台输出:

2015-07-22 00:44:31.383 iOSStrongDemo[1626:557083] path:/var/mobile/Containers/Data/Application/1E945B52-E29D-4041-A489-1AA1B11BB960/Library/Caches

获取tmp路径

NSString *tmp = NSTemporaryDirectory();
NSLog(@"tmp:%@", tmp);

控制台输出:

2015-07-22 00:46:07.846 iOSStrongDemo[1632:557537] tmp:/private/var/mobile/Containers/Data/Application/4BE02307-1CC5-47E8-BEA8-CEBB7ED5A402/tmp/

以上是iOS开发中获取沙盒路径的方法,也许还有更好的获取方法等待我们去发现。后面我们还会讲到关于在沙盒里进行读写文件操作。



//

//  Boss.h


#import <Foundation/Foundation.h>


@interface Boss : NSObject<NSCoding>

@property (nonatomic, retain) NSString *name;

@property (nonatomic, retain) NSString *gender;

@property (nonatomic, assign) NSInteger number;

@property (nonatomic, assign) NSInteger phone;

@end


//

//  Boss.m



#import "Boss.h"


@implementation Boss


- (void)encodeWithCoder:(NSCoder *)aCoder{

   //编码的方法, 本质上是把分布在内存不同位置的数据集合起来生成一个NSData

    [aCoder encodeObject:self.name forKey:@"name"];

    [aCoder encodeObject:self.gender forKey:@"gender"];

    

    [aCoder encodeInteger:self.number forKey:@"number"];

    [aCoder encodeInteger:self.phone forKey:@"phone"];

}

- (id)initWithCoder:(NSCoder *)aDecoder{

    

    //解码方法, 本质上是把NSData数据按照编码的key 一个个读取出来  重新给一个新的对象赋值的过程

    self = [super init];

    if (self) {

        self.name = [aDecoder decodeObjectForKey:@"name"];

        self.gender = [aDecoder decodeObjectForKey:@"gender"];

        

        self.number = [aDecoder decodeIntegerForKey:@"number"];

        self.phone = [aDecoder decodeIntegerForKey:@"phone"];

    }

    

    return self;

}


- (void)dealloc{

    [_gender release];

    [_name release];

    [super dealloc];

}


@end



#import "MainViewController.h"

#import "Boss.h"

@interface MainViewController ()


@end


@implementation MainViewController


- (void)viewDidLoad {

    [super viewDidLoad];

    // Do any additional setup after loading the view.

    self.view.backgroundColor = [UIColor whiteColor];

    

    NSLog(@"%@", NSHomeDirectory());

    

    //沙盒中的文件夹

    

    //1.Documents:文档文件夹,保存用户的数据,最好不要保存体积很大的文件

    

    //2.Caches:缓存文件夹,应用程序的缓存内容(图片/数据/视频/音频....)

    

    //3.Preferences:偏好设置文件夹,给开发者保存数据使用

    

    //4.tmp:临时文件夹,

    

    //把简单对象写入本地

    // .字符串写入本地

    

    NSString *str = @"你好";

    

    // 创建一个文件路径

    // 获取Documents文件夹得路径

    //参数1: 要找哪个文件夹得路径

    //参数2; 寻找范围

    //参数3: 是不是绝对路径

    NSString *docPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];

    

    

    

    //拼接一个文件名, 生成一个文件路径

    NSString *strPath  =[docPath stringByAppendingFormat:@"/aaa.txt"];

    //参数1;文件路径

    //参数2:对写入过程进行线程保护

    //参数3:编码形式

    [str writeToFile:strPath atomically:YES encoding:NSUTF8StringEncoding error:nil];

    

    NSLog(@"文件路径: %@", strPath);

    

    NSString *str1 = [NSString stringWithContentsOfFile:strPath encoding:NSUTF8StringEncoding error:nil];

    NSLog(@"*****%@", str1);

    

    //. 数组写入本地

    NSArray *arr = @[@"张家玮", @"王威武"];

    NSString *arrPath = [docPath stringByAppendingPathComponent:@"arr.plist"];

    [arr writeToFile:arrPath atomically:YES];

    

    

    //. 字典写入本地

    NSDictionary *dic = @{@"key":@"value", @"key1":@"value1"};

    NSString *dicPath = [docPath stringByAppendingPathComponent:@"dic.xml"];

    

    [dic writeToFile:dicPath atomically:YES];

    

    //根据路径读取数据

    

    

    NSArray *readArr = [NSArray arrayWithContentsOfFile:arrPath];

    NSLog(@"%@", readArr);

    

    //. 复杂对象写入本地

    

    //自己创建的类产生的对象,叫复杂对象

    

    Boss *boss = [[Boss alloc] init];

    boss.name = @"张家玮";

    boss.gender = @"unknown";

    boss.number = 2;

    boss.phone = 120;

    

    NSString *bossPath = [docPath stringByAppendingPathComponent:@"boss.suibian"];

    

    //归档类:负责把一个对象, 写入本地/生成NSData

    

    

    [NSKeyedArchiver archiveRootObject:boss toFile:bossPath];

    

    

    //反归档类: 负责读取本地的数据, 产生一个新的对象

   Boss *newBoss = [NSKeyedUnarchiver unarchiveObjectWithFile:bossPath];

    NSLog(@"%@", newBoss.name);

}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
iOS和安卓的沙盒是用来保护应用程序数据的安全性的一种机制。它们的主要区别如下: 1. 安全性:iOS沙盒机制相对安卓更加严格。iOS要求应用程序在自己的沙盒内运行,限制了应用之间的直接访问和交互。而安卓的沙盒机制相对较弱,应用程序可以更容易地访问和共享数据。 2. 文件系统结构:iOS沙盒机制将每个应用程序的文件分隔为多个目录,包括应用程序包、文档目录、缓存目录等。每个目录只能由特定的应用程序进行访问和写入。而安卓的沙盒机制通常是基于应用的用户ID,并且应用程序可以自由地向沙盒中的文件系统写入和访问。 3. 权限管理:iOS沙盒机制通过权限管理来限制应用程序对系统资源的访问。应用程序需要在安装时声明所需的访问权限,并由用户在使用时授予。而安卓的沙盒机制在应用程序安装时会一次性获取所有权限,并且用户只能在软件设置中进行修改。 4. 应用程序的更新:iOS沙盒机制要求每个应用程序都在单独的容器中运行,因此应用程序的更新通常是通过替换整个应用程序包来完成的。而安卓的沙盒机制允许应用程序在更新时只替换其中的部分文件,从而减少下载和更新时间。 综上所述,iOS和安卓的沙盒机制在安全性、文件系统结构、权限管理和应用程序更新方面存在一些差异。iOS沙盒机制相对更严格,保护了应用程序和用户数据的安全性,但也可能限制了应用程序之间的交互。而安卓的沙盒机制相对较弱,允许应用程序更自由地访问和共享数据,但也可能增加了安全隐患。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

卡搜偶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值