app內(nèi)的瀏覽器設(shè)置user agent
在設(shè)置了applicationNameForUserAgent后發(fā)現(xiàn)沒有生效,原因是有三種犯法設(shè)置user agent,優(yōu)先級為customUserAgent > UserDefault > applicationNameForUserAgent,而且全局生效,排查后發(fā)現(xiàn)以前使用UserDefault設(shè)置過user agent,所這里也應(yīng)該使用UserDefault設(shè)置user agent才能覆蓋以前的設(shè)置。
web view退出音視頻播放不停止
優(yōu)先排查是否發(fā)生內(nèi)存泄漏,導(dǎo)致web view對象沒有被釋放
沒問題之后可以通過evaluateJavaScript方法,遍歷找到H5頁面里的視頻元素,控制其暫停或者繼續(xù)播放去解決問題。
[self.webView evaluateJavaScript:@"var videos = document.getElementsByTagName('video');\
for (var i=0;i < videos.length;i++){\
videos[i].pause();\
}" completionHandler:nil];
組件化開發(fā)引入 .a庫文件
在組件化開發(fā)中,各組件不能引用主項目下的文件,反之可以。SDK不是pod也不是源碼的形式,是以.a文件形式的靜態(tài)庫引入。主項目下引入各組件不能使用,在組件中也不能像在主項目中一樣直接拖入。在組件中使用.a文件形式的靜態(tài)庫需要在庫配置文件.podspec中增加特殊依賴s.vendored_libraries = 'xxx/*.a'
私有庫跳過驗證強制發(fā)布
pod repo push $Repo_Name $Spec_Name $sourceStr --verbose --use-libraries --allow-warnings --skip-import-validation --skip-tests
UIDocumentInteractionController
iOS 13之前,網(wǎng)絡(luò)鏈接(例如https開頭)不支持系統(tǒng)的打開
網(wǎng)絡(luò)連接系統(tǒng)打開里不包含safari
UIlabel賦值崩潰
錯誤原因是用nsnumber類型的數(shù)據(jù)給uilabel賦值。但是檢查的時候uilabel是被nsstring類型賦值沒有問題,問題的原因是在接受服務(wù)端接口數(shù)據(jù)時沒有創(chuàng)建模型文件,直接根據(jù)key取值,系統(tǒng)就會推測數(shù)據(jù)類型,得到的nsnumber給nsstring類型變量賦值并不會報錯,之后再用這個nsstring給uilabel賦值也不會報錯,但是運行后就會崩潰
url含中文轉(zhuǎn)碼
網(wǎng)絡(luò)標準RFC 1738規(guī)定
“只有字母和數(shù)字[0-9a-zA-Z]、和特殊符號”$-_.+!*’(),”[不包括雙引號]、及某些保留字,才可以不經(jīng)過編碼直接用于URL?!?br>
此時如果url中包含如漢字或者其他特殊字符則需要對它進行編碼,編碼的意義在于,假如url的參數(shù)中的中文或特殊字符在發(fā)送到服務(wù)端時,服務(wù)端無法解析它的真正意義,會導(dǎo)致服務(wù)端不能理解客戶端的請求。
iOS xcode系統(tǒng)提供的API
(nullable NSString *)stringByAddingPercentEncodingWithAllowedCharacters:(NSCharacterSet *)allowedCharacters;
就可以實現(xiàn)編碼還可以自定義忽略的字符。
注意的是`#%^{}"[]|<>,這些字符跟7-bit ASCII字符默認不會被編碼。如果想進行編碼需要對上面API的allowedCharacters進行編輯
左滑手勢相關(guān)
一,因為滑動是一個過程,會被一直監(jiān)聽,所以一次滑動,監(jiān)聽方法會一直執(zhí)行,實現(xiàn)效果就是一次滑動后,執(zhí)行某種動作,這時候就需要對手勢的狀態(tài)做判斷,只有結(jié)束時才執(zhí)行,最終一次滑動執(zhí)行一次監(jiān)聽方法。
二,再添加手勢時要對方向最初判斷,要不就會出現(xiàn)左滑也后退,系統(tǒng)提供的swipe手勢可以判斷方向,但是不能覆寫系統(tǒng)私有API去實現(xiàn)自定義的頁面左滑 (handleNavigationTransition:),所以使用pan拖拽手勢,使用位移的坐標是絕對值并不能判斷方向,拖拽的速度是有正負的,可以以此判斷方向
//側(cè)滑手勢
UIPanGestureRecognizer *panGesture = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handleNavigationTransition:)];//覆寫系統(tǒng)API
panGesture.delegate = self; // 設(shè)置手勢代理,攔截手勢觸發(fā)
[self.view addGestureRecognizer:panGesture];
self.navigationController.interactivePopGestureRecognizer.enabled = YES;
self.navigationController.interactivePopGestureRecognizer.delegate = self;
- (void)handleNavigationTransition:(UIPanGestureRecognizer *)pan{
CGPoint velocity = [pan velocityInView:pan.view];
if([pan state] == UIGestureRecognizerStateEnded && velocity.x > 0){//拖動結(jié)束并且根據(jù)速度判斷方向
//TODO: 實現(xiàn)的效果
}
}
}
數(shù)據(jù)模型中屬性名稱與json中Key沖突
解析json文件時,模型中定義的屬性名稱與json中的key不一致時可以使用YYModel中的方法modelCustomPropertyMapper進行映射
例如 在類型定義了屬性
@property (nonatomic, assign) NSInteger errerCode;
在json中對應(yīng)的內(nèi)容是
"errorID": "2"
+ (NSDictionary *)modelCustomPropertyMapper {
return @{@"errerCode" : @"errorID"
};
}
為什么有些block不需要weakify(self)
block 默認都是棧block 在沒有copy的情況下,在使用完就銷毀了,所以沒有循環(huán)引用問題。我們平時使用的一些系統(tǒng)block,例如GCD 大多都是類方法,所以也不會出現(xiàn)相互持有的問題。在我們自己寫的一些回掉方法中希望執(zhí)行完block不銷毀,所以使用copy,變成了堆block,才會出現(xiàn)與對象相互持有,這時我們需要使用強弱化去打破循環(huán)引用
Http請求
默認不支持,需要設(shè)置
iOS 9 NSAllowsArbitraryLoads,也就是全局允許http
iOS 10 以后推出了NSAllowsArbitraryLoadsInWebContent等具體的http權(quán)限設(shè)置,一旦設(shè)置為YES,系統(tǒng)會自動忽略全局允許http的設(shè)置。