一開始我用的方法一寫,但是后來發(fā)現(xiàn)在高系統(tǒng)上報(bào)錯(cuò)(大概報(bào)錯(cuò)內(nèi)容:NSCocoaErrorDomain:257)。
創(chuàng)新互聯(lián)成都網(wǎng)站建設(shè)按需制作網(wǎng)站,是成都網(wǎng)站設(shè)計(jì)公司,為混凝土攪拌站提供網(wǎng)站建設(shè)服務(wù),有成熟的網(wǎng)站定制合作流程,提供網(wǎng)站定制設(shè)計(jì)服務(wù):原型圖制作、網(wǎng)站創(chuàng)意設(shè)計(jì)、前端HTML5制作、后臺(tái)程序開發(fā)等。成都網(wǎng)站營銷推廣熱線:028-86922220
后來解決了,做個(gè)記錄。
1、在低于iOS13的系統(tǒng)中。用創(chuàng)建文件夾的形式可以如下:
+ (NSString *)tmpLogPath
{
NSString *docPath = [NSHomeDirectory() stringByAppendingPathComponent:@"Library"];
NSString *dirPath = [docPath stringByAppendingPathComponent:@"mylog"];
NSString *filePath = [dirPath stringByAppendingPathComponent:@"tmpLog.txt"];
return filePath;
}
+ (void)writeTmpLog:(NSString *)aMsg
{
NSString *filePath = [[self class] tmpLogPath];
if (![[NSFileManager defaultManager] fileExistsAtPath:filePath]) {
? ? BOOL isDir = NO;
? ? BOOL hasDir = [[NSFileManager defaultManager] fileExistsAtPath:filePath isDirectory:isDir];
? ? if (!hasDir || !isDir) {
? ? ? ? [[NSFileManager defaultManager] createDirectoryAtPath:filePath withIntermediateDirectories:NO attributes:nil error:nil];
? ? }
}
NSError *error;
NSString *content =[NSString stringWithContentsOfFile:filePath
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? encoding:NSUTF8StringEncoding
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? error:error];
NSString *newContent = [NSString stringWithFormat:@"%@\n%@",content,aMsg];
[newContent writeToFile:filePath atomically:YES encoding:NSUTF8StringEncoding error:nil];
}
+ (void)clearTmpLog
{
NSString *filePath = [[self class] tmpLogPath];
[@"" writeToFile:filePath atomically:YES encoding:NSUTF8StringEncoding error:nil];
}
2、但是在iOS13上,不能這樣寫。系統(tǒng)會(huì)默認(rèn)創(chuàng)建以為***.txt的文件夾,在寫入的時(shí)候就出問題了。
會(huì)報(bào)錯(cuò):NSCocoaErrorDomain:257 就是
NSFileReadNoPermissionError = 257,/ /讀取錯(cuò)誤(權(quán)限問題)
所以可以這樣寫:
+ (NSString *)tmpLogPath {
NSString *documentPath = [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) lastObject];
NSString *filePath = [documentPath stringByAppendingPathComponent:@"mylog/tmpLog.txt"];
returnfilePath;
}
+ (void)writeTmpLog:(NSString*)aMsg {
NSString*fieldPath = [[self class]tmpLogPath];
NSLog(@"當(dāng)前文件大小:%llu",[self fileSizeWithPath:fieldPath]);
NSFileManager *manager = [NSFileManager defaultManager];
if(![managerfileExistsAtPath:fieldPath]){
? ? NSError*error;
? ? [aMsgwriteToFile:fieldPath atomically:YES encoding:NSUTF8StringEncoding error:error];
? ? if(error) {
? ? ? ? NSLog(@"寫入失敗:%@\n",[error localizedDescription]);
? ? }
}else{
? ? NSError*error;
? ? NSError*writeError;
? ? NSString *content =[NSString stringWithContentsOfFile:fieldPath
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? encoding:NSUTF8StringEncoding
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? error:error];
? ? if(error) {
? ? ? ? NSLog(@"讀取失敗:%@\n",[error localizedDescription]);
? ? }
? ? NSString*newContent = [NSString stringWithFormat:@"%@\n%@",content,aMsg];
? ? [newContentwriteToFile:fieldPath atomically:YES encoding:NSUTF8StringEncoding error:writeError];
? ? if(writeError) {
? ? ? ? NSLog(@"寫入失敗:%@\n",[writeErrorlocalizedDescription]);
? ? }
}
}
//獲取文件大小
+ (unsignedlonglong)fileSizeWithPath:(NSString*)path {
signedlonglongfileSize =0;
NSFileManager *fileManager = [NSFileManager defaultManager];
if([fileManagerfileExistsAtPath:path]) {
? ? NSError*error =nil;
? ? NSDictionary*fileDict = [fileManagerattributesOfItemAtPath:patherror:error];
? ? if(!error fileDict) {
? ? ? ? fileSize = [fileDictfileSize];
? ? }
}
returnfileSize;
}
+ (void)clearTmpLog {
NSError*error;
NSFileManager *manager = [NSFileManager defaultManager];
NSString*filePath = [[selfclass]tmpLogPath];
[managerremoveItemAtPath:filePatherror:error];
if(error) {
? ? NSLog(@"刪除失敗:%@\n",[error localizedDescription]);
}
}
證書文件:
1.CSR文件:證書請(qǐng)求文件,從鑰匙串工具頒發(fā)(一個(gè)開發(fā)者賬號(hào)享有一份)
2.開發(fā)者開發(fā)用簽名文件:是開發(fā)者開發(fā)身份識(shí)別文件,蘋果后臺(tái)申請(qǐng)(一個(gè)開發(fā)者賬號(hào)享有一份)
3.開發(fā)者發(fā)布用簽名文件:是開發(fā)者發(fā)布身份識(shí)別文件,蘋果后臺(tái)申請(qǐng)(一個(gè)開發(fā)者賬號(hào)享有一份)
4.開發(fā)用推送證書(每個(gè)應(yīng)用一份)
5.發(fā)布用推送證書(每個(gè)應(yīng)用一份)
6.開發(fā)調(diào)試配置文件(每個(gè)應(yīng)用一份)
7.adhoc配置文件(每個(gè)應(yīng)用一份)
8.發(fā)布配置文件(每個(gè)應(yīng)用一份)。
就這些望采納
這里有一點(diǎn)需要注意:
命名的時(shí)候不能用Info.plist , INfo.plist, xxxInfo.plist等形式,否則會(huì)與系統(tǒng)中存在的Info.plist文件發(fā)生沖突。
點(diǎn)擊Root這一行,然后通過點(diǎn)擊右鍵-Add Row或者點(diǎn)擊Root后面的加號(hào)來增加一行。
這一行中包含三個(gè)屬性,key、type、value。其中key是字段屬性,type是字段類型,value是字段對(duì)應(yīng)的值。
Type包含7中類型,對(duì)寫入的數(shù)據(jù)結(jié)構(gòu)應(yīng)屬于7仲:
(NSString,NSData,NSDate,NSNumber,NSArray,NSDictionary)
讀取數(shù)據(jù)
文件是什么類型,就用什么類型的數(shù)據(jù)來接收
參考文檔1: iOS開發(fā),plist文件讀寫那些事
參考文檔2: iOS開發(fā)中怎么創(chuàng)建Plist文件
參考文檔3: 【iOS】plist無法寫入的原因
參考文檔4: plist 文件寫入與讀取