應(yīng)用束
應(yīng)用束的構(gòu)造
Cocoa應(yīng)用會(huì)將可執(zhí)行文件或必要的資源格式保存在一個(gè)委托結(jié)構(gòu)中而线,這稱為應(yīng)用束(application bundle),應(yīng)用包裝(wrapper)或應(yīng)用包嗡官。
像這樣箭窜,將幾個(gè)文件或目錄以確定的形式保存到目錄結(jié)構(gòu)中,然后再作為一個(gè)集合進(jìn)行處理衍腥,在Cocoa中是很常見(jiàn)的方法磺樱。這樣的結(jié)構(gòu)一般稱為束。
nib文件和各語(yǔ)言資源
使用Xcode(Interface Builder)生成的GUI定義被寫到nib文件中紧阔。nib文件的后綴為“nib”坊罢,也就是Next Interface Builder。應(yīng)用的菜單和窗口組件的配置等信息會(huì)被歸檔化擅耽,并在執(zhí)行時(shí)被動(dòng)態(tài)讀入活孩。
nib文件的后綴名為“nib”或“xib”,xib是XML格式文件乖仇,兩種后綴的文件內(nèi)容相同憾儒,在構(gòu)建應(yīng)用時(shí),會(huì)作為帶有后綴“nib”的資源文件保存在應(yīng)用束中乃沙。
Storyboard是以場(chǎng)景移動(dòng)為中心來(lái)構(gòu)造GUI的起趾,所以比較適合邊顯示邊處理這樣的應(yīng)用的架構(gòu)。在各場(chǎng)景內(nèi)部警儒,對(duì)象間的關(guān)系和nib文件相同训裆。在應(yīng)用被構(gòu)建的同時(shí),Storyboard內(nèi)部也會(huì)變?yōu)閚ib文件資源蜀铲。
與語(yǔ)言無(wú)關(guān)的共享資源在Mac OS系統(tǒng)中被放置在Resources目錄下边琉,在iOS系統(tǒng)下則被放置在應(yīng)用束目錄下。根據(jù)所選擇的語(yǔ)言種類來(lái)切換的資源被放置在“語(yǔ)言名.lproj”目錄下记劝。后綴來(lái)自于language project变姨,并從NeXTstep時(shí)期開始使用。
應(yīng)用在運(yùn)行時(shí)厌丑,會(huì)在運(yùn)行環(huán)境中查找選擇的(或是高優(yōu)先度的)語(yǔ)言子目錄定欧,并使用其中的資源渔呵。NSBundle類執(zhí)行資源檢索,因此程序就不需要記錄指定語(yǔ)言的編碼砍鸠。
使應(yīng)用能夠?qū)?yīng)特定語(yǔ)言的過(guò)程稱為本地化(localize)扩氢。在Cocoa應(yīng)用中,如果能在編程時(shí)使之對(duì)應(yīng)多種語(yǔ)言,那么之后只需在應(yīng)用束中追加特定語(yǔ)言的資源就能簡(jiǎn)單的實(shí)現(xiàn)本地化期贫。
信息文件的主要內(nèi)容
使用應(yīng)用束時(shí),信息內(nèi)文件關(guān)鍵詞CFBundleIdentifier指定的字符串稱為應(yīng)用標(biāo)識(shí)符(application identifier),該標(biāo)識(shí)符常被用來(lái)在系統(tǒng)中尋找相應(yīng)的應(yīng)用程序庸推。為了不產(chǎn)生重名,推薦使用Java的包定義方式另萤。例如:com.apple.iPhoto浑槽。
通過(guò)NSBundle訪問(wèn)資源
NSBundle是為各種束提供接口的類,可以從指定的束中搜索有GUI定義的nib文件领舰,圖像夫嗓,聲音,加載代碼等冲秽。
(NSBundle *)mainBundle
//程序所包含的應(yīng)用束也稱為主束舍咖,該方法返回魚主束的路徑相對(duì)應(yīng)的對(duì)象。不能識(shí)別時(shí)返回nil锉桑。(NSBundle *)bundleWithPath:(NSString *)path
//返回path指定路徑的束對(duì)象排霉,沒(méi)有path可訪問(wèn)的束時(shí)返回nil。此外還有使用NSURL指定位置的方法BundleWithURL:
(NSString *)bundleIdentifier
//返回信息文件(info.plist)中指定的應(yīng)用程序名(NSDictionary *)infoDictionary
//將信息文件(info.plist)的內(nèi)容作為字典對(duì)象返回(id)objectForInfoDictionaryKey:(NSString *)key
//在信息文件中返回以參數(shù)key為鍵值的對(duì)象民轴」ツ可能的話將其本地化后返回(NSString *)pathForResource:(NSString *)name ofType:(NSString *)extension
//在接收者的束內(nèi),返回name指定的名字和extension指定的有后綴的資源路徑名后裸。文件沒(méi)有后綴時(shí)瑰钮,將extension指定為nil或@“”。找不到文件時(shí)返回nil微驶。同樣也有使用NSURL返回位置的方法URLForResource:withExtension:浪谴。獲取保存資源的路徑可以采用resourcePath方法。
此外因苹,在Mac OS平臺(tái)中苟耻,可以利用pathForImageResource:方法獲得圖像路徑。它是Application框架中被作為范疇添加到NSBundle中的方法容燕。其他nib文件或聲音文件的獲取方法請(qǐng)參考“NSBundle Additions Refrerence”梁呈。
iOS中的資源訪問(wèn)
如前所述,iOS中也可以使用NSBundle方法來(lái)訪問(wèn)資源蘸秘。但是官卡,因?yàn)閕OS有特殊的后綴蝗茁,所以這里先介紹一下概要。
在iOS中寻咒,為了適應(yīng)所有的設(shè)備哮翘,nib文件的內(nèi)容和圖像的大小就必須要改變,下面有一種指定方法毛秘,即根據(jù)所使用的設(shè)備來(lái)自動(dòng)選擇資源或參數(shù)饭寺。
1.按設(shè)備準(zhǔn)備任意資源
在iOS中,當(dāng)束的檢索請(qǐng)求被指定為“文件名.后綴”這樣的文件時(shí)叫挟,就會(huì)搜索如下的文件艰匙。文件名~設(shè)備.后綴
2.準(zhǔn)備高像素圖片
文件名@2x.后綴名
文件名@2x~設(shè)備.后綴名(兼容上述設(shè)備指定時(shí))
UIKit框架中使用類UIImage來(lái)處理圖像。該類可以使用如下方法檢索并加載主束內(nèi)的圖片文件抹恳,生成包含圖片的實(shí)例员凝。
- (UIImage)imageNamed:(NSString *)name
3.使用信息文件的鍵值字符串指定設(shè)備
為了和設(shè)備相匹配,可以詳細(xì)設(shè)置信息文件中讀入的信息奋献。
在一般的鍵值字符串后加上后綴“~設(shè)備”健霹,即可表示僅此設(shè)備適用。關(guān)于iOS資源的詳細(xì)內(nèi)容瓶蚂,請(qǐng)參考“iOS Application Programming Guide”“iPad Programming Guide”“Resource Programming Guide”等參考文檔糖埋。
通用二進(jìn)制
通用二進(jìn)制(universal binary)是蘋果公司的專門術(shù)語(yǔ),是為了能在多個(gè)操作系統(tǒng)不同的CPU上運(yùn)行而生成的可執(zhí)行文件形式窃这。
加載nib文件
nib文件實(shí)例化
nib文件定義了GUI組件間的通信消息瞳别,其中必須有一個(gè)稱為所有者的對(duì)象。所有者就是連接nib文件內(nèi)的對(duì)象群和外部世界的橋梁钦听。nib文件的訪問(wèn)基本上都是通過(guò)所有者來(lái)傳達(dá)的洒试。
nib文件是對(duì)象圖的歸檔,所有者的作用就相當(dāng)于根對(duì)象朴上。但是nib文件也可以生成無(wú)指向的指針對(duì)象垒棋。
在Mac OS中加載nib文件
- (BOOL)loadNibNamed:(NSString *)aNibName owner:(id)owner
//在束內(nèi)查找字符串指定的nib文件(不需要后綴名),并將所有者對(duì)象owner實(shí)例化痪宰。如果失敗就返回NO叼架。
在使用引用計(jì)數(shù)的管理方式管理內(nèi)存時(shí),nib文件內(nèi)的所有(除了所有者)對(duì)象都會(huì)被引用計(jì)數(shù)置為1并被實(shí)例化衣撬。接著乖订,構(gòu)造對(duì)象間的引用關(guān)系,被其他對(duì)象持有的對(duì)象則通過(guò)autorelease來(lái)釋放所有者關(guān)系具练。如果nib文件中存在沒(méi)有被引用的對(duì)象乍构,那么最終只有該對(duì)象不會(huì)被釋放,所以就需要使用其他方法來(lái)釋放內(nèi)存扛点。
使用垃圾回收時(shí)哥遮,所有者強(qiáng)引用的對(duì)象因?yàn)榭梢栽L問(wèn)所以沒(méi)有任何問(wèn)題岂丘。而如果nib文件中存在沒(méi)有被引用的對(duì)象,那么該對(duì)象在實(shí)例化后就有被釋放的危險(xiǎn)眠饮。
在iOS中加載nib文件
- (NSArray *)loadNibNamed:(NSString *)name owner:(id)owner options:(NSDictionary *)options
//在束內(nèi)查找字符串命名的nib文件奥帘,并將所有者對(duì)象owner實(shí)例化。參數(shù)options中可以指定選項(xiàng)仪召,一般置為nil寨蹋。在nib文件中,沒(méi)有被其他對(duì)象包含的對(duì)象(頂級(jí)對(duì)象)將用數(shù)組保存并返回扔茅。
在iOS中已旧,nib文件內(nèi)的所有(除了所有者)對(duì)象都會(huì)被引用計(jì)數(shù)置為1并被實(shí)例化。接著咖摹,構(gòu)筑對(duì)象間的引用關(guān)系评姨,被其他對(duì)象持有的對(duì)象則通過(guò)autorelease來(lái)釋放所有者關(guān)系。使用鍵值編碼的setValue:forKey:方法來(lái)設(shè)定對(duì)象的出口萤晴。需要明確出口所使用的實(shí)例變量的引用,存儲(chǔ)方式時(shí)胁后,請(qǐng)準(zhǔn)備設(shè)置或聲明屬性店读。
nib文件內(nèi)的包含循環(huán)
使用ARC管理內(nèi)存時(shí),nib文件內(nèi)的對(duì)象之間容易形成包含循環(huán)攀芯,這一點(diǎn)一定要注意避免屯断。
自定義對(duì)象包含的出口原則上應(yīng)該通過(guò)弱引用才能使用。
一定要注意不要有空指針侣诺,不管是否是弱引用殖演,在釋放對(duì)象前,都需要將引用其他對(duì)象的實(shí)例變量賦值為nil年鸳。
nib文件內(nèi)對(duì)象的初始化
nib文件內(nèi)包含的對(duì)象如果實(shí)現(xiàn)了如下方法趴久,在實(shí)例化后該方法就會(huì)運(yùn)行。
- (void)awakeFromNib
//從nib文件中讀出搔确,在完成實(shí)例化彼棍,出口及訪問(wèn)的連接后調(diào)用該方法。該方法被聲明為非正式協(xié)議膳算。
啟動(dòng)應(yīng)用
應(yīng)用最先讀入的nib文件中座硕,保存著菜單等運(yùn)行應(yīng)用所需要的重要信息,這稱為主nib文件涕蜂,信息文件中也有文件名华匾,該文件在應(yīng)用啟動(dòng)后運(yùn)行回路啟動(dòng)前被讀入。
NSApplication實(shí)例在應(yīng)用啟動(dòng)后僅被生成一個(gè)机隙,除運(yùn)行回路外蜘拉,還負(fù)責(zé)管理應(yīng)用的各種資源萨西。
Mac OS 應(yīng)用:
int NSApplicationMain(int argc, char *argv[]) {
[NSApplication sharedApplication];
//生成NSApplication實(shí)例
if ([NSBundle loadNibName:主nib名 owner:NSApp]) //加載主nib文件
[NSApp run]; //啟動(dòng)運(yùn)行回路
}
此外,應(yīng)用中所固有的各種初始化設(shè)置诸尽,不需要放在main函數(shù)中原杂,而是應(yīng)該寫到NSApplication和UIApplication的委托對(duì)象中。應(yīng)用啟動(dòng)后您机,由于通知啟動(dòng)完成的消息會(huì)被送給委托對(duì)象穿肄,因此應(yīng)在委托內(nèi)部書寫。詳情請(qǐng)參考NSApplicationDelegate協(xié)議和UIApplicationDelegate協(xié)議的參考文檔
iOS的文件保存場(chǎng)所
主要目錄及其功能
在iOS中际看,為了安全起見(jiàn)咸产,應(yīng)用間的交換等會(huì)受到限制。文件保存的場(chǎng)所被局限在了各應(yīng)用所分配的特定場(chǎng)所中仲闽。該場(chǎng)所在應(yīng)用安裝時(shí)被決定脑溢,稱為home目錄。應(yīng)用程序包及生成的文件被保存在home目錄下赖欣,刪除應(yīng)用時(shí)會(huì)將其一并刪除屑彻。
應(yīng)用的home目錄下設(shè)置著主要目錄,各目錄具有不同的功能顶吮,所有路徑名都是固定的社牲,在這些文件夾中創(chuàng)建的文件,必須由應(yīng)用程序來(lái)管理悴了。不需要的文件會(huì)被刪除搏恤。
1.home/應(yīng)用名.app/
應(yīng)用束本身存放在這里。因?yàn)橛惺鹈圆荒芨淖儭?br>
2.home/Documents/
應(yīng)用生成并保存文件的場(chǎng)所湃交。與iTunes連接時(shí)啟動(dòng)備份熟空。而且將信息文件的鍵值UIFileSharingEnabled設(shè)定為YES后,就可以通過(guò)iTunes使文件和電腦同步搞莺。
3.home/Library/Preferences/
應(yīng)用設(shè)定被寫入息罗。與iTunes連接時(shí)被備份。
4.home/Library/Caches/
能夠?qū)?yīng)用臨時(shí)使用的信息作為文件保存在這里腮敌。在下一次啟動(dòng)時(shí)加載可以利用的操作歷史或操作過(guò)程等信息阱当。但是,在設(shè)備還原等時(shí)可能會(huì)隨時(shí)消失糜工。iTunes不會(huì)備份弊添。
5.home/tmp/
能夠?qū)?yīng)用臨時(shí)使用的信息作為文件保存在這里。在應(yīng)用不運(yùn)行期間可能會(huì)被系統(tǒng)釋放捌木。
獲取目錄路徑
在獲取上述目錄中的Documents和Caches的路徑時(shí)油坝,推薦使用Foundation框架的函數(shù)NSSearchPathForDirectoriesInDomains()。函數(shù)和使用的參數(shù)在Foundation/NSPathUtilities.h中聲明。
NSArray *NSSearchPathForDirectoriesInDomains(
NSSearchDirectory directory,
NSSearchPathDomainMask domainMask,
BOOL expandTilde
)
該函數(shù)本來(lái)是在Mac OS專用的澈圈,形參參數(shù)的組合在iOS中可能沒(méi)有意義彬檀。而且,由于返回?cái)?shù)組中之保存有一個(gè)路徑瞬女,所以請(qǐng)使用objectAtIndex:方法將首部的元素取出使用窍帝。第一個(gè)形參中指定目錄的種類。為了獲得Documents和Caches的路徑诽偷,請(qǐng)分別指定參數(shù)NSDocumentDirectory和NSCachesDirectory坤学。無(wú)論哪種情況,都請(qǐng)指定第二個(gè)形參為NSUserDomainMask报慕,第三個(gè)形參味YES深浮。而且tmp目錄的路徑可使用下面的函數(shù)獲取:NSString *NSTemporaryDirectory(void)眠冈。
用戶默認(rèn)
保存設(shè)定值
在Cocoa應(yīng)用中飞苇,為了保存用戶設(shè)定的設(shè)定值而使用了一種通用結(jié)構(gòu)—用戶默認(rèn)(user defaults),或者稱為默認(rèn)數(shù)據(jù)庫(kù)蜗顽。類NSUserDefaults提供了訪問(wèn)用戶默認(rèn)所需的接口布卡。詳情參考官方文檔。
默認(rèn)域
用戶默認(rèn)可以被分為多個(gè)組考慮雇盖,這些組稱為域或默認(rèn)域(defaults domain)羽利。在域中,有的將內(nèi)容保存在文件中并在之后繼續(xù)使用刊懈,而有的則僅在應(yīng)用啟動(dòng)時(shí)存在。下面將詳細(xì)說(shuō)明:
- 應(yīng)用域
使用屬性列表管理的應(yīng)用固有的設(shè)定值的集合娃闲。該設(shè)定值的集合稱為應(yīng)用域虚汛,域名中使用應(yīng)用標(biāo)識(shí)名。 - 全局域
使用者使用賬戶設(shè)定的各個(gè)應(yīng)用共享的設(shè)定值皇帮。域名為NSGlobalDomain卷哩。該域在iOS中也有效,可以獲得設(shè)定的語(yǔ)言或鍵盤信息属拾。 - 形參域
參數(shù)指定的設(shè)定值組就稱為參數(shù)域(argument domain)将谊。域名用NSArgumentDomain表示,且不能被保存在文件中渐白。iOS中不使用該域尊浓。 - 語(yǔ)言域
指定使用語(yǔ)言時(shí)會(huì)生成該語(yǔ)言名(例如ch)為域名的臨時(shí)域(不保存文件)。 - 登陸域
用戶尚未設(shè)定應(yīng)用的各種設(shè)定值時(shí)使用的默認(rèn)值集合纯衍。域名為NSRegistrationDomain栋齿,且不被保存在文件中。
當(dāng)應(yīng)用使用NSUserDefaults類從從鍵值中查找對(duì)應(yīng)的設(shè)定值時(shí),會(huì)按如下順序查找上述5個(gè)域瓦堵,并使用最先找到的值基协。
參數(shù)域 應(yīng)用域 全局域 語(yǔ)言域 登陸域
如果各種設(shè)定值都需要默認(rèn)值,可以將鍵和值的集合以字典方式組織菇用,并在應(yīng)用初始化時(shí)在登陸域中登陸澜驮。因?yàn)榈顷懹虿檎以谧詈髨?zhí)行,因此惋鸥,當(dāng)其他域都不能登錄時(shí)杂穷,就只能使用默認(rèn)值。
查找用戶默認(rèn)的工具
Mac OS 平臺(tái)下揩慕,用戶默認(rèn)除了在各個(gè)應(yīng)用中使用外亭畜,還可以通過(guò)直接編輯屬性列表,或使用命令行工具defaults來(lái)進(jìn)行訪問(wèn)迎卤。只在終端上輸入defaults就可以看到使用方法拴鸵,也可以使用man命令查看幫助手冊(cè)。
NSUserDefaults概要
- 取得實(shí)例對(duì)象
- (NSUserDefaults *)standardUserDefaults
//最初調(diào)用時(shí)將實(shí)例初始化后返回蜗搔。自第二次調(diào)用起劲藐,會(huì)返回同一個(gè)實(shí)例。
- 取出鍵對(duì)應(yīng)的值
要取出鍵對(duì)應(yīng)的值樟凄,可在NSUserDefaults實(shí)例中使用如下方法聘芜。
(id)objectForKey:(NSString *)defaultName
(NSString *)stringForKey:(NSString *)defaultName
(NSArray *)stringArrayForKey:(NSString *)defaultName
(NSInteger)integerForKey:(NSString *)defaultName
- 指定鍵并設(shè)置刪除
(void)setObject:(nullable id)value forKey:(NSString *)defaultName;
(void)setInteger:(NSInteger)value forKey:(NSString *)defaultName;
(void)setURL:(nullable NSURL *)url forKey:(NSString *)defaultName;
- 設(shè)定默認(rèn)值
- (void)registerDefaults:(NSDictionary *)registrationDictionary;
- 取出域內(nèi)容
- (NSDictionary *)dictionaryRepresentation;
- 在文件中顯示設(shè)定內(nèi)容
- (BOOL)synchronize;
應(yīng)用的本地化
消息的本地化
使用束結(jié)構(gòu)可以將程序顯示的消息與各種語(yǔ)言相對(duì)應(yīng)。為此缝龄,首先需要生成Localizable.strings文件汰现,并將其保存到各語(yǔ)言對(duì)應(yīng)的目錄(語(yǔ)言.lprog)中。文件名也可以為別的名字叔壤,不特別指定時(shí)使用Localizable.strings瞎饲。
Localizable.strings文件是將鍵字符串及鍵值字符串用等號(hào)連接成一對(duì),并在結(jié)尾設(shè)置分號(hào)炼绘。鍵和值都要用“”括起來(lái)嗅战。也可省略值,但也要同時(shí)刪除等號(hào)俺亮。值即使被省略驮捍,鍵本身也仍然會(huì)被當(dāng)成入口值。此外脚曾,也可以用/**/的形式來(lái)書寫命令东且。
鍵字符串一般使用ASCII碼,值字符串使用目標(biāo)語(yǔ)言(漢語(yǔ)等)斟珊。文件一定要使用UTF-16編碼苇倡。如果僅僅使用ASCII碼范圍內(nèi)的字符就可以記錄全部時(shí)富纸,保持ASCII編碼方式即可。
應(yīng)用本身的束(主束)的NSBundle對(duì)象旨椒,通過(guò)下面的消息晓褪,可以取得鍵值字符串。
- (NSString *)localizedStringForKey:(NSString *)key value:(nullable NSString *)value table:(nullable NSString *)tableName
NSLocalizedString(key, comment); //oc方式下不使用comment
NSLocalizedStringFromTable(key, tbl, comment); //oc方式下不使用comment
本地化指針
使用日語(yǔ)和英語(yǔ)不同综慎,顯示消息不能用日語(yǔ)編碼涣仿。即使只構(gòu)建日語(yǔ)應(yīng)用時(shí)也需要Localizable.strings。該文件以及定義了GUI的nib文件示惊,幫助等好港,包含日語(yǔ)的文件全都應(yīng)該被保存在ja.lproj目錄下。
如果僅僅是英語(yǔ)應(yīng)用米罚,則不需要擔(dān)心本地化钧汹。包括英語(yǔ)在內(nèi),面向各語(yǔ)言的子目錄和Localizable.strings基本上都不是必須的录择。但是拔莱,這樣的應(yīng)用被認(rèn)為沒(méi)有被國(guó)際化(internationalize)。相反隘竭,將這樣的應(yīng)用在事后進(jìn)行國(guó)際化或本地化是非常困難的塘秦。因?yàn)橄⑹菍懺谠闯绦蚶锩娴模员仨氁褂肗SLocalizedString()等來(lái)修改动看。
本地化
本地化(locale)就是編輯文本時(shí)的各種習(xí)慣或使用單位等的集合體尊剔。例如,表示日期的方式菱皆,作為小數(shù)點(diǎn)使用的字符等须误,根據(jù)國(guó)家和語(yǔ)言的不同是存在差異的。為了生成在任何語(yǔ)言環(huán)境下都能通用的軟件仇轻,就需要事先準(zhǔn)備好這些字體霹期,然后再在軟件操作時(shí)選擇適合的顯示。
為了表示本地化拯田,Cocoa環(huán)境提供了NSLocale類,當(dāng)創(chuàng)建可以應(yīng)對(duì)各種語(yǔ)言或地域習(xí)慣的應(yīng)用時(shí)甩十,就可以使用該類船庇。用戶根據(jù)使用環(huán)境而選擇的本地化信息稱為當(dāng)前本地化,應(yīng)用使用當(dāng)前本地化進(jìn)行操作侣监。
消息內(nèi)的語(yǔ)序:
通常鸭轮,格式字符串內(nèi)的格式符(%s等)可以與后面的參數(shù)依次對(duì)應(yīng)。通過(guò)在格式符%后指定“數(shù)字”+“$”橄霉,就可以將數(shù)字指定順序的參數(shù)窃爷,在該位置處發(fā)生變換。例如:下面的printf就會(huì)輸出“Good:100”。
printf("%2$s: %1$d\n", 100, "Good");
模塊的動(dòng)態(tài)加載
該功能無(wú)法在iOS中使用按厘。僅在Mac OS中可以使用医吊。
沙盒(App Sandbox)
App Store中出售,發(fā)布的Mac OS應(yīng)用為了強(qiáng)化其安全性逮京,必須使用App SandBox來(lái)實(shí)現(xiàn)卿堂。沙盒就是只能在預(yù)先設(shè)定好的權(quán)限條件下運(yùn)行的應(yīng)用執(zhí)行環(huán)境。在開發(fā)和使用App SandBox的應(yīng)用時(shí)懒棉,會(huì)在Xcode中設(shè)置它應(yīng)該具有什么資格草描。例如,是否可以讀寫文件策严,是否可以訪問(wèn)網(wǎng)絡(luò)穗慕,是否可以使用系統(tǒng)攝像頭等。由于這些被放入了代碼署名中妻导,因此即使受到惡意影響逛绵,也不能執(zhí)行預(yù)先設(shè)定之外的動(dòng)作。而且栗竖,與iOS相同暑脆,應(yīng)用可以讀寫文件的場(chǎng)所也收到了限定。