如下是本人在iOS開發工做中使用的一些小技巧,記錄一下。javascript
1.使用XXX.pch文件便捷開發+加速Buildphp
在IOS開發的項目中有一個XX_Prefix.pchhtml
XX_Prefix.pch:擴展名.pch表示"precompiled header",這是一個你工程要用到的來自於外部框架的頭文件列表。xcode將編譯這些頭到文件,這將減小你在選擇Build 或Build and Go時編譯項目的時間。一般用到的頭文件已經自動包含了pch,系統編譯每一個.m文件前,都會先imort這個文件。這樣就節省了添加include的時 間,至關於加速編譯java
還有就是能夠再這裏面放入宏,在整個工程中均可以用.ios
添加方法:git
在targets->Build Setting中Apple LLVM 7.0 - language中作以下修改github
例如在一個項目中有一個hello.h文件,須要在全部.m文件中都要包含這個文件就能夠在web
XX_Prefix.pch文件中引入hello.h面試
2.在一個應用中打開其餘應用.objective-c
在iOS開發中,如何實現從app1打開app2。
基本的思路就是,能夠爲app2定義一個URL,在app1中通過打開這個URL來打開app2,在此過程當中,能夠傳送一些參數。下面來討論一下具體的實現過程。
1. 在app2的info.plist中定義URL,就是在文件中添加URL types一項。可按下圖進行添加。
2. 在app1的代碼中打開剛纔定義的URL,代碼以下:
1 NSURL *url = [NSURL URLWithString:@"myapp://test?para1=1¶2=2"]; 2 [[UIApplication sharedApplication] openURL:url];
固然,這個URL的形式能夠是其餘形式的,只要以"myapp://"開始便可。
這樣,就能夠在app1中打開app2.
打開以後,會調用app2的AppDelegate的
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
因爲URL是本身定義的,因此會存在URL重複的狀況。通過測試發現,若是試圖打開這個URL,那麼會打開先安裝的那個應用.
3.在Xcode中使項目的Build隨項目的啓動而遞增.
在下圖所示位置加入
version=`/usr/libexec/PlistBuddy -c "Print CFBundleVersion" $PRODUCT_SETTINGS_PATH` version=`expr $version + 1` /usr/libexec/PlistBuddy -c "Set :CFBundleVersion $version" $PRODUCT_SETTINGS_PATH #/usr/libexec/PlistBuddy -c "Set :CFBundleShortVersionString $version" $PRODUCT_SETTINGS_PATH 這行代碼會讓version也自增,通常不須要
4.界面跳轉.如電商項目中,A:商品界面(不是rootViewController)B:付款界面C:訂單界面,想直接從C跳到A(中間跳轉沒有出現B的過渡效果),這時使用popToViewController時不行,popViewControllerAnimated也不行的狀況下.可使用:
[self.navigationController popToViewController:[self.navigationController.viewControllers objectAtIndex:1] animated:YES];
或者
for (UIViewController *controller inself.navigationController.viewControllers) { if ([controller isKindOfClass:[你要跳轉到的Controller class]]) { [self.navigationControllerpopToViewController:controller animated:YES]; } }
5.如何判斷一個頁面是web頁面仍是iOS原生頁面.
長按界面,若是出現可複製的界面就是web界面.
6.在Xcode裏如何保證不會由於手殘改動了系統的源生源碼文件(下降權限).
終端輸入:
cd /Applications/Xcode.app/
sudo chown -hR root:wheel Contents
7.使用Cocoapods導入的第三庫文件,發現import沒法提示.
9.cocoapods升級或者降級:
升級:
sudo gem update --system //更新gem sudo gem install cocoapods pod setup pod --version //查看版本
最近把mac系統升級到10.11系統,可是在用pod install命令的時候,卻提示command not found或者:
在stackoverflow搜到的解釋是這樣的,This is happening because Apple has enabled rootless on the new install,也就是說在10.11系統上蘋果已經啓用無根的安裝.
因此,保證Cocoapods在OS X 10.11系統上的正常使用,咱們須要在命令行輸入這樣一句話:
sudo gem install -n /usr/local/bin cocoapods
降級:
sudo gem uninstall cocoapods //選擇哪一個版本,以後Y
//選擇那個版本 sudo gem install cocoapods -v 0.34.4
其中的Podfile文件最好是用Xcode編寫,省的報錯.
10.Xcode在archive時出現no identity found:
1.首先肯定開發者帳號的相應證書和描述文件是不是最新,打開鑰匙鏈刪除舊版,更新新版
2.Xcode->prefrence->Accounts.從新添加appid,把多餘的描述文件刪除,從新下載新的描述文件.
3.整改項目裏面的code Signing identify和PP文件.
4.clean一下.
11.由於Cocoapods致使有些工程會出現liarary not funnd for -lPods如圖所示:
同時,在相應位置處,其餘導入的庫正常,只有這個報紅現象,右鍵show in finder也沒反應.哪怕從新添加或者從新是用Cocoapods再次導入也無濟於事.
依然報紅,能夠archive打包成ipa,可是沒法鏈接手機測試觀察,按照網上給的不少方法依然無效.只能:
新建一個全新項目,把原來的庫從新導入新工程一次,通常新工程裏面的libPod.a就是正常的了,若是非正常就是Cocoapods的緣由了.若是正常就把新工程的libPod.a文件手動拷入原來的工程之中.
原工程仍然報紅,可是能夠鏈接手機測試了.
12.用xml格式打開xxx.plist.
13.點擊按鈕直接跳轉至APP store相應APP的下載頁面.
以微信爲例,想要點擊按鈕跳轉到APP store的微信下載頁面.
最爲關鍵的是跳轉連接,這裏的連接不是像https://appsto.re/cn/S8gTy.i這種.也不是
https://itunes.apple.com/cn/app/wei-xin/id414478124?mt=8(這種跳轉中間會有Safari的過渡)
若是想要直接跳轉至微信的下載頁面,能夠把https://換爲itms:// 或者 itms-apps://.如:itms-apps://itunes.apple.com/cn/app/wei-xin/id414478124?mt=8
這種能夠直接跳轉至APP store的下載頁面.其中連接可使用Mac的APP store或者iTunes獲取.
爲了讓開發者宣傳本身產品時,下載地址更簡短易記,蘋果開放了 appstore.com 「短」 連接服務。規則以下:
對應到本身的項目裏面,我用的是AFNetworking這套網絡請求包,須要改的是:
AFURLResponseSerialization.m文件
226行:
self.acceptableContentTypes = [NSSetsetWithObjects:@"application/json", @"text/html",@"text/json",@"text/javascript", nil];
加上藍色部分,其實就是添加一種服務器返回的數據格式。
15.由於Mac系統升級和Xcode升級致使Cocoapods失效.
1.若是隻是Xcode升級致使Cocoapods失效只需在終端中:
(這裏最好先打開Xcode)
a.先獲取到UUID:
defaults read /Applications/Xcode.app/Contents/Info DVTPlugInCompatibilityUUID
如: XXXX-XXXX-VVVDF-JHFF
b.find ~/Library/Application\ Support/Developer/Shared/Xcode/Plug-ins -name Info.plist -maxdepth 3 | xargs -I{} defaults write {} DVTPlugInCompatibilityUUIDs -array-add 這裏加上上面的UUID
如:find ~/Library/Application\ Support/Developer/Shared/Xcode/Plug-ins -name Info.plist -maxdepth 3 | xargs -I{} defaults write {} DVTPlugInCompatibilityUUIDs -array-add XXXX-XXXX-VVVDF-JHFF
c.把Xcode徹底退出,接着重啓,會彈出是否加載插件界面,加載插件便可.
2.由於Mac系統升級致使Cocoapods失效:
這裏的GEM_PATH會顯示爲空
解決方案1:
終端裏輸入:gem env
能夠查到gem的安裝路徑,找到SHELL PATH,如:
接着依次試一下上面的這些路徑.(這個方案我沒用親自試過,太麻煩)
解決方案2:
終端輸入:sudo gem install -n /usr/local/bin cocoapods
安裝完成以後,接着在cocoapods插件的GEM_PATH裏寫入 /usr/local/bin 便可
(這個方案親測可用)
15.使用Xcode查看不一樣機型下的UI效果圖.
1.首先打開storyboard或者xib,點擊左上角的符號(以下圖1中),接着Preview,而後按住option+shift鍵,選擇你想要查看的視圖文件.
2.接着會跳出下面的視圖.雙擊+號
3.OK,接着右面會彈出各尺寸的效果圖.點擊+號能夠添加機型
16.查找私有api字段:
有時在上傳APP Store時會報使用私有API的問題,解決方案:
cd 到項目文件夾
grep -r XXXX
上面就是查找私有字段XXXX所在的目錄
17.出現Unable to copy asset information from https://mesu.apple.com/assets/for asset type com.apple.MobileAsset.TextInput.SpellChecker 或者copy matching assets reply或者Daemon configuration query reply字樣,如:
個人解決方案:在storyBoard中,修改TextView中的correction和spell Checking 爲NO.如:
18.查看plist文件中key的正確原始值:
19.修改github上面的源碼類型顯示.如
1.打開命令行,cd 到本地倉庫的項目根目錄.而後新建一個文件 .gitattributes
touch .gitattributes
2.用文本編輯器打開該文件,若是隱藏,須要先 打開隱藏文件顯示(第10)
而後輸入
*.h linguist-language=swift *.m linguist-language=swift
意思就是將.h 和.m文件看成Swift語言來統計,簡單粗暴。
3.再次提交改變到github上便可.
20. 圖片模糊處理
寫個擴展實現模糊:
1 import UIKit 2 3 extension UIImage{ 4 func blurImage(value:NSNumber) -> UIImage{ 5 let content = CIContext.init(options: [kCIContextUseSoftwareRenderer:true]) 6 let ciImage = CoreImage.CIImage.init(image: self) 7 let blurFiter = CIFilter.init(name: "CIGaussianBlur") 8 blurFiter?.setValue(ciImage, forKey: kCIInputImageKey) 9 blurFiter?.setValue(value, forKey: "inputRadius") 10 let imageRef = content.createCGImage((blurFiter?.outputImage)!, from: (ciImage?.extent)!) 11 let newImage = UIImage.init(cgImage: imageRef!) 12 return newImage 13 } 14 15 16 }
使用:
blurImage.image = UIImage.init(named: "pic.jpg")?.blurImage(value: 8)
21.網友的多年開發總結:http://www.jianshu.com/p/1ff9e44ccc78
22.cocoapods在升級,安裝三方庫,降級等操做發生錯誤:
ERROR: While executing gem ...(Error::EPERM)
Operation not permitted - /usr/bin/update_rudygems
如圖
使用命令便可:
sudo gem install -n /usr/local/bin cocoapods --pre
OK成功了,如今版本是最新的,也可使用正常.
23.判斷該界面是push過來的仍是present過來的.
NSArray *viewcontrollers=self.navigationController.viewControllers; if (viewcontrollers.count>1) { if ([viewcontrollers objectAtIndex:viewcontrollers.count-1]==self) { //push方式 } } else{ //present方式 }
24.大神博客,學習網站
.....
25.runloop學習
https://blog.ibireme.com/2015/05/18/runloop/#base
http://v.youku.com/v_show/id_XODgxODkzODI0.html
26.runtime學習
http://yulingtianxia.com/blog/2014/11/05/objective-c-runtime/
https://www.valiantcat.cn/index.php/2017/11/03/53.html
https://ke.qq.com/course/224900
http://www.jianshu.com/p/2d57c72016c6
28.深刻理解Objective-C:Category
美團點評技術團隊對Category的總結:https://tech.meituan.com/DiveIntoCategory.html
29.動畫學習 swift3.0一些動畫基礎整理
30.iPhone X劉海打理指南:
.......
31.網絡基本知識
TCP/IP 系列文章
[網絡基礎知識(-)](http://www.jianshu.com/p/885201e68707)
[TCP/IP基礎知識(二)](http://www.jianshu.com/p/21c24dc84a50)
[物理層(三)](http://www.jianshu.com/p/5299766420e8)
[數據鏈路層(四)](http://www.jianshu.com/p/4afc43f0b015)
[IP 協議(五)](http://www.jianshu.com/p/6f89a0dc3141)
[IP 協議相關技術(六)](http://www.jianshu.com/p/7b445133aa1f)
[TCP與UDP(七)](http://www.jianshu.com/p/7fa4ae2cc73a)
32.IM知識詳解
33.iOS離屏渲染
35.iOS 編譯期 運行期
36.爲什麼要這樣?
當修飾可變類型的屬性時,如NSMutableArray、NSMutableDictionary、NSMutableString,用strong。
當修飾不可變類型的屬性時,如NSArray、NSDictionary、NSString,用copy。
38.ARC模式下,使用Core Foundation也須要內存管理.
39.長短連接簡介
短連接使用場景: 常見的網頁瀏覽,app頁面展現,適用於網頁瀏覽等數據刷新頻度較低的場景.
長連接使用場景: 適用於客戶端和服務端通訊頻繁的場景,例如聊天室,實時遊戲等,Socket的基本使用.
39.經典面試題
40.導出電腦公鑰
1.檢查本機是否已有公鑰
$ cd ~/.ssh
2.若是電腦中有之前遺留的密鑰,將其刪除掉
$ mkdir key_backup
$ cp id_rsa* key_backup
$ rm id_rsa*
3.生成新的公鑰
$ ssh-keygen -t rsa -C "郵箱地址"
4.查詢
cat ~/.ssh/id_rsa.pub
41.Xcode出現 黃色警告 Treating Unicode character as whitespace
由於在複製粘貼代碼時出現不規則的換行致使,只須要在xcode中從新換行便可.
42.RunLoop的一個經常使用點, 用戶交互和NSTimer的問題. 把timer加到runloop中的該模式下.
[[NSRunLoop currentRunLoop] addTimer:self.timer forMode:NSRunLoopCommonModes];
UITableView * tabelView = [[UITableView alloc]init];
tabelView.estimatedRowHeight = 64;
tabelView.rowHeight = UITableViewAutomaticDimension;
NSString+height.h
// // NSString+height.h // lockView // // Created by Shaoting Zhou on 2018/1/31. // Copyright © 2018年 Shaoting Zhou. All rights reserved. // #import <Foundation/Foundation.h> #import <UIKit/UIKit.h> @interface NSString (height) -(CGFloat)heightWithText:(NSString *)text font:(UIFont *)font width:(CGFloat )width; @end
NSString+height.m
// // NSString+height.m // lockView // // Created by Shaoting Zhou on 2018/1/31. // Copyright © 2018年 Shaoting Zhou. All rights reserved. // #import "NSString+height.h" #import <Foundation/Foundation.h> #import <UIKit/UIKit.h> @implementation NSString (height) -(CGFloat)heightWithText:(NSString *)text font:(UIFont *)font width:(CGFloat )width{ NSDictionary * dic = @{NSFontAttributeName:font}; CGSize size = [text boundingRectWithSize:CGSizeMake(width, MAXFLOAT) options:(NSStringDrawingUsesFontLeading|NSStringDrawingUsesLineFragmentOrigin) attributes:dic context:nil].size; return size.height; } @end
使用:
NSString * str = @"2222222222222222222222222222222222"; CGFloat ff = [str heightWithText:str font:[UIFont systemFontOfSize:12] width:40]; NSLog(@"%f",ff);
44.NSRunLoop 在子線程上須要手動開啓:
[[NSRunLoop currentRunLoop] run];
同時,子線程的定時器,須要在子線程上invalidate,不要在主線程,不然會形成runLoop資源的浪費.
45.SourceTree每次推拉代碼都須要輸入兩次密碼.
主要是在http:// 加上 git用戶名:密碼@ 便可.而後一路肯定便可.
46.xcode 安裝真機 出現 App instanllation failed.如圖
這個看似很明確的問題,實際上是個巨大無比的坑.
我一開始,先添加了新的描述文件===無效
新創建證書===無效
聽信網上謠言,改xcode版本===無效
清除xcode緩存===無效
修改手機時間===無效
換網絡環境===無效
而後看網上說,product name須要英語,不能爲漢字.可個人就是英語啊.但個人有_存在.
我試着刪除_,運行.馬丹,居然就行了.........
浪費我兩天時間.......碼農不易,且行且悲哀!!!
47. 使用carthage拉取三方庫時: carthage update.
找到 /var/folders/8r/l6swljzd11gg11mgt_9s6c400000gn/T/carthage-xcodebuild.9QXfgA.log 文件.
發現:
直接把該庫版本刪除或者提升便可.
48.iOS 上傳App Store發生 'XXXXX' has one iOS Distribution certificate but its private key is not installed .contact the creator of this certificate to get a copy of the private key.
點擊Manage Certificates...
而後從新+一個就行了......
49.TestFlight 上傳過程當中出現communication error.please use diagonstic mode to ........TCP port 443.
個人問題是一開始我科..學..上..網了.而後到一半我退掉了科...學..上網.出現的.解決方法全程關閉科..學..上..網