A. xcode編譯緩存與本地時間有關嗎
有關系。
我是安裝一款軟體,然後通過改個系統時間來升級為免費版本。安裝完成後忘記把系統時間改回來了,然後去編譯xcode(6.4)。真機測試的時候提示開發者證書過期了。what!剛剛還好好的,為什麼開發者證書就過期了呢?
鑰匙串訪問
通過查看鑰匙串裡面的證書發現真的都過期了,證書全部顯示無效。好傢伙,我估摸著怎麼突然證書都失效了呢,然後看到了證書的日期
過期是2016年
原來是系統時間被改成2020年了,怪不得證書過期了,然後我刪掉了原來的證書,改回了系統的時間,重新安裝了新的證書,ok 可以真機測試了。真的是給自己跪了。(PS:個人認為,時間改回來就好,證書不需要刪也是可以用的)
B. 如何清理Xcode編譯時生成的臨時文件
方法/步驟
1
激活「Finder」,打開「前往/前往文件夾...」
2
在彈出的對話框中輸入「~/資源庫」,然後點擊「前往」
3
在資源庫目錄中打開「Developer/Xcode」目錄,
4
在Xcode目錄中,有DerivedData和Snapshots兩個文件夾,刪除裡面文件即可。
DerivedData目錄保存Xcode的緩存數據,當Xcode運行多個版本時,會有不同的緩存。
http://jingyan..com/article/48b558e32a87b57f38c09ab5.html
C. Xcode 清理
在這里,記錄下自己清理的Xcode緩存和舊文件,整理出來,希望能幫助更多的人。
注意: 不可以恢復,文件刪除後,歷史打包記錄會顯示為空。建議備份刪除。
路徑: ~/Library/Developer/Xcode/Archives
注意: 可重新生成,會刪除build生成的索引,輸出和日誌。大的項目生成會浪費時間。
路徑: ~/Library/Developer/Xcode/DerivedData
4.移除 APP 打包的app icon歷史版本(Archives)
刪除後不可恢復,文件夾是Bundle Idenifier排列的,然後再按照archive的版本號排列的,如果你看每個版本內的內容,其實就是你的app icon,個人建議全部刪除。
路徑:~/Library/Developer/Xcode/Procts/
一、刪除iPhone模擬器產生的設備緩存數據
1、雙擊【Finder】,點擊【前往文件夾】,進入目錄:~/資源庫/Developer/CoreSimulator/Devices/下,如圖
二、刪除安裝app產品的設備數據緩存文件
雙擊【Finder】,點擊【前往文件夾】,進入目錄:~/資源庫/Developer/Xcode/DerivedData/下,如果裡面有緩存文件也是可以全部刪除的
D. iOS編譯加速-CCache
CCache是一個編譯工具,可以將xcode編譯文件緩存起來,從而達到編譯提速。
優點
能大幅度地提升編譯速度,起碼要減少掉 50% 的編譯時間
不需要對項目作出重大調整
不需要改變開發工具鏈
缺點
不支持clang的moles,需要手動引入鏈接庫
不支持oc++
不支持swift
brew install ccache
需要兩個腳本,需要對c++和oc分別處理
修改兩個文件的許可權
$ chmod 777 ccache-clang
cache directory /Users/frank/.ccache
primary config /Users/frank/.ccache/ccache.conf
secondary config (readonly) /usr/local/Cellar/ccache/3.6/etc/ccache.conf
stats updated Thu Apr 25 17:20:42 2019
cache hit (direct) 0
cache hit (preprocessed) 1
cache miss 855
cache hit rate 0.12 %
called for link 1
compile failed 4
unsupported compiler option 487
no input file 2
cleanups performed 0
files in cache 4134
cache size 133.5 MB
max cache size 10.0 GB
移除PCH,CCache是通過md4進行緩存查找,因此當你修改了 PCH 或者 PCH 引用到的頭文件的內容時,會造成全部緩存失效,只能全體重新編譯。
E. Xcode 緩存目錄
這個文件夾中保存的是Xcode的緩存文件,曾經在Xcode跑過的所有項目的索引、build的信息等都會保存在這里。刪除後在下次打開項目編譯的時候將會重新生成。由於這里包含了大量已經沒用的項目的信息又懶得去篩選,可以把整個文件夾刪了。
每次把一個設備接入電腦進行真機調試之前,電腦會對設備建立索引,也在此文件夾下生成對該設備系統的支持文件。於是這里存在了一堆對舊版本iOS設備支持的文件。
每次打包App的dSYM等數據就保存在這里,把一些沒用的版本刪了。如果是上線了的版本還是保留吧。
同上,把沒用的刪了。
一堆模擬器的數據。每個文件夾里包含的就是一個特定系統版本的設備的數據。每個文件夾對應哪個設備可以在其下device.plist中查看。親測刪除之後的效果跟在模擬器里重置相同。省得一個個去重置了,刪吧。
原文: https://blog.csdn.net/hu434587115/article/details/54602449
F. Xcode編譯慢打包慢解決方法
1. 提高 XCode 編譯時使用的線程數
defaults write com.apple.Xcode 48 cpu 佔用會特別高 達到150%的樣子,15寸 設置48比較好,否則操作其他因員工可能會卡
XCode 默認使用與 CPU 核數相同的線程來進行編譯,但由於編譯過程中的 IO 操作往往比 CPU 運算要多,因此適當的提升線程數可以在一定程度上加快編譯速度。本人採用的是 4 核的 CPU ,將線程數改為 8 後編譯速度略有提升。
2. 將 Debug Information Format 改為 DWARF
在工程對應Target的Build Settings中,找到Debug Information Format這一項,將Debug時的DWARF with dSYM file改為DWARF。
這一項設置的是是否將調試信息加入到可執行文件中,改為DWARF後,如果程序崩潰,將無法輸出崩潰位置對應的函數堆棧,但由於Debug模式下可以在XCode中查看調試信息,所以改為DWARF影響並不大。這一項更改完之後,可以大幅提升編譯速度。
// 這一條暫時不用管,默認配置
3. 將 Build Active Architecture Only 改為 Yes
在工程對應Target的Build Settings中,找到Build Active Architecture Only這一項,將Debug時的No改為Yes。
這一項設置的是是否僅編譯當前架構的版本,如果為No,會編譯所有架構的版本。需要注意的是,此選項在Release模式下必須為Yes,否則發布的ipa在部分設備上將不能運行。這一項更改完之後,可以顯著提高編譯速度。
在設置完以上三個項之後,相信編譯時間會縮短很多。
4. 如何關掉 CCache 提高編譯打包速度呢編寫腳本,文件名稱ccache
放到Xcode項目根目錄,然後
詳情見這篇帖子
https://www.jianshu.com/p/c9e3fb3dfa53
5. 去掉打包緩存
~/Library/Developer/Xcode/Procts
G. xcode 如何編譯
Xcode 常用編譯選項設置
在xcconfig文件中指定即可。
用標准庫連接
LINK_WITH_STANDARD_LIBRARIES = YES如果激活此設置,那麼編譯器在鏈接過程中會自動使用通過標准庫的鏈接器。
Info.plist 輸出編碼
INFOPLIST_OUTPUT_FORMAT = binary指定Info.plist文件的輸出編碼(默認情況下,輸出與輸入的編碼保持不變),這個輸出編碼能指定「binary」或者「XML」。
生 成調試符號GCC_GENERATE_DEBUGGING_SYMBOLS = NO當啟用的時候,詳情等級能夠通過build的』Level of Debug Symbols』設置去控制。 隱藏內聯方法GCC_INLINES_ARE_PRIVATE_EXTERN = YES Objective-C GCGCC_ENABLE_OBJC_GC = Unsupported 優化級別GCC_OPTIMIZATION_LEVEL = Fastest, Smallest [-OS]
None: 不做優化使用這個設置,編譯器的目標是減少編譯成本,使調試產生預期的結果。
Fast:優化編譯將為大函數佔用更多的時間和內存使用這個設置,編譯器將嘗試減少代碼的大小和執行時間,不進行任何優化,需要大量編譯時間。
Faster:編譯器執行幾乎所有支持的優化,它不考慮空間和速度之間的平衡與「Fast」設置相比,該設置會增加編譯時間和生成代碼的性能。編譯器不進行循環展開、內聯函數和寄存器變數的重命名。
Fastest:開啟「Faster」支持的所有的優化,同時也開啟內聯函數和寄存器變數的重命名選項
Fastest,smallest:優化代碼大小這個設置啟用「Faster」所有的優化,一般不增加代碼大小,它還執行旨在減小代碼大小的進一步優化。
C 語言方言GCC_C_LANGUAGE_STANDARD = C89 警告 檢查Switch語句GCC_WARN_CHECK_SWITCH_STATEMENTS = YES 隱藏局部變數GCC_WARN_SHADOW = YES 隱式轉換成32位的類型GCC_WARN_64_TO_32_BIT_CONVERSION = YES 未完成的Objective-C協議GCC_WARN_ALLOW_INCOMPLETE_PROTOCOL = YES 抑制所有的警告GCC_WARN_INHIBIT_ALL_WARNINGS = NO 初始化時沒有完整的括弧GCC_WARN_INITIALIZER_NOT_FULLY_BRACKETED = YES例子(a沒有完全的括弧,b有):
int a[ 2 ][ 2 ] = { 0, 1, 2, 3 };
int b[ 2 ][ 2 ] = { { 0, 1 }, { 2, 3 } };
不匹配的返回類型
GCC_WARN_ABOUT_RETURN_TYPE = YES 缺少括弧GCC_WARN_MISSING_PARENTHESES = YES例子:
{
if( a )
if( b )
foo();
else
bar();
}
{
if( a )
{
if( b )
foo();
else
bar();
}
}
在結構體初始化時缺少欄位
GCC_WARN_ABOUT_MISSING_FIELD_INITIALIZERS = YES
缺 少函數原型GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES 在文件結尾缺少新行GCC_WARN_ABOUT_MISSING_NEWLINE = YES 選擇了多個定義的類型(@Selector)GCC_WARN_MULTIPLE_DEFINITION_TYPES_FOR_SELECTOR = NO 嚴格的Selector匹配GCC_WARN_STRICT_SELECTOR_MATCH = YES 把缺少函數原型當作錯誤GCC_TREAT_IMPLICIT_FUNCTION_DECLARATIONS_AS_ERRORS = YES 把所有的警告當作錯誤GCC_TREAT_WARNINGS_AS_ERRORS = YES 未定義的SelectorGCC_WARN_UNDECLARED_SELECTOR = YES 未初始化的自動變數GCC_WARN_UNINITIALIZED_AUTOS = YES 未知的Pragma指令GCC_WARN_UNKNOWN_PRAGMAS = YES 未使用的函數GCC_WARN_UNUSED_FUNCTION = YES 未使用的標簽GCC_WARN_UNUSED_LABEL = YES 未使用的參數GCC_WARN_UNUSED_PARAMETER = YES 未使用的值GCC_WARN_UNUSED_VALUE = YES當一個語句計算的結果顯式的未使用的時候發出警告 未使用的變數GCC_WARN_UNUSED_VARIABLE = YES 警告-所有過時的函數GCC_WARN_ABOUT_DEPRECATED_FUNCTIONS = YES offsetof宏未定義使用的警告GCC_WARN_ABOUT_INVALID_OFFSETOF_MACRO = YES
iphone 常用的<app>-info.plist設置
Application requires iPhone environment如 果應用程序不能在ipod touch上運行,設置此項為true;
Application uses Wi-Fi如果應用程序需要wi-fi才能工作,應該將此屬性設置為true。這么做會提示用戶,如果沒有打開wi-fi的話,打開wi-fi。為了節省 電力,iphone會在30分鍾後自動關閉應用程序中的任何wi-fi。設置這一個屬性可以防止這種情況的發生,並且保持連接處於活動狀態
Bundle display name這用於設置應用程序的名稱,它顯示在iphone屏幕的圖標下方。應用程序名稱限制在10-12個字元,如果超出,iphone將縮寫名 稱。
Bundle identifier這個為應用程序在iphone developer program portal web站點上設置的唯一標識符。(就是你安裝證書的時候,需要把這里對應修改)。
Bundle version這個會設置應用程序版本號,每次部署應用程序的一個新版本時,將會增加這個編號,在app store用的。
Icon already includes gloss and bevel effects默認情況下,應用程序被設置了玻璃效果,把這個設置為true可以阻止這么做。
Icon file(這個不用多說了)設置應用程序圖標的。
Main nib file base name應用程序首次啟動時載入的xib文件 這個基本用不到。
Initial interface orientation 確定了應用程序以風景模式還是任務模式啟動
Localizations多語言。應用程序本地化的一列表,期間用逗號隔開,例如 應用程序支持英語 日語,將會適用 English,Japanese. Status bar is initially hidden 設置是否隱藏狀態欄。你懂的。
Status bar style選擇三種不同格式種的一種。
URL types應用程序支持的url標識符的一個數組。
用URL Scheme進行程序跳轉
打開info.plist,添加一項URL types
展開URL types,再展開Item1,將Item1下的URL identifier修改為URL Scheme
展開URL Scheme,將Item1的內容修改為myapp
其他程序可通過myapp://訪問此自定義URL
參考:http://iphonedevelopertips.com/cocoa/launching-your-own-application-via-a-custom-url-scheme.html
IOS後台播放音樂
OS後台播放只是在IOS4.0以後的版本支持。
1,設置後台播放會話
AVAudioSession *session = [AVAudioSession sharedInstance];
[session setActive:YES error:nil];
[session setCategory: error:nil];
2,在info.plist裡面添加
<key>UIBackgroundModes</key>
<array>
<string>audio</string>
</array>
靜態庫沒法包含category/分類?
如果你導入一個objc靜態庫,發現很多objc的category 不能調用,可以嘗試在主工程中加入linker選項:
-all_load 加入這個一般就夠了
-ObjC
讓程序最小化再開啟時,從頭開始:
按下 「Home」 鍵以後程序可能並沒有退出而是轉入了後台運行。如果您想讓應用直接退出,最簡單的方法是:在 info-plist 裡面找到 Application does not run in background 一項,勾選即可。
程序退出後任務欄還是有圖標,但是程序原來的所有運行狀態全部丟失,點擊任務欄圖標也不過相當於再次啟動程序;如果允許後台運行,點擊任務欄圖標後會恢復程序中斷時的界面。
本地化字元串:
在infoPlist.strings裡面寫
「string1″=」水果」
代碼裡面寫 myLabel.text = NSLocalizedString(@」string1″, nil);
本地化的Bundle display name:
1)創建一個空文件,取名為InfoPlist.strings
2)對InfoPlist.strings進行本地化(Get Info -> Make Localization),然後設置需要的語言(如中文zh)
3)編輯不同的InfoPlist.strings文件,設置顯示名字
CFBundleDisplayName = 「名字」;
4)(這步不做貌似也可以)編輯Info.plist,添加一個新的屬性Application has localized display name, 設置其類型為boolean,並將其value設置為選中狀態
default圖片的銜接問題:
程序開始後,手動載入default圖片,然後進行過渡效果即可。
遍歷目錄:
NSString *appDocDir = [[[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject] relativePath];NSArray *contentOfFolder = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:appDocDir error:NULL];for (NSString *aPath in contentOfFolder) { NSLog(@"apath: %@", aPath); NSString * fullPath = [appDocDir :aPath]; BOOL isDir; if ([[NSFileManager defaultManager] fileExistsAtPath:fullPath isDirectory:&isDir] && !isDir) { [fileList addObject:aPath]; }}
IB:
不論寫不寫property的retain,由IBOutlet都會為對象加一個retainCount,所以只要連接了,就需要在viewDidUnload與dealloc中release並適當置為nil。
預先在IB裡面載入好的文件(比如圖片),即使釋放了Controller,IB中的文件也不會被釋放,直至內存警告,解決辦法是較大的資源用代碼載入。
UIWebView:
用代碼載入UIWebView的內容,navigationType是UIWebViewNavigationTypeOther
CAAnimation:
一定要記得[self.view.layer removeAllAnimations];因為CAAnimation會retain它的delegate
設備型號識別,可通過審核:
+ (NSString*)getDeviceVersion{ size_t size; sysctlbyname("hw.machine", NULL, &size, NULL, 0); char *machine = (char*)malloc(size); sysctlbyname("hw.machine", machine, &size, NULL, 0); NSString *platform = [NSString stringWithCString:machine encoding:NSUTF8StringEncoding]; free(machine); return platform;}
輸出:
//@」iPad1,1″
//@」iPad2,1″
//@」i386″
逗號後面數字解釋:(i386是指模擬器)
1-WiFi版
2-GSM/WCDMA 3G版
3-CDMA版
AppleTV(2G) (AppleTV2,1)
iPad (iPad1,1)
iPad2,1 (iPad2,1)Wifi版
iPad2,2 (iPad2,2)GSM3G版
iPad2,3 (iPad2,3)CDMA3G版
iPhone (iPhone1,1)
iPhone3G (iPhone1,2)
iPhone3GS (iPhone2,1)
iPhone4 (iPhone3,1)
iPhone4(vz) (iPhone3,3)iPhone4 CDMA版
iPhone4S (iPhone4,1)
iPodTouch(1G) (iPod1,1)
iPodTouch(2G) (iPod2,1)
iPodTouch(3G) (iPod3,1)
iPodTouch(4G) (iPod4,1)
判斷ipad/iphone
12UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPadUI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone
或者
1[[[UIDevice currentDevice] model] isEqualToString:@"iPad"];
判斷設備是否有攝像頭
1[UIImagePickerController isSourceTypeAvailable:];
H. xcode緩存怎麼清理
這個刪除緩存是要在Finder裡面進行的,首先要在快捷工具欄里找到Finder,然後點擊進去。
打開Finder後,在最上面的工具欄裡面可以看到「前往」,點擊「前往」則會出現。
然後在按住「option」這個鍵,則會有「資源庫」出現在個人和電腦之間,點擊資源庫。
打開的資源庫,有很多文件,在資源庫里找到「Developer」,點擊「Developer」。
打開「Developer」之後,可以看到裡面的文件夾,然後找到「Xcode」,點擊「Xcode」。
打開「Xcode」之後,可以在其管理下找到「DerivedData」,打開後,可以選擇性的刪除不需要的文件。
I. Xcode清理緩存
1. 點擊空白桌面,菜單欄會出現前往一欄
2. 點擊前往同時按 option 鍵在 個人 和 電腦 中間出現 資源庫 選項.
3.資源庫中找到 Developer 這個文件夾點擊進去找到 Xcode 文件夾最後找到 DerivedData 文件夾把裡面的緩存刪除就可以了。
或者 按快捷鍵 shift+command+G 調出前往文件夾框
在裡面輸入(這些自己拼寫) /Users/(自己電腦名字)/Library/Developer/Xcode/DerivedData 刪掉目錄下文件.
STOP.
J. Xcode 構建速度優化(一)衡量編譯時間
隨著項目不斷迭代,工程文件越來越多,引用的三方庫也越來越多,這些直接導致編譯時間的不斷增加,完整編譯一次項目動輒需要五分鍾以上時間,實在有些影響開發效率,是時候來一波提速了。
為編譯和構建提速,首先我們需要對速度有一個衡量標准:准確獲得構建用時
首先,我們需要定義要衡量和優化的內容。 有兩種選擇:
xcode默認情況下會跟蹤所有構建,我們可以通過更改xcode相關設置,來在活動查看器中顯示出構建時間,通過命令行:
每次編譯成功後,會在Successed之後顯示出所用時間:
Xcode Build Timing Summary是Xcode10中加入的用於查看獲取構建時間和發現用時瓶頸方面的最有利工具。 可以通過Proct->Perform Action->Build With Timing Summary來開啟:這樣在 Build Log 的末尾就會添加 Timing Summary Log。我們可以通過這個 log 看到哪個階段是耗時的,便於我們進行優化。
如上圖中: xib階段的編譯耗時明顯是比普通c文件要多的,意味著我們可以通過減少xib方式來優化提升速度
而c文件的編譯用時比總時間還要長,是因為c文件是並行編譯的
在命令行中同樣可以開啟這個功能:
常用的第三方工具有 BuildTimeAnalyzer 、 xcode-build-times-rendering 、 XCLogParser 。
BuildTimeAnalyzer可以統計可以得出某個文件的類型檢查時長,每個表達式的類型檢查時長。
xcode-build-times-rendering是一個Ruby編寫的第三方工具,可以方便地分別測量目標的構建時間並在圖表上顯示它們,使用gem安裝
接下來使用這個工具自帶命令配置項目
然後構建項目並生成報告:
這個工具使用上比較簡單,缺點是只能從宏觀上生成各個target編譯的整體圖標,無法詳細列出各個內部編譯明細
XCLogParser可以詳細列出各個Target和內部每個文件的編譯耗時,對我們分析編譯時間瓶頸非常有幫助,它的工作原理主要是做為解析器,通過解析xcode編譯生成的xcactivitylog日誌來記錄
安裝:
編譯項目後,進行安裝
安裝成功後通過命令:
會自動在當前目錄的 build/xclogparser/reports/ 路徑下生成報告,其中--project參數需要設置為待分析項目的名字,並注意當前在終端切換到希望寫入日誌的目錄。
報告截圖:
這個工具將作為我們後面分析提升編譯構建速度的主要使用工具。
經過我多次在不同時間段,不同電腦上不斷嘗試編譯,
我發現編譯耗時是一個比較玄的東西,及時在同一台電腦,同一個項目, 同一套環境配置下,編譯用時也會隨著電腦當前狀態(包括同時打開進程、散熱等等)上下大幅跳動,就像演算法時間復雜度一樣,有時候我們明明做了一些細微的優化,但是結果反而是編譯耗時增加了,這是很正常的事情
所以,衡量這個標准需要我們取多次試驗中的平均值作為參考。