一. 重新創建項目,設置賬號運行,突然出現下面的情況:
我來簡單的翻譯一下最重要的:
Your maximum App ID limit has been reached. You may create up to 10 App IDs every 7 days
你的最大限制應用程序ID。你可以每7天創建10個APP IDs
------------我是一個可愛的分割線------------
也就是說,你的當前的開發者賬號在創建APP IDs的有效期是7天,同樣的,在7天內的最大飽和創建數量是10個.(我是這么理解的)
這里算是一個坑,針對XCode7的改變之一,因為特別是針對開發初學者而言,需要創建多數demo用來調試程序,功能寫好了,添加到相應的程序中,這里的限制顯然是為了蘋果開發者文件的資源最優化.
ps:蘋果現在是越來越矯情
- 問題出現了,該怎么解決呢,我采用比較笨的方案,當然也是可行方案:
將自己每一個創建項目的(必須通過自己或者相關的賬號)Bundle Identifier記錄下來,怎么記錄都行,我是用印象筆記記錄的,等到在創建項目的時候出現這樣的問題,直接使用之前自己創建的Bundle Identifier就行了.
二. XCode亂七八糟的碎碎念
先來個截圖
為了方便用戶搜索,現在貼出輸出代碼:
2016-10-17 17:17:12.846456 ChildDoByFarther[10287:907310] subsystem: com.apple.UIKit, category: HIDEventFiltered, enable_level: 0, persist_level: 0, default_ttl: 0, info_ttl: 0, debug_ttl: 0, generate_symptoms: 0, enable_oversize: 1, privacy_setting: 2, enable_private_data: 0
2016-10-17 17:17:12.849892 ChildDoByFarther[10287:907310] subsystem: com.apple.UIKit, category: HIDEventIncoming, enable_level: 0, persist_level: 0, default_ttl: 0, info_ttl: 0, debug_ttl: 0, generate_symptoms: 0, enable_oversize: 1, privacy_setting: 2, enable_private_data: 0
2016-10-17 17:17:12.857289 ChildDoByFarther[10287:907305] subsystem: com.apple.BaseBoard, category: MachPort, enable_level: 1, persist_level: 0, default_ttl: 0, info_ttl: 0, debug_ttl: 0, generate_symptoms: 0, enable_oversize: 0, privacy_setting: 0, enable_private_data: 0
2016-10-17 17:17:12.869714 ChildDoByFarther[10287:907269] subsystem: com.apple.UIKit, category: StatusBar, enable_level: 0, persist_level: 0, default_ttl: 0, info_ttl: 0, debug_ttl: 0, generate_symptoms: 0, enable_oversize: 1, privacy_setting: 2, enable_private_data: 0
2016-10-17 17:17:12.889922 ChildDoByFarther[10287:907269] subsystem: com.apple.BackBoardServices.fence, category: App, enable_level: 1, persist_level: 0, default_ttl: 0, info_ttl: 0, debug_ttl: 0, generate_symptoms: 0, enable_oversize: 0, privacy_setting: 0, enable_private_data: 0
這里呢,其實是XCode8更新后輸出的XCode的日志,反正我是看不懂,目前為止對我而言無關緊要,要是有看得懂的可以私信我研究研究.
好的,接下來,說一下解決方案,目前為止的可行解決方案修改配置(直接上圖來的直觀):
-
在XCode的左上角點擊項目名稱,出現如下:
進入配置 -
選擇Arguments中的Environment Variables,并點擊+號:
選擇配置相關 -
在Environment Variables下邊添加:OS_ACTIVITY_MODE, value值設置為disable...........添加后點擊Close
添加配置 -
完美解決
完美
三.iOS項目中的中文字符查找
1.打開”Find Navigator",并且將搜索方式切換搜索模式到 “Find > Regular Expression”,如下圖
2.輸入查找信息
OC輸入:@"[^"]*[\u4E00-\u9FA5]+[^"\n]*?"
Swift輸入:@"[^"]*[\u4E00-\u9FA5]+[^"\n]*?"
效果展示如上圖查到的結果一樣.
備注,在參考網絡上的解決方案,發現可以根據正則表達來解決這個事情,但是,由于本人對正則方案不是很了解,下面貼出解決方案,大家有興趣的可以參考參考:
如果你跟我一樣嫌NSLocalizedString的comment礙事 也可以用正則替換掉
Find NSLocalizedString\((@"[^\)]*?")\s*,\s*@"[^\)]*"\s*\)
Replace With NSLocalizedString\($1, nil\)
四.評論的坑:屏幕的多點觸控導致的UIButton和UITextField均相應
說明:這是我在開發中,點擊cell可以對評論進行回復或者舉報,采用蘋果原聲的UIActionSheet觸發事件,評論區域采用自定義View,添加UITextField.在非正常操作中,比如長按cell,這時候再點擊UITextField,此時UITextField是可以相應鍵盤彈起來的,但是,再松開長按cell的點擊的手,此時cell的觸發事件也會相應,這樣必然是不對的.
下面是錯誤視頻:
直接上解決方案:
思路:采取NSTimeInterval記錄按下和抬起兩個事件觸發的時間,并通過這個差值考慮觸發事件.
規定:考慮到人性主義和人體工學,選擇0.5s時間差為有效觸發事件
1.創建實例變量,記錄兩中不同的點擊觸發事件的時間
//保存長按的時間差
NSTimeInterval _timeInterVal1;
NSTimeInterval _timeInterVal2;
2.給UIButton添加兩種觸發狀態
// 點擊
[_reverBtn addTarget:self action:@selector(onReverBtnTapStart:) forControlEvents:UIControlEventTouchDown];
// 離開
[_reverBtn addTarget:self action:@selector(onReverBtnTapFinish:) forControlEvents:UIControlEventTouchUpInside];
3.再開始點擊的觸發事件的方法,記錄開始電機的時間:
-(void)onReverBtnTapStart:(UIButton *)sender {
_timeInterVal1 = [[NSDate date] timeIntervalSince1970];
}
4.在結束點擊的觸發事件的方法中,記錄結束點擊的時間,并根據這個時間差進行事件的處理方法:
-(void)onReverBtnTapFinish:(UIButton *)sender {
_timeInterVal2 = [[NSDate date] timeIntervalSince1970];
if(_timeInterVal2 - _timeInterVal1 < 0.5)
{
if ([_delegate respondsToSelector:@selector(commentCell:didTapRevertComment:)]) {
[_delegate commentCell:self didTapRevertComment:_comment];
}
}
else if(_timeInterVal2-_timeInterVal1>3.0)
{
return;
}
}
五.數據庫的升級(FMDB)
實在不知道開頭怎么寫,先這樣吧.
數據庫升級,對本地數據保存有著不可或缺的重要性,雖然移動開發針對的更多是功能性和展示性的東西,但是為了增加用戶體驗,會獲取到一些數據保存起來,比如首頁的信息緩存等等,數據庫的使用就不在多說了,要是不明白或者不了解,可以看看關于數據庫方面的東西.
為了方面使用,采用了FMDB,這是個比較好的封裝的數據庫第三方.
不多說直接上代碼:
1.創建靜態數據庫隊列
static FMDatabaseQueue *_queue;
2.創建版本號
版本號為了方便啟動,建議以整形的數據進行保存
NSString * const currentHPCacheToolVerson = @"2";
3.在initialize方法中創建數據庫的基本信息
這里面主要是根據FMDatabase中的userVerson進行版本的判斷,初始化版本的時候,默認是0,這里就方便了第一次安裝和老用戶,因為在當前存在數據庫版本升級的版本之前,都是0,這里我們把0作為初始版本,即初始化創建的表和相關的字段.
+ (void)initialize {
NSString *path = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:@"homeData.sqlite"];
_queue = [FMDatabaseQueue databaseQueueWithPath:path];
[_queue inDatabase:^(FMDatabase *db) {
if (db.userVersion == 0) {
[db executeUpdate:@"create table if not exists t_homeGroup (id integer primary key autoincrement, homeGroup blob);"];
[db executeUpdate:@"create table if not exists t_videoInfos (id integer primary key autoincrement, videoInfo blob)"];
[db executeUpdate:@"create table if not exists t_homeGroupDetial (id integer primary key autoincrement, groupId text, homeGroupDetial blob);"];
[db executeUpdate:@"create table if not exists t_paintComics (id integer primary key autoincrement, paintComic blob, creatTime text, userId text);"];
[db executeUpdate:@"create table if not exists t_dynamics (id integer primary key autoincrement, dynamics blob, creatTime text, userId text);"];
[db executeUpdate:@"create table if not exists t_discoverTopics (id integer primary key autoincrement, discoverTopics blob, creatTime text, userId text);"];
// 這里需要注意的是,在創建完成之后,需要講創建后的版本設定為1,這里是考慮到老用戶和新用戶的問題
[db setUserVersion:1];
}
// 在的設定完初始版本后,進行數據哭的判斷更新
[self updateSQL];
}];
}
4.版本更新,這里也是作重要的一個部分
這里做的是匹配版本號,根據當前版本號與預期版本號進行對比,并將版本號對應的更新寫入到swich中,如果當前更新完成后,版本號與預期版本號相等,則break,如果不相等(小于),則繼續升級.當然,有很多朋友更喜歡寫成遞歸的形式,考慮到理解性方面,我還是采用swich方式給大家講解吧.
- (void)updateSQL {
if (db.userVersion < [currentHPCacheToolVerson integerValue]) {
// 更新數據庫
[self updateDBWithOldDBVerson:db.userVersion db:db];
}
}
+ (void)updateDBWithOldDBVerson:(int32_t)verson db:(FMDatabase *)db {
switch (verson) {
case 1: {
// DO 添加數據庫中表的字段
[db executeStatements:[NSString stringWithFormat: @"ALTER TABLE t_homeGroup ADD creatTime text"]];
[db executeStatements:[NSString stringWithFormat: @"ALTER TABLE t_homeGroup ADD userId text"]];
[db executeStatements:[NSString stringWithFormat: @"ALTER TABLE t_videoInfos ADD creatTime text"]];
[db executeStatements:[NSString stringWithFormat: @"ALTER TABLE t_videoInfos ADD userId text"]];
[db executeStatements:[NSString stringWithFormat: @"ALTER TABLE t_homeGroupDetial ADD creatTime text"]];
[db executeStatements:[NSString stringWithFormat: @"ALTER TABLE t_homeGroupDetial ADD userId text"]];
// 更新完成后,版本號迭代
verson++;
//寫入新的版本號
[db setUserVersion:verson];
if ([currentHPCacheToolVerson integerValue] == verson) {
break;
}
}
default:
[ZZHUDMessage showCompletedText:@"數據庫升級失敗,請在個人中心中反饋" withCompletedType:HUDShowCompletedTypeError];
break;
}
}
5.iOS 解決.dylib找不到的問題
原因:應該是從iOS7之后,所有的依賴庫由.dylib變成了.tbd
As for Xcode 7 b4: To add Parse support into existing project, follow the Parse "Set up the SDK" for existing project and to add the libz and libsqlite3 libs, use:
如下圖所示:
*當然,有網友說tbd使用也是一樣的.但是,我們的dylib去哪里添加呢?
幾經波折,終于找到了添加的方法:
1. Build Phases -> Link Binary with Libraries -> +
2.點擊彈框左下角的"Add Other..."
3.快捷鍵 "command+shift+G"
4.快速搜索路徑:"/usr/lib",點擊Go
5.在左上角輸入搜索內容"libz"(這里以libz.dylib為例子),搜索完后,點擊"lib"的標簽,然后就出現搜索到的結果啦
6.最后點擊搜索的結果,再點擊open就可以了.
這里會不斷更新自己項目工程中遇到的BUG和問題,并給出相關的解決方案,希望大家多多交流.謝謝
最后,附上本人寫的相關的demo,有一些實用性的例子,相互學習,相互交流:demo地址