1.證書引起的錯誤
創(chuàng)新互聯(lián)建站"三網(wǎng)合一"的企業(yè)建站思路。企業(yè)可建設(shè)擁有電腦版、微信版、手機版的企業(yè)網(wǎng)站。實現(xiàn)跨屏營銷,產(chǎn)品發(fā)布一步更新,電腦網(wǎng)絡(luò)+移動網(wǎng)絡(luò)一網(wǎng)打盡,滿足企業(yè)的營銷需求!創(chuàng)新互聯(lián)建站具備承接各種類型的成都做網(wǎng)站、成都網(wǎng)站制作項目的能力。經(jīng)過十年的努力的開拓,為不同行業(yè)的企事業(yè)單位提供了優(yōu)質(zhì)的服務,并獲得了客戶的一致好評。
控制臺錯誤截圖
在動態(tài)庫內(nèi)容沒有問題的情況下,大多是由于沒有對動態(tài)庫簽名導致的。iOS 8以后,蘋果支持使用自定義的動態(tài)庫,但不能上架到AppStore。我們的是企業(yè)級項目,不上架沒關(guān)系。
先查看一下你的動態(tài)庫內(nèi)容
解決辦法:在生成動態(tài)庫時選擇一個Team進行簽名即可。
2.Swift版本引起的錯誤(注意:下圖問題不一定是由于swift版本引起的,我遇到的問題就是swift版本引起了下面的問題)
解決方法:把下面的設(shè)置為YES
詳細說明我的問題:在之前,也就是Xcode7.3,動態(tài)庫是swift2.3寫的。通過loadAndReturnError加載是沒有問題的,因為Xcode7.3對應的就是swift2.3。swift3.0是Xcode8才推出來的,所以就沒問題。而現(xiàn)在,Xcode升級到的8.2,而swift也升到了3.0;但是,這個動態(tài)庫還是swift2.3,同時:工程設(shè)置里使用的是最新的swift版本,所以就會出現(xiàn)這個問題。
1、統(tǒng)一收鍵盤的方法
[[[UIApplication sharedApplication] keyWindow] endEditing:YES];
2、提示框
BBAlertView *alert = [[BBAlertView alloc] initWithStyle:BBAlertViewStyleDefault
Title:@"刪除訂單"
message:@"是否刪除訂單,"
customView:nil
delegate:self
cancelButtonTitle:L(@"取消")
otherButtonTitles:L(@"確認")];
[alert setCancelBlock:^{
}];
[alert setConfirmBlock:^{
[self orderDidRemovePressDown:tempDic Index:index.section];
}];
[alert show];
3、圖片的自適應功能
self.brandImage.contentMode = UIViewContentModeScaleAspectFit;
4、cocoaPods清除緩存問題
$ sudo rm -fr ~/.cocoapods/repos/master
$ pod setup
5、設(shè)置顯示鍵盤的樣式
textView.keyboardType =UIKeyboardTypeDefault;
//設(shè)置鍵盤右下角為完成(中文輸入法下)
textView.returnKeyType=UIReturnKeyDone;
6、輸出當前時間
NSDateFormatter * dateFormatter=[[NSDateFormatter alloc]init];
[dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss.SSS"];
NSLog(@"當前毫秒時間1==%@",[dateFormatter stringFromDate:[NSDate date]]);
7、顯示兩秒然后消失
UILabel * lab=[[UILabel alloc]initWithFrame:CGRectMake(60,Main_Screen_Height-64-49-60, Main_Screen_Width-120, 50)];
lab.backgroundColor=[UIColor grayColor];
ViewRadius(lab, 20);
lab.textAlignment=NSTextAlignmentCenter;
lab.text=@"請先進行實名制驗證";
[self.view addSubview:lab];
[UILabel animateWithDuration:2 animations:^{
lab.alpha=0;
}completion:^(BOOL finished) {
[lab removeFromSuperview];
}];
8、設(shè)置placeholder屬性的大小和顏色
[_phoneFie setValue:[UIColor grayColor] forKeyPath:@"_placeholderLabel.textColor"];
[_phoneFie setValue:[UIFont boldSystemFontOfSize:15] forKeyPath:@"_placeholderLabel.font"];
_phoneFie.returnKeyType=UIReturnKeyDone;
9、設(shè)置cell的交互完全不可以使用
//[cellTwo setUserInteractionEnabled:NO];
//設(shè)置cell不可以點擊,但是上面的子控件可以交互
cellTwo.selectionStyle=UITableViewCellSelectionStyleNone;
10、將textField的placeholder 屬性的字體向右邊移動5
_field.leftView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10*Width_375, _field.frame.size.height)];
_field.leftViewMode = UITextFieldViewModeAlways;
11、開新線程使按鈕上的時間變化
-(void)startTime{
__block int timeout=60; //倒計時時間
UIButton * btn=(UIButton *)[self.view viewWithTag:1000];
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_source_t _timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0,queue);
dispatch_source_set_timer(_timer,dispatch_walltime(NULL, 0),1.0*NSEC_PER_SEC, 0); //每秒執(zhí)行
dispatch_source_set_event_handler(_timer, ^{
if(timeout=0){
dispatch_source_cancel(_timer);
dispatch_async(dispatch_get_main_queue(), ^{
[btn setTitle:@"發(fā)送驗證碼" forState:UIControlStateNormal];
btn.enabled = YES;
});
}else{
//? int minutes = timeout / 60;
int miao = timeout % 60;
if (miao==0) {
miao = 60;
}
NSString *strTime = [NSString stringWithFormat:@"%.2d", miao];
dispatch_async(dispatch_get_main_queue(), ^{
[btn setTitle:[NSString stringWithFormat:@"剩余%@秒",strTime] forState:UIControlStateNormal];
btn.enabled = NO;
});
timeout--;
}
});
dispatch_resume(_timer);
}
12、隱藏TableView 中多余的行
UIView * view=[[UIView alloc]initWithFrame:CGRectZero];
[_tabelView setTableFooterView:view];
13、UIView添加背景圖片
UIImage * image=[UIImage imageNamed:@"friend750"];
headSeV.layer.contents=(id)image.CGImage;
14、UITableView取消選中狀態(tài)
[tableView deselectRowAtIndexPath:indexPath animated:YES];// 取消選中
15、帶屬性的字符串
NSFontAttributeName? 字體
NSParagraphStyleAttributeName? 段落格式
NSForegroundColorAttributeName? 字體顏色
NSBackgroundColorAttributeName? 背景顏色
NSStrikethroughStyleAttributeName 刪除線格式
NSUnderlineStyleAttributeName? ? ? 下劃線格式
NSStrokeColorAttributeName? ? ? ? 刪除線顏色
NSStrokeWidthAttributeName 刪除線寬度
NSShadowAttributeName? 陰影
1.? 使用實例
UILabel *testLabel = [[UILabel alloc]initWithFrame:CGRectMake(0, 100, 320, 30)];
testLabel.backgroundColor = [UIColor lightGrayColor];
testLabel.textAlignment = NSTextAlignmentCenter;
NSMutableAttributedString *AttributedStr = [[NSMutableAttributedString alloc]initWithString:@"今天天氣不錯呀"];
[AttributedStr addAttribute:NSFontAttributeName
value:[UIFont systemFontOfSize:16.0]
range:NSMakeRange(2, 2)];
[AttributedStr addAttribute:NSForegroundColorAttributeName
value:[UIColor redColor]
range:NSMakeRange(2, 2)];
testLabel.attributedText = AttributedStr;
[self.view addSubview:testLabel];
16、加大按鈕的點擊范圍
把UIButton的frame 設(shè)置的大一些,然后給UIButton設(shè)置一個小些的圖片
[tmpBtn setImageEdgeInsets:UIEdgeInsetsMake(5, 5, 5, 5)];
// 注意這里不能用setBackgroundImage
[tmpBtn setImage:[UIImage imageNamed:@"testBtnImage"] forState:UIControlStateNormal];
17、//避免self的強引用
__weak ViewController *weakSelf = self;
18、//類別的創(chuàng)建
command +n ——Objective-C File———(File Type? 選擇是類別還是擴展)———(Class? 選擇為哪個控件寫類別)
19、修改UITableview 滾動條顏色的方法
self.tableView.indicatorStyle=UIScrollViewIndicatorStyleWhite;
20、利用UIWebView顯示pdf文件
webView = [[UIWebView alloc]initWithFrame:CGRectMake(0, 0, 320, 480)];
[webView setDelegate:self];
[webView setScalesPageToFit:YES];
[webViewsetAutoresizingMask:UIViewAutoresizingFlexibleWidth |UIViewAutoresizingFlexibleHeight];
[webView setAllowsInlineMediaPlayback:YES];
[self.view addSubview:webView];
NSString *pdfPath = [[NSBundle mainBundle]pathForResource:@"ojc" ofType:@"pdf"];
NSURL *url = [NSURLfileURLWithPath:pdfPath];
NSURLRequest *request = [NSURLRequestrequestWithURL:url
cachePolicy:NSURLRequestUseProtocolCachePolicy
timeoutInterval:5];
[webView loadRequest:request];
21、將plist文件中的數(shù)據(jù)賦給數(shù)組
NSString *thePath = [[NSBundle mainBundle]pathForResource:@"States" ofType:@"plist"];
NSArray *array = [NSArrayarrayWithContentsOfFile:thePath];
22、隱藏狀態(tài)欄
[[UIApplication shareApplication]setStatusBarHidden: YES animated:NO];
23、給navigation? Bar? 設(shè)置title顏色
UIColor *whiteColor = [UIColor whiteColor];
NSDictionary *dic = [NSDictionary dictionaryWithObject:whiteColor forKey:NSForegroundColorAttributeName];
[self.navigationController.navigationBar setTitleTextAttributes:dic];
24、使用AirDrop 進行分享
NSArray *array = @[@"test1", @"test2"];
UIActivityViewController *activityVC = [[UIActivityViewController alloc] initWithActivityItems:array applicationActivities:nil];
[self presentViewController:activityVC animated:YES
completion:^{
NSLog(@"Air");
}];
25、把tableview里面Cell的小對勾的顏色改成別的顏色
_mTableView.tintColor = [UIColor redColor];
26、UITableView去掉分割線
_tableView.separatorStyle = NO;
27、正則判斷手機號碼地址格式
- (BOOL)isMobileNumber:(NSString *)mobileNum {
//? ? 電信號段:133/153/180/181/189/177
//? ? 聯(lián)通號段:130/131/132/155/156/185/186/145/176
//? ? 移動號段:134/135/136/137/138/139/150/151/152/157/158/159/182/183/184/187/188/147/178
//? ? 虛擬運營商:170
NSString *MOBILE = @"^1(3[0-9]|4[57]|5[0-35-9]|8[0-9]|7[06-8])\\d{8}$";
NSPredicate *regextestmobile = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", MOBILE];
return [regextestmobile evaluateWithObject:mobileNum];
}
28、控制交易密碼位數(shù)
-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{
if (textField.text.length =6){
[MBProgressHUD showMessage:@"密碼為6位" afterDelay:1.8];
return NO;
}
return YES;
}
29、判斷是不是空
if ([real_name isKindOfClass:[NSNull class]] ) {
return NO;}
30、點擊號碼撥打電話
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"tel://400966220"]];
31、控制UITabbar的選擇哪一個
[self.tabBarController setSelectedIndex:1];
32、獲取當前App的版本號
NSDictionary?*infoDictionary?=?[[NSBundle?mainBundle]?infoDictionary];
CFShow(infoDictionary);
//?app名稱
NSString?*app_Name?=?[infoDictionary?objectForKey:@"CFBundleDisplayName"];
//?app版本
NSString?*app_Version?=?[infoDictionary?objectForKey:@"CFBundleShortVersionString"];
//?app?build版本
NSString?*app_build?=?[infoDictionary?objectForKey:@"CFBundleVersion"];
33、蘋果app權(quán)限NSPhotoLibraryUsageDescriptionApp需要您的同意,才能訪問相冊NSCameraUsageDescriptionApp需要您的同意,才能訪問相機NSMicrophoneUsageDescriptionApp需要您的同意,才能訪問麥克風NSLocationUsageDescriptionApp需要您的同意,才能訪問位置NSLocationWhenInUseUsageDescriptionApp需要您的同意,才能在使用期間訪問位置NSLocationAlwaysUsageDescriptionApp需要您的同意,才能始終訪問位置NSCalendarsUsageDescriptionApp需要您的同意,才能訪問日歷NSRemindersUsageDescriptionApp需要您的同意,才能訪問提醒事項NSMotionUsageDescriptionApp需要您的同意,才能訪問運動與健身NSHealthUpdateUsageDescriptionApp需要您的同意,才能訪問健康更新NSHealthShareUsageDescriptionApp需要您的同意,才能訪問健康分享NSBluetoothPeripheralUsageDescriptionApp需要您的同意,才能訪問藍牙NSAppleMusicUsageDescriptionApp需要您的同意,才能訪問媒體資料庫
34、控件設(shè)置邊框
_describText.layer.borderColor = [[UIColor colorWithRed:215.0 / 255.0 green:215.0 / 255.0 blue:215.0 / 255.0 alpha:1] CGColor];
_describText.layer.borderWidth = 1.0;
_describText.layer.cornerRadius = 4.0;
_describText.clipsToBounds = YES;
35、//隱藏電池條的方法
-(BOOL)prefersStatusBarHidden{
return YES;
}
36、延時操作
[NSThread sleepForTimeInterval:2];
方法二:
[self performSelector:@selector(delayMethod) withObject:nil afterDelay:1.5];
37、系統(tǒng)風火輪:
[UIApplication sharedApplication].networkActivityIndicatorVisible = NO; //隱藏
38、//didSelectRowAtIndexPath:方法里面找到當前的Cell
AssessMentCell * cell = [tableView cellForRowAtIndexPath:indexPath];
39、navigation上返回按鈕的顏色以及返回按鈕后面文字去掉
//返回按鈕后邊文字去掉
[[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(0, -60)
forBarMetrics:UIBarMetricsDefault];
//設(shè)置左上角返回按鈕的顏色
self.navigationController.navigationBar.tintColor = UIColorFromRGB(0x666666);
40、lineBreakMode //設(shè)置文字過長時的顯示格式
label.lineBreakMode = NSLineBreakByCharWrapping;以字符為顯示單位顯
示,后面部分省略不顯示。
label.lineBreakMode = NSLineBreakByClipping;剪切與文本寬度相同的內(nèi)
容長度,后半部分被刪除。
label.lineBreakMode = NSLineBreakByTruncatingHead;前面部分文字
以……方式省略,顯示尾部文字內(nèi)容。
label.lineBreakMode = NSLineBreakByTruncatingMiddle;中間的內(nèi)容
以……方式省略,顯示頭尾的文字內(nèi)容。
label.lineBreakMode = NSLineBreakByTruncatingTail;結(jié)尾部分的內(nèi)容
以……方式省略,顯示頭的文字內(nèi)容。
label.lineBreakMode = NSLineBreakByWordWrapping;以單詞為顯示單位顯
示,后面部分省略不顯示。
1.PAC Fetch failed with cached error [NSURLErrorDomain:-1004]
在開發(fā)過程中遇到了上訴錯誤,找了很久的原因,剛開始以為是第三方網(wǎng)絡(luò)框架的原因,排除第三方網(wǎng)絡(luò)框架的原因之后又檢查了緩存原因.最后發(fā)現(xiàn)都不是,是系統(tǒng)設(shè)置了自動代理導致的,解決辦法就是關(guān)閉系統(tǒng)自動代理,關(guān)閉之后就不會再報這個錯誤了.再百度上沒有這個問題的記載,最后在谷歌找到答案,特地記錄一下.
解決方法:
系統(tǒng)偏好設(shè)置--網(wǎng)絡(luò)--高級--代理--關(guān)閉自動代理
如果 xcode 中配置文件安裝比較多,有些用不到了,可以到下面路徑進行刪除.
~/Library/MobileDevice/Provisioning Profiles
1 直接剪切
通過打印 tabBar 的子 view, 我們發(fā)現(xiàn)黑線的 y 值是-0.5;
這種方法雖然直接,對于去除 navi 的黑線也是有效的.但是本人不推薦這么去做.如果你的應用里沒有突出的當然是可以的.
2 刪除黑線
和刪除 navi 的差不多,不過不用進行二次遍歷.
當然這種刪除方式,適合自定義的 tabBar, 如果是使用tabbarController 的屬性的話,就不適用了.因為在tabbarController里我們拿不到 tabBar 的 subViews. 通過打印,會發(fā)現(xiàn)是空數(shù)組.這時我們可以使用KVC 使用自定義的 tabBar 去替換系統(tǒng)屬性.
后臺返回的經(jīng)常會見到(null), 那么null是什么鬼, 改怎么處理.使用.通過測試,我們可以看出來下面的結(jié)果.
由上面得出以下結(jié)論.
1.nil, 表示的是空指針,指向的對象是空,地址是0x0, 打印返回的結(jié)果是(null).
2.[NSNull null],表示一個對象是空值,是有內(nèi)存地址的.打印結(jié)果是null.
3.對于字符串來講一個空字符串和字符串是空是兩種概念.如 str 和str2,兩種寫法. 如果有時候不確定返回的字符串是@""還是 nil, 最好使用 [str isEqualToString:@""] || str.length == 0 這種判斷方式. str 只使用** [str isEqualToString:@""] ** 是無效的.
在某個功能中,后臺返回的是字符串,但是要顯示在不同的label 中,才注意到了這個方法.
由于現(xiàn)在的請求是 HTTP,運行時報以下信息內(nèi)容
App Transport Security has blocked a cleartext HTTP (http://) resource load since it is insecure. Temporary exceptions can be configured via your app's Info.plist file.
這時候需要在info.plist中添加一個字段.
通過打印webView 的 subViews 發(fā)現(xiàn), webView 的子 View 中有個 _UIWebViewScrollView 的成員變量, 所以進行猜測.
注意到了 webView 有一個scrollView 的屬性,那么更簡單的做法是:
只需要給 tableView 的 tableFooterView 添加一個空的 View 即可
有一個屬性 background ,在習慣性找backgroundImage 的時候,有時忽略了這個屬性.
有時候需要替換字符串里的字符.
在實際應用中需要獲取設(shè)備的信息.系統(tǒng)給了一個類UIDevice, 可以用來獲取一些基本信息.
如果要獲取具體的設(shè)備型號,比如要給專門的機型推送一些服務的話.那個就得拿到設(shè)備的類型.
通過拿到產(chǎn)品類型我們可以進而判斷出機型. 下面是網(wǎng)上總結(jié)出來的
由于創(chuàng)建項目時,項目名稱包含中文會,Bundle Identifier 中會直接使用-代替中文.所以項目名稱一般會使用英文,實在不行要使用拼音.這樣的話,安裝到手機中的名稱要顯示自己想要的名稱的話.
需要在** info.plist ** 中添加一項.** Bundle display name **.
對應的 Value 就是安裝app 后,顯示的名稱.
由于現(xiàn)在是Retina 屏幕,使用 CATextLayer時,設(shè)置完字體后顯示會模糊.
下面看一下映射關(guān)系.
非Retina:1 Point = 1 x 1 Pixel
Retina:1 Point = 2 x 2 Pixel
由于 Retina 屏一個 Point 映射4個(2 * 2) Pixel,所以 scale為2.
所以這時牽扯到一個屬性:contentsScale
有兩種方案:
方案一 : 使用帶屬性的字符串,這種方法簡單明了.
方案二 : 設(shè)置navigationItem.titleView. 給titleView賦值一個 label, 這樣子的話修改起來都是常規(guī)做法.
????最近業(yè)務需求需要開發(fā)一個SDK集成到友方App中,于是就有了本文中的這些經(jīng)驗(掉坑-爬坑-掉下一個坑)。
????這個其實不涉及技術(shù)問題,但是也需要謹慎,因為我們的SDK屬于一個比較完整的業(yè)務模塊,所以依賴的第三方庫還是挺多的,其中就用到了高德地圖,(開始我們就用的通用版本,結(jié)果友方用的是另一個版本,結(jié)果為了能夠集成成功,后期不得不更改高德地圖版本),所以建議如果是這種明確合作方的SDK這種框架還是需要提前溝通好。
????PS:忍不住吐槽一下,高德地圖整出一大堆亂七八糟的框架目的是個啥呢,又不能互相兼容,開發(fā)者還不知道選擇哪個合適。
????原生App開發(fā),資源文件最多的無非是圖片,在平時項目開發(fā)中一般會放到asset文件夾中,但是在SDK中,需要創(chuàng)建.bundle文件(建議與項目同名)對資源文件進行管理。
????該方法在項目中使用舉例:
????簡單來說,在生成模擬器.framework中與生成真機.framework時,都存在arm64架構(gòu),網(wǎng)上提供的通過后期命令行刪除某個arm64的方式始終無法解決該問題。此時需要配置如圖選項,大概意思是在模擬器生成的.framework的框架不再添加arm64,后期將模擬器庫與真機庫合并,各個架構(gòu)模式就都存在了。
模擬器包與真機包合并命令行
制作遠程私有庫的教程有很多,此處就不展開來仔細說明了。 iOS開發(fā): 配置CocoaPods遠程私有倉庫 重點說一下針對非開源的.framework框架,如何去配置spec
設(shè)置自己的非開源SDK
設(shè)置項目SDK相關(guān)的資源文件夾(bundle)
當自己開發(fā)的SDK中包含類目文件時,編譯就會有提示找不到,此時需要在設(shè)置頁other_laflags添加'-objc',但是在SDK中無法設(shè)置,只能寫在spec文件。
當調(diào)用pod lib lint --verbose --use-libraries時報了如下錯誤:
Ld .../Build/Intermediates.noindex/App.build/Release-iphonesimulator/App.build/Objects-normal/arm64/Binary/App normal arm64
解決方案:
????經(jīng)歷了整個SDK的完整開發(fā)流程,一步步排除問題,最終達到了最終結(jié)果。在此感謝一起解決問題的同事--卞老板。