大事件
11月27號(hào),蘋果AppStore下架包括拼多多、搜狗地圖、訊飛閱讀和悅跑圈在內(nèi)的共718個(gè)App。據(jù)稱下架原因是觸發(fā)了AppStroe審核指南的2.5.2條例,即使用了熱更新技術(shù)。去年6月份,蘋果層因熱更新下架數(shù)萬款A(yù)pp。

Tips
圖片渲染開銷
我們知道,解壓后的圖片是由無數(shù)像素?cái)?shù)據(jù)組成。每個(gè)像素點(diǎn)通常包括紅、綠、藍(lán)和 alpha 數(shù)據(jù),每個(gè)值都是 8 位(0–255),因此一個(gè)像素通常會(huì)占用 4 個(gè)字節(jié)(32 bit per pixel。少數(shù)專業(yè)的 app 可能會(huì)用更大的空間來表示色深,消耗的內(nèi)存會(huì)相應(yīng)線性增加)。
下面我們來計(jì)算一些通常的圖片開銷:
普通圖片大小,如 500 * 600 * 32bpp = 1MB
跟 iPhone X 屏幕一樣大的:1125 * 2436 * 32bpp = 10MB
即刻中允許最大的圖片,總像素不超過1500w:15000000 * 32bpp = 57MB
有了大致的概念,以后看到一張圖能簡(jiǎn)單預(yù)估,大概會(huì)吃掉多少內(nèi)存。
關(guān)于iOS開發(fā)證書在鑰匙串沒有秘鑰的問題
當(dāng)前現(xiàn)象

只需要將證書拖到登錄,即可生成秘鑰

APP內(nèi)切換語(yǔ)言
APP內(nèi)切換語(yǔ)言有一種比較簡(jiǎn)單的實(shí)現(xiàn)方式,實(shí)現(xiàn)步驟是:
1、存儲(chǔ)語(yǔ)言狀態(tài)
2、刷新KeyWindow.rootViewController
3、刷新Bundle
4、切換語(yǔ)言對(duì)應(yīng)的更新操作
實(shí)現(xiàn)過程:
//1、切換語(yǔ)言,AppleLanguages對(duì)應(yīng)內(nèi)容是數(shù)組,語(yǔ)言符合可以通過Bundle.main.localizations查看
//切換至繁體中文,存儲(chǔ)狀態(tài)
UserDefaults.standard.set(["zh-Hant"], forKey: "AppleLanguages")
//2、刷新keyWindow,createRootViewController為創(chuàng)建rootViewController的方法
UIApplication.shared.keyWindow?.rootViewController = Application.shared.createRootViewController()
//3、更換bundle
//在切換語(yǔ)言的時(shí)候,我們需要執(zhí)行一下,Bundle的exchangeBundle方法
extension Bundle {
static func getLocalizedBundle() -> Bundle {
if let languages = UserDefaults.standard.object(forKey: "AppleLanguages") as? [String],
let lan = languages.first,
let path = Bundle.main.path(forResource: lan, ofType: "lproj"),
let bundle = Bundle.init(path: path){
return bundle
} else {
return Bundle.main
}
}
static func exchangeBundle(){
//替換Bundle.main為自定義的BundleLocal
object_setClass(Bundle.main, BundleLocal.self)
}
}
class BundleLocal: Bundle {
override func localizedString(forKey key: String, value: String?, table tableName: String?) -> String {
return Bundle.getLocalizedBundle().localizedString(forKey: key, value: value, table: tableName)
}
}
//4、其他更新操作,如接口,UI界面
測(cè)試內(nèi)購(gòu)時(shí)長(zhǎng)
當(dāng)我們測(cè)試內(nèi)購(gòu)時(shí),需要考慮內(nèi)購(gòu)到期的情況。比如我測(cè)試購(gòu)買了一個(gè)月的服務(wù),那么購(gòu)買到期的情況呢,不能傻傻地等一個(gè)月時(shí)間吧?
其實(shí)蘋果給出了不同內(nèi)購(gòu)時(shí)長(zhǎng)在Debug情況下對(duì)應(yīng)的測(cè)試時(shí)間。

AVPlayer進(jìn)入前臺(tái)自動(dòng)播放
在我們不進(jìn)行任何前后臺(tái)設(shè)置的情況下,AVPlayer進(jìn)入后臺(tái),會(huì)自動(dòng)暫停播放。再次回到前臺(tái)時(shí),播放器會(huì)有一定概率自動(dòng)恢復(fù)播放(多大概率未知,測(cè)試得出的結(jié)論)。
如果這個(gè)恢復(fù)播放不是我們需要的,或者我們需要避免這種不確定的情況發(fā)生,我們可以手動(dòng)管理這個(gè)過程:
NotificationCenter.default.addObserver(forName: UIApplication.didEnterBackgroundNotification, object: self, queue: nil) { (notification) in
self.player.pause()
}
NotificationCenter.default.addObserver(forName: UIApplication.didEnterBackgroundNotification, object: self, queue: nil) { (notification) in
//根據(jù)需要是否需要恢復(fù)播放
if shouleRecoverPlayer {
self.player.play()
} else {
self.player.pause()
}
}
iOS12.1關(guān)于tabbar的一個(gè)bug
觸發(fā)條件:
- 使用
UITabBarController+UINavigationController組合 -
UITabBar帶半透明效果,isTranslucent屬性為 true -
UIViewController的hidesBottomBarWhenPushed屬性為 true - 通過導(dǎo)航欄返回上一頁(yè)時(shí)(導(dǎo)航欄返回按鈕 or 屏幕左側(cè)的滑動(dòng)返回手勢(shì))
問題現(xiàn)象:

經(jīng)確認(rèn)是iOS12.1上的一個(gè)bug。
解決方案:
//MARK: - fix ios12.1 tabbar bug
let tabbar = UITabBar.appearance()
tabbar.isTranslucent = false
詳細(xì)內(nèi)容可以參考:
修復(fù) iOS12.1 UITabBar 布局位移bug - ZHFDBK的博客 - CSDN博客
swift - UITabBar items jumping on back navigation on iOS 12.1 - Stack Overflow
推薦內(nèi)容
重構(gòu)Swift中的Identifiers
面對(duì)越來越多的identifier,改如何優(yōu)雅地處理?
文中講了一些UITableViewCell、UICollectionViewCell、segues、UIStoryboards、UIViewController中關(guān)于identifiers的重構(gòu)方法。
The End Is Near for Mobile Apps
移動(dòng)應(yīng)用的末日將要來臨?
Medium科技板塊最近比較火的一篇文章,分上下兩篇,講述移動(dòng)應(yīng)用的前景和趨勢(shì)。
Realm學(xué)院
這是Realm建立的一個(gè)用于學(xué)習(xí)編程技術(shù)的網(wǎng)站,主要方式是視頻,內(nèi)容配有字幕,并且都全部整理成文章。涵蓋范圍有Realm, Android, iOS, JavaScript, Architecture等。
文章質(zhì)量非常高!
開發(fā)利器
KTVHTTPCache
應(yīng)該是iOS端目前最好的流媒體緩存框架了。
Realm
Realm是一個(gè)開源的對(duì)象數(shù)據(jù)庫(kù)管理系統(tǒng),最初用于移動(dòng)(Android/iOS),也可用于Xamarin或React Native等平臺(tái),等平臺(tái),包括桌面應(yīng)用(Windows),并獲得Apache許可。
對(duì)比FMDB,他的使用成本,維護(hù)成本都更低。
uTools
uTools是一個(gè)極簡(jiǎn)、插件化、跨平臺(tái)的現(xiàn)代化桌面軟件。通過自由選配豐富的插件,打造你得心應(yīng)手的工具集合。
通過快捷鍵(默認(rèn)alt+space)就可以快速呼出這個(gè)搜索框。它相當(dāng)聰明,可以支持輸入、拖拽、自動(dòng)粘貼等作為輸入源,相應(yīng)的插件也早已準(zhǔn)備就緒,統(tǒng)一的設(shè)計(jì)風(fēng)格和操作方式,助你高效的得到正確的結(jié)果。
當(dāng)你熟悉它后,能夠?yàn)槟愎?jié)約大量時(shí)間,讓你可以更加專注的改變世界。
對(duì)比Alfred,他的不同就在于免費(fèi),使用簡(jiǎn)單,更符合國(guó)人的習(xí)慣。