開(kāi)發(fā)路上踏過(guò)的坑

——只燈片箋


此文記錄的是筆者在實(shí)際iOS開(kāi)發(fā)工作中遇到并解決的一些小細(xì)節(jié)問(wèn)題,以此記錄,持續(xù)更新,僅供參考。

  • Gzip和POST請(qǐng)求相關(guān)問(wèn)題

1.導(dǎo)入頭文件(Ps:此處的是AFNetworking3.0)

#import "AFNetworking.h"
#import "AFgzipRequestSerializer.h"

2.封裝網(wǎng)絡(luò)請(qǐng)求:

-(void)request:(NSString *)url dic:(id)parameter success:(SuccessBlockType)successBlock failed:(FailedBlockType)failedBlock {
    
    NSString *urlEncoded = [self urlEncode:url];
    
    AFHTTPSessionManager *manager = [[AFHTTPSessionManager alloc]init];
    
    //增加一種類(lèi)型,text/html類(lèi)型
    NSSet *set = manager.responseSerializer.acceptableContentTypes;
    NSMutableSet *acceptSet = [NSMutableSet setWithSet:set];
    [acceptSet addObject:@"text/html"];
    [acceptSet addObject:@"text/xml"];
    [acceptSet addObject:@"text/json"];
    [acceptSet addObject:@"text/plain"];
    manager.responseSerializer.acceptableContentTypes = acceptSet;
    
    //  用以解決bug:NSURLErrorDomain code -1012
    [manager.securityPolicy setAllowInvalidCertificates:YES];
    
    //  接受gzip壓縮的json(普通的)
    [manager.requestSerializer setValue:@"gzip" forHTTPHeaderField:@"Accept-Encoding"];
    //  或者是:(服務(wù)器端返回的)
    [manager.requestSerializer setValue:@"gzip" forHTTPHeaderField:@"Content-Encoding"];
    
    //  將parameters 進(jìn)行壓縮
    manager.requestSerializer = [AFgzipRequestSerializer serializerWithSerializer:[AFJSONRequestSerializer serializer]];
    
    //添加此方法,解決未注冊(cè)的https無(wú)法忽略的問(wèn)題   warning:In order to validate a domain name for self signed certificates, you MUST use pinning.
    manager.securityPolicy.allowInvalidCertificates = YES;
    manager.securityPolicy.validatesDomainName = NO;
    
    [manager POST:urlEncoded parameters:parameter progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        //把解析好的數(shù)據(jù),即網(wǎng)絡(luò)返回的數(shù)據(jù),通過(guò)block回傳回去
        if (successBlock) {
            successBlock(responseObject);
        }
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        if (failedBlock) {
            failedBlock(error);
        }
    }];
}

3.Gzip解決的關(guān)鍵代碼:

    manager.requestSerializer = [AFgzipRequestSerializer serializerWithSerializer:[AFJSONRequestSerializer serializer]];

4.當(dāng)然,上面的操作完畢后,編譯,會(huì)提示這樣的錯(cuò)誤:


Error.png

錯(cuò)誤的意思是:你有兩個(gè)相同的.m文件,然而,實(shí)際上一個(gè)相同的也沒(méi)有。
此處僅僅是沒(méi)有導(dǎo)入系統(tǒng)文件而已。
導(dǎo)入即可。


debug.png
5.一些多余的廢話,全當(dāng)是注解。
以上步驟均完成后,在后續(xù)調(diào)用的時(shí)候,POST的請(qǐng)求體內(nèi)的鍵值對(duì)就會(huì)被Gzip打包壓縮。

發(fā)送給服務(wù)器后,就會(huì)在服務(wù)器端解壓縮,獲取到請(qǐng)求體,從而服務(wù)器響應(yīng)請(qǐng)求內(nèi)容,反饋給你Gzip后的請(qǐng)求數(shù)據(jù)。
用AFNetworking封裝的Block網(wǎng)絡(luò)請(qǐng)求,會(huì)自動(dòng)接受服務(wù)器Gzip后發(fā)送過(guò)來(lái)的數(shù)據(jù)。


  • TableViewCell的點(diǎn)擊

默認(rèn)狀態(tài)下,點(diǎn)擊cell后的狀態(tài)是這樣的:


默認(rèn)狀態(tài).png

而我們可能希望是這樣的(沒(méi)有選中的那個(gè)淺灰色提示):


我們希望的.png

所以,可以通過(guò)在代理方法中,輸入一段代碼即可。
關(guān)鍵代碼如下:
//  選中Cell的方法
#pragma mark - 選中Cell的方法
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    //  點(diǎn)擊后,取消當(dāng)前的選中狀態(tài)
    [tableView deselectRowAtIndexPath:indexPath animated:NO];
}

  • NavigationController全屏返回

我們知道,NavigationController自帶有滑動(dòng)回到上一級(jí)的功能。
但是,當(dāng)屏幕太大的時(shí)候,我們可能希望,隨便滑動(dòng)視圖上某個(gè)位置就可回到上一級(jí)。
1.導(dǎo)入頭文件

#import <objc/runtime.h>

2.關(guān)鍵代碼部分:

//弄全屏
-(void)startFullScreen {
    //  獲取系統(tǒng)自帶滑動(dòng)手勢(shì)的target對(duì)象
    id target = self.interactivePopGestureRecognizer.delegate;
    
    //  創(chuàng)建全屏滑動(dòng)手勢(shì),調(diào)用系統(tǒng)自帶滑動(dòng)手勢(shì)的target的action方法
    UIPanGestureRecognizer * pan = [[UIPanGestureRecognizer alloc] initWithTarget:target action:@selector(handleNavigationTransition:)];
    
    //  設(shè)置手勢(shì)代理,攔截手勢(shì)觸發(fā)
    pan.delegate = self;
    
    //  給導(dǎo)航控制器的view添加全屏滑動(dòng)手勢(shì)
    [self.view addGestureRecognizer:pan];
    
    //  禁止使用系統(tǒng)自帶的滑動(dòng)手勢(shì)
    self.interactivePopGestureRecognizer.enabled = NO;
}
//  什么時(shí)候調(diào)用:每次觸發(fā)手勢(shì)之前都會(huì)詢問(wèn)下代理,是否觸發(fā)
//  作用:攔截手勢(shì)觸發(fā)
-(BOOL)handleNavigationTransition:(UIGestureRecognizer *)gestureRecognizer {
    //  注意:只有非根控制器才有滑動(dòng)返回功能,根控制器沒(méi)有。
    return YES;
}
//  代理方法
-(BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer {
    //  判斷導(dǎo)航控制器是否只有一個(gè)子控制器,如果只有一個(gè)子控制器,肯定是根控制器
    if (self.childViewControllers.count == 1) {
        //  表示用戶在根控制器界面,就不需要觸發(fā)滑動(dòng)手勢(shì)
        return NO;
    }
    return YES;
}

  • 點(diǎn)擊按鈕無(wú)法顯現(xiàn)預(yù)期效果

有些時(shí)候,我們可能會(huì)遇到按鈕點(diǎn)擊后無(wú)法執(zhí)行出一些預(yù)設(shè)的效果的狀態(tài)。
但是,如果,我們打印一句話,卻能顯示出來(lái)。
此時(shí),可能,你的代碼里,出現(xiàn)了條件判斷語(yǔ)句中嵌套了條件判斷語(yǔ)句的狀態(tài)。

就好像像這樣:
if ([respondData[@"RS"] length] < 10) {
    //  判斷是否能在錯(cuò)誤信息中找到"password is wrong"
    NSRange range = [respondData[@"ROWRS"] rangeOfString:@"password"];
    //  如果能找到,則range.location != NSNotFound
    if (range.location != NSNotFound) {
      UIAlertController * currentAlert = [CECAlertEngine alertShow:@"密碼錯(cuò)誤"];
      //  彈出提示框;
      [self presentViewController:currentAlert animated:true completion:nil];
    }else {
      UIAlertController * currentAlert = [CECAlertEngine alertShow:@"該賬戶尚未注冊(cè)"];
      //  彈出提示框;
      [self presentViewController:currentAlert animated:true completion:nil];
    }
}

而這里,我們要做的是拆分出來(lái)?xiàng)l件判斷語(yǔ)句中嵌套的條件判斷語(yǔ)句,并加之return。
如此一來(lái),就可以解決標(biāo)題所述問(wèn)題。

推薦這樣:
//  判斷是否能在錯(cuò)誤信息中找到"password is wrong"
NSRange range = [respondData[@"ROWRS"] rangeOfString:@"password"];
//  如果能找到,則range.location != NSNotFound
if ([respondData[@"RS"] length] < 10 && range.location != NSNotFound) {
    UIAlertController * currentAlert = [CECAlertEngine alertShow:@"密碼錯(cuò)誤"];
    //  彈出提示框;
    [self presentViewController:currentAlert animated:true completion:nil];
    return;
  }
  else if ([respondData[@"RS"] length] < 10 && range.location == NSNotFound) {
    UIAlertController * currentAlert = [CECAlertEngine alertShow:@"該賬戶尚未注冊(cè)"];
    //  彈出提示框;
    [self presentViewController:currentAlert animated:true completion:nil];
    return;
}
總的來(lái)講,盡一切可能避免條件判斷語(yǔ)句中嵌套條件判斷語(yǔ)句。

  • AutoLayout下UIScrollView無(wú)法滾動(dòng)問(wèn)題
此處采用的是Masonry進(jìn)行的約束。
為什么會(huì)出現(xiàn)這個(gè)問(wèn)題?

使用支持AutoLayout后,在ViewDidLoad之后,系統(tǒng)會(huì)重新計(jì)算控件的一些值,導(dǎo)致之前你所設(shè)置的contentSize被重置為(0,0)了。

解決方案很簡(jiǎn)單:把設(shè)置contentSize的代碼放到viewDidAppear上即可。
//解決AutoLayout下ScrollView無(wú)法滾動(dòng)問(wèn)題
-(void)viewDidAppear:(BOOL)animated {
    //  設(shè)置滾動(dòng)視圖的滾動(dòng)范圍
    self.baseScrollView.contentSize = CGSizeMake(kSceenWidth, (kSceenWidth * 279 / 990) + 534);
    [super viewDidAppear:animated];
}

修正:AutoLayout下UIScrollView無(wú)法滾動(dòng)問(wèn)題 最新最好的解決辦法
將所有的添加載scrollView上的控件,順序調(diào)整下,即可。
1.聲明scrollView,并添加到視圖。
2.添加其余控件到scrollView上。
3.用Mansory進(jìn)行AutoLayout布局。
示例代碼如下:

-(void)viewDidLoad {
    [super viewDidLoad];
    
    UIScrollView *baseScrollView = [[UIScrollView alloc] init];
    [self.view addSubview:baseScrollView];
    
    //maskView 這一段代碼 可以注釋掉 不影響效果
    UIView *maskView = [[UIView alloc] init];
    [baseScrollView addSubview:maskView];
    [maskView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.edges.equalTo(baseScrollView);
    }];
    
    UILabel *testLabel = [[UILabel alloc] init];
    testLabel.numberOfLines = 0;
    [maskView addSubview:testLabel];
    [testLabel mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.equalTo(maskView).offset(10);
        make.top.equalTo(maskView).offset(10);
        make.right.equalTo(maskView).offset(-10);
    }];
    
    testLabel.text = @"此處自行寫(xiě)一段長(zhǎng)長(zhǎng)的文字做測(cè)試即可";
    
    UIImageView *imageView = [[UIImageView alloc] init];
    imageView.backgroundColor = [UIColor cyanColor];
    [maskView addSubview:imageView];
    [imageView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.top.equalTo(testLabel.mas_bottom).offset(10);
        make.left.equalTo(baseScrollView).offset(10);
        make.right.equalTo(baseScrollView).offset(-10);
        make.size.mas_equalTo(CGSizeMake(300, 300));
    }];
    
    [baseScrollView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.edges.equalTo(self.view);
        make.bottom.mas_greaterThanOrEqualTo(imageView.mas_bottom).offset(20);
    }];
}

  • iOS關(guān)于SVN沖突問(wèn)題
iOS關(guān)于SVN沖突問(wèn)題:
Project /Users/XXX/Desktop/XXX/XXX/xxx.xcodeproj cannot be opened because the project file cannot be parsed.
解決方法的步驟:

1.在文件夾中找到 xxx.xcodeproj 文件,點(diǎn)擊右鍵,選擇顯示包內(nèi)容
2.雙擊打開(kāi) project.pbxproj 文件
3.找出沖突信息(用commad + f 快速搜索)
4.刪除 <<<<<<< ====== >>>>>> 這些行(hang)
5.保存,退出 (有時(shí)要clean 一下))
6.重新打開(kāi)xxx.xcodeproj文件即可


  • 在一堆條件判斷中做彈窗提示
彈窗警告.png
遇到的問(wèn)題是,如果不正確寫(xiě)好邏輯,就會(huì)一直報(bào)錯(cuò),說(shuō)是彈窗已經(jīng)提前聲明顯示過(guò)了,不過(guò)是空的。而實(shí)際的程序并沒(méi)有任何異樣。
后來(lái),修改邏輯后就好了。所以,盡信書(shū),不如無(wú)書(shū)。禪與Objective-C講到的一些東西是有用。但是,更要結(jié)合自己的實(shí)際。
所以,該用這樣
    if ( ) {
        
    }
    else if ( ) {
        
    }
    else {
        
    }

  • 圖片不顯示的問(wèn)題

如果,某天,你一臉懵逼的發(fā)現(xiàn),你的圖片剛開(kāi)始測(cè)試的時(shí)候是顯示的。但是,后來(lái)突然某天抽了,不顯示了。

而且,你的寫(xiě)法是這樣的:
[UIImage imageNamed:@"18"];
所以,當(dāng)你郁悶的時(shí)候,不妨看看,這樣的寫(xiě)法:
[UIImage imageNamed:@"18.jpg"];

其實(shí),這里的問(wèn)題很簡(jiǎn)單,因?yàn)閕OS對(duì).jpg格式的圖片支持并不是很好,如果是.png格式的圖片,則是毫無(wú)問(wèn)題。所以,當(dāng)你的圖片格式是.jpg格式,請(qǐng)把名字寫(xiě)全。免得郁悶自己。


  • 環(huán)信集成問(wèn)題

最近在做即時(shí)通訊,需要集成環(huán)信的SDK,但是,環(huán)信的SDK真的挺老的。
按照官方文檔走,即可。

需要注意的是,別看錯(cuò)文檔。好幾次,我看著文檔郁悶半天,才發(fā)現(xiàn)自己看的是2.0的文檔。所以,要看的話,請(qǐng)看3.0文檔。

xxx.pch文件里,不要導(dǎo)入環(huán)信的頭文件,否則會(huì)運(yùn)行失敗,一堆的Error。

So,盡可能避免在pch頭文件內(nèi)一次性導(dǎo)入過(guò)多的.h文件,否則會(huì)出現(xiàn)莫名其妙的重復(fù)文件問(wèn)題。
確切的做法是:在需要用到的地方進(jìn)行引用.h文件即可??梢员苊庖恍┎槐匾穆闊┏霈F(xiàn)。

一般錯(cuò)誤提示為:

ld: library not found for -lssl
clang: error: linker command failed with exit code 1 (use -v to see invocation)
這里的錯(cuò)誤提示。
前一句意思是:你缺失libssl這個(gè)庫(kù)文件。
后一句的意思是:你有兩個(gè)重復(fù)名字的文件。
以第一句為基準(zhǔn),因?yàn)樵?jīng)以第二句為基準(zhǔn),差點(diǎn)被坑慘。

修正,最新解決方案:
實(shí)際上,可以丟在頭文件里,只是需要注釋掉一部分東西,再添加一部分東西即可。也就是幾行代碼的問(wèn)題而已。


EMSDK.h.png

EMSDKFull.h.png
按照?qǐng)D中注釋掉后,即可。
接著,集成環(huán)信的UI界面,步驟如下:

1.到官網(wǎng)的SDK現(xiàn)在最新的iOS SDK。
網(wǎng)址:
http://www.easemob.com/download/im

46E61F1B-441D-4FF2-A494-348471E75093.png

2.EaseUI使用指南中下載EaseUI工程。
網(wǎng)址:
http://docs.easemob.com/im/300iosclientintegration/85easeuiguide#easeui_使用指南
AC27D33B-12A6-467E-A149-B0D1D064A79D.png

3.打開(kāi)下載的文件夾,從中拖需要的文件到自己的工程內(nèi)。

EaseUIResource.bundle
最新的SDK中提取.png
EaseUI
EaseUI.png
Resource
UI圖片資源.png

此時(shí)編譯,會(huì)有一堆什么runtime之類(lèi)的報(bào)錯(cuò)。
需要在pch文件里的首尾部分,添加如下代碼:


添加框中代碼.png

余下的還有error,請(qǐng)自行解決。
我在開(kāi)發(fā)中遇到的問(wèn)題是MBProgress之類(lèi)的東西的error,注釋掉error部分就行了,良好運(yùn)行,簡(jiǎn)單粗暴。


  • SVN命令行將工程導(dǎo)入到服務(wù)器

另注:SVN首次從本地導(dǎo)入到SVN服務(wù)器的時(shí)候,有時(shí)可能不支持http協(xié)議。

打開(kāi)終端,輸入如下命令行:
svn import /Users/cecdata/Desktop/08.12/DoctorApp https://xxx.xxx.xx.xxx/svn/xxxxx/ --username=xxxxx --password=xxxxx -m "修改了注冊(cè)頁(yè)的彈窗提醒,并繼承過(guò)環(huán)信SDK,調(diào)試bug完畢"

  • 極光推送SDK集成問(wèn)題

極光推送相對(duì)環(huán)信,更加簡(jiǎn)單點(diǎn)。但是,需要配置證書(shū)。特別是描述文件。
遇到的問(wèn)題是這樣的。推送測(cè)試消息,成功。但是接收數(shù)為0。
后臺(tái)打印是這樣的。
后臺(tái)打印.png
其實(shí),這個(gè)問(wèn)題解決,倒也簡(jiǎn)單。
只需要把配置好的描述文件(Provisioning Profiles)導(dǎo)進(jìn)來(lái)(從開(kāi)發(fā)者中心下載下來(lái),雙擊安裝即可)。需要注意的是,你必須保證你的工程中的Bundle Identifier跟開(kāi)發(fā)者賬號(hào)配置的AppID是一致的。否則,這也會(huì)是導(dǎo)致崩潰的原因。
因?yàn)橐昧谁h(huán)信的SDK,所以,做了這樣的操作。
SDK 不支持 bitcode,在 Build Settings → Linking → Enable Bitcode 中設(shè)置 NO。
如果進(jìn)行了上面的操作,那么接下來(lái)就該這樣操作。
應(yīng)該這樣.png

路徑.png
另:需要注意,從鑰匙串導(dǎo)出的.p12文件,盡可能為英文或者數(shù)字命名,否則,也會(huì)不定性錯(cuò)誤。
 集成完極光SDK,出現(xiàn)這樣的后臺(tái)打印。
后臺(tái)打印.png
這里的錯(cuò)誤提示很簡(jiǎn)單。就是告訴你,約束錯(cuò)了。我什么都沒(méi)干,哪來(lái)的約束錯(cuò)誤。不搭理它,重新?lián)Q個(gè)真機(jī)運(yùn)行,毫無(wú)問(wèn)題。再換回來(lái),也是毫無(wú)問(wèn)題。就這樣,問(wèn)題解決了。所以,盡可能,clean一下,再運(yùn)行。

  • scrollView高度動(dòng)態(tài)變化

近來(lái)做項(xiàng)目,遇到需要根據(jù)scrollView上添加的視圖控件的高度動(dòng)態(tài)變化狀況,來(lái)對(duì)scrollView的高度進(jìn)行動(dòng)態(tài)變化。

此處,顯而易見(jiàn)的就會(huì)想到AutoLayout。原理很簡(jiǎn)單,就是在scrollView添加一層類(lèi)似于蒙版層的東西,填充scrollView (當(dāng)然,你也可以不加這一類(lèi)蒙版層)。不過(guò),個(gè)人感覺(jué),為了穩(wěn)妥起見(jiàn),添加為好。特別是用xib的小伙伴們。

從網(wǎng)上也看了頗多,挺麻煩。就想著自己簡(jiǎn)化來(lái)寫(xiě)。
此處示例的是一個(gè)小測(cè)試demo的全部代碼。

//引入Masonry頭文件
#import "Masonry.h"
-(void)viewDidLoad {
    [super viewDidLoad];
    
    UIScrollView *baseScrollView = [[UIScrollView alloc] init];
    [self.view addSubview:baseScrollView];
    [baseScrollView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.edges.equalTo(self.view);
    }];
    
    //maskView 這一段代碼 可以注釋掉 不會(huì)影響高度動(dòng)態(tài)變化以及滾動(dòng)效果
    UIView *maskView = [[UIView alloc] init];
    [baseScrollView addSubview:maskView];
    [maskView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.edges.equalTo(baseScrollView);
    }];
    
    UILabel *testLabel = [[UILabel alloc] init];
    testLabel.numberOfLines = 0;
    [baseScrollView addSubview:testLabel];
    [testLabel mas_makeConstraints:^(MASConstraintMaker *make) {
        make.edges.equalTo(baseScrollView).insets(UIEdgeInsetsMake(20, 10, 0, 10));
    }];
    
    testLabel.text = @"/*此處,請(qǐng)自己動(dòng)手,寫(xiě)一段特別長(zhǎng)的文字,來(lái)用做測(cè)試*/";
}

  • The file * couldn't be opened because you don't have permission to view it.

當(dāng)你休息了一個(gè)周末回來(lái),打開(kāi)你的工程,跑起來(lái),卻莫名其妙的報(bào)了這樣的錯(cuò)誤:“The file * couldn't be opened because you don't have permission to view it”錯(cuò)誤信息。
你一定非常納悶,哪里出問(wèn)題了,明明你上周五離開(kāi)的時(shí)候,還是運(yùn)行良好無(wú)誤的。

解決方案:

Window --> Projects --> 在下面框框左面選擇你的項(xiàng)目名字 --> 在右面有一個(gè)delete,點(diǎn)擊刪除即可。不會(huì)影響你的文件,刪除后相當(dāng)于從0編譯第一次速度會(huì)慢一點(diǎn)而已。


解決問(wèn)題.png

  • 蒲公英上傳打包出現(xiàn)的問(wèn)題:

Error:
Provisioning profile does not match bundle identifier: The provisioning profile specified in your build settings (“xxxxxxxxx”) has an AppID of “com.xxx.xxxxxx” which does not match your bundle identifier “com.xxx.xxxxxx.xxxxx”.
解決方案:
錯(cuò)誤解決方法??①.png

錯(cuò)誤解決方法??②.png

  • 緩存未清除問(wèn)題:

Error:
ld: warning: directory not found for option '-L/Users/xxx/Desktop/xxxxxx/xxx/xxx/Classes/IMSDKLib/HyphenateFullSDK/lib/3rdparty'
ld: warning: directory not found for option '-L/Users/xxx/Desktop/xxxxxx/xxx/xxx/Classes/IMSDKLib/HyphenateFullSDK/lib'
ld: warning: directory not found for option '-L/Users/xxx/Desktop/xxxxxx/xxx/xxx/Classes/EaseUI/EMUIKit/3rdparty/DeviceHelper/VoiceConvert/opencore-amrnb'
ld: warning: directory not found for option '-L/Users/xxx/Desktop/xxx/xxx/xxx/Classes/EaseUI/EMUIKit/3rdparty/DeviceHelper/VoiceConvert/opencore-amrwb'
clang: error: linker command failed with exit code 1 (use -v to see invocation)
錯(cuò)誤?.png
解決方法:
紅色框內(nèi),全部清除掉,即刪掉編譯報(bào)warning的路徑即OK
解決辦法??.png

解決辦法??.png

  • 環(huán)信集成的錯(cuò)誤:ld: library not found for -lopencore-amrwb

編譯階段就會(huì)報(bào)這樣的錯(cuò)。
解決辦法:

project->general->linked frameworks and Libraries
找“ -lopencore-amrwb” ,然而,實(shí)際是找不到的。因?yàn)?,其?duì)應(yīng)的是:libopencore-amrwb
解決辦法??.png
紅色框內(nèi)為細(xì)節(jié)注意問(wèn)題

點(diǎn)擊之后,你會(huì)發(fā)現(xiàn),這個(gè)文件在文件夾內(nèi)是實(shí)際存在的。
接下來(lái)的解決方法就是:

把它丟出工程外,但是要注意,不是丟到垃圾簍。
解決辦法??.png
然后,選中你要添加進(jìn)的文件夾。按快捷鍵alt + command + A,會(huì)打開(kāi)finder,選擇你剛才移除的文件夾,點(diǎn)擊Add,即可。
之后,之前報(bào)錯(cuò)的路徑問(wèn)題,就可解決。估摸著,應(yīng)該是 linked frameworks and Libraries 會(huì)自動(dòng)更新的緣故。

  • 關(guān)于Xcode 8創(chuàng)建的storyBord、Xib在Xcode 7中無(wú)法打開(kāi)的問(wèn)題

錯(cuò)誤是這樣的:

This version does not support documents saved in the Xcode 8 format. 
Open this document with Xcode 8.0 or later.
StoryBord錯(cuò)誤.png

XIb錯(cuò)誤.png

解決辦法:

對(duì)于StoryBord:
可以用文本編輯器打開(kāi)xib文件,將document中的toolsVersion和plugln中的version改正原來(lái)xib文件中的值,同時(shí)刪除
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"
對(duì)于Xib:
用編輯器將Xib里面的下面一句話刪除掉才能打開(kāi):
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>

  • Xcode編譯錯(cuò)誤:ld: 5 duplicate symbols for architecture arm64

錯(cuò)誤是這樣的:

ld: 5 duplicate symbols for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

解決辦法:

Xcode編輯時(shí)報(bào):2 duplicate symbols for architecture arm64
1.查看自己項(xiàng)目中是否有重復(fù)命名的文件
(一般就是這個(gè)問(wèn)題,如果項(xiàng)目中排查后,沒(méi)有發(fā)現(xiàn)。
那就該項(xiàng)目所在的文件是否有重復(fù)命名的文件,刪除一個(gè)就可以了,排查的目標(biāo)一般都在報(bào)錯(cuò)前面列舉出來(lái)。)
2.再查看是否在編輯#improt頭文件時(shí)候,不小心把.h誤寫(xiě)成.m

  • iOS·SVN出錯(cuò)

iOS:SVN出錯(cuò) Description : The working copy is locked due to a previous error
錯(cuò)誤打印如下:
Description : The working copy is locked due to a previous error. Suggestion : Clean the working copy and then retry the operation. Technical Information 
===================== Error : V4WorkingCopyLockedError Exception : ZSVNWorkingCopyLockedException Causal Information ================== 
Description : Working copy '/Users/cecdata/Desktop/SmartGoBeta/SmartGo_IOS' locked. 
Status : 155004 Description : '/Users/cecdata/Desktop/SmartGoBeta/SmartGo_IOS/SmartGo_Simple_3.0' is already locked. Status : 155004
解決方法如下:

使用CornerStone工具update最新SVN代碼報(bào)錯(cuò):The working copy is locked due to a previous error,不僅無(wú)法上傳,也無(wú)法更新,錯(cuò)誤提示被鎖。

解決方法:在CornerStone找到本地代碼工程--右鍵--點(diǎn)擊clean 即可。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • (一)Masonry介紹 Masonry是一個(gè)輕量級(jí)的布局框架 擁有自己的描述語(yǔ)法 采用更優(yōu)雅的鏈?zhǔn)秸Z(yǔ)法封裝自動(dòng)布...
    木易林1閱讀 2,573評(píng)論 0 3
  • Masonry是一個(gè)輕量級(jí)的布局框架,擁有自己的描述語(yǔ)法,采用更優(yōu)雅的鏈?zhǔn)秸Z(yǔ)法封裝自動(dòng)布局,簡(jiǎn)潔明了并具有高可讀性...
    3dcc6cf93bb5閱讀 1,930評(píng)論 0 1
  • Masonry簡(jiǎn)介 Masonry是一個(gè)輕量級(jí)的布局框架,它擁有自己的描述語(yǔ)法(采用更優(yōu)雅的鏈?zhǔn)秸Z(yǔ)法封裝)來(lái)自動(dòng)布...
    下雨天愛(ài)喝咖啡的熊閱讀 1,337評(píng)論 0 5
  • ***本人不曾寫(xiě)文章,勿噴*** 剛剛老公發(fā)來(lái)微信說(shuō)很無(wú)聊,我沒(méi)有回復(fù),因?yàn)槲耶?dāng)時(shí)也想說(shuō)很無(wú)聊,什么事都不想做,...
    簡(jiǎn)的小精靈_suie閱讀 1,703評(píng)論 2 0
  • 故地重游廣西龍勝梯田,這次不同的是帶上了兩歲9個(gè)月的兒子,是他第一次出遠(yuǎn)門(mén),之前怕年紀(jì)小,奔波陌生地方安全感不足,...
    羅玉紅閱讀 217評(píng)論 0 0

友情鏈接更多精彩內(nèi)容