自建站台解決 CORS Policy 問題
有時候想寫個簡單的小工具來拉取或查詢 API 資料,可能是開源資料、可能是公司內部站台用的資料,當然有很多前端平台可以選擇(網頁、手機、PC),為了方便隨時開啟,有時會選擇簡單的靜態網頁,但是使用網頁呼叫 API 可能會遇到 CORS Policy 的問題?那該如何解決呢?
前端網頁呼叫 API使用網頁呼叫 API 有很多方式,而且各有優缺點,可以參考其他大大寫的 AJAX與Fetch API:
AJAX 與 XMLHttpRequest
HTML5 的 Fetch
…
12345678910111213var requestOptions = { method: 'GET', redirect: 'follow' };fetch("http://192.168.99.222:12345/api/Member/infos", requestOptions).then(response => response.text()).then(result => { console ...
XCTest 和 Unit Testing Bundle
開始寫測試前必須先瞭解該平台用來寫測試的套件或框架,例如 C# 的 MSTest、Java 的 JUnit、JavaScript 的 JsUnit,當然在 iOS 平台上也有專屬的測試框架 XCTest。
XCTestXCTest 是 Apple 官方出的測試框架,可以用來建立 Unit Testing、Performance Testing、UI Testing。
xctest 官方文件
Unit Testing BundleUnit Testing Bundle 則是 Xcode 內建用來做單元測試的 Target。
初始化
新增 Target > iOS Unit Testing Bundle (在建立專案時其實也可以直接勾選 Include Tests)
命名 Target 名稱 > 完成安裝
通常需要測試的物件都在專案裡,所以 TestAppTests.swift 需要在最上面加上 @testable import TestApp
也可以自行新增測試檔案進行分類,建議是一個類別對一個測試檔案,不要把所有類別的測試都寫在同一個檔案
撰寫測試Se ...
Unit Testing 的入門介紹
常常聽到說寫測試可以確保程式碼品質、幫助我們不會修壞程式碼,那具體來說測試到底是什麼樣的東西呢?
單元測試 (Unit Testing)單元測試是一組驗證功能的程式碼,這段程式會呼叫被測試的工作單元,並且針對結果進行驗證,為了可以在開發過程中或是發布之前可以找到邏輯錯誤的功能,通常都會加在 CI/CD 的流程中。
一組單元測試通常有三個步驟:
Arrange:準備 => 初始化並設定好要測驗的物件
Act:操作 => 執行要驗證的方法
Assert:驗證 => 對結果進行驗證是不是符合預期
1234567891011func testNumberToolIsPositive() throws { // Arrange:準備 let numberTool = NumberTool() // Act:操作 let result = numberTool.isPositive(input: 999) // Assert:驗證 XCTAssert(result)}
單元測試的關鍵特質
自 ...
SwiftLint 靜態檢查器
本篇會介紹 Coding Style 與 iOS 平台上最活躍的靜態檢查器 SwiftLint,可以幫助你的程式碼保持一致的風格,並且讓團隊有相同的規範可以遵循。
CodingStyleCodingStyle 就是指寫作程式碼的風格,其中包含很多面向,例如說是變數命名方式、是否有空格、是否要換行、註解格式、修飾詞的順序等等,有時程式碼的功能是相同的,但是會因為風格的不同導致看起來差很多,嚴重一點甚至會有閱讀上的困難,因此往往成熟的團隊會需要訂定一套規則來規範它。
CodingStyle 規則CodingStyle 規則就像一份穿搭規則,可以讓團隊裡的程式碼保持下面三個特點。
可讀性
易維護
一致性
自己定義一套穿搭規則其實蠻不容易的,因此可以參考下面兩個網站。
swift.org - API Design Guidelines
swift 官方的 API 設計方式,比較偏概念性
raywenderlich - Swift Style
raywenderlich 出的一套 CodingStyle,目前算是開源社群裡最多人遵循的的一套規則
定義的規則也相當明確,會跟你說什麼是 ...
DispatchQueue 的簡單應用
本篇內容以非常初階的方式介紹 DispatchQueue,同時會說明 iOS 體系裡最流行的多緒處理的技術 GCD 和一些應用情境和範例,後來也有用在公司培訓初次接觸 iOS 工程師的一段課程裡。
不過本篇的主題不是最新 Swift 5.5 的 async/await,將會著重在 GCD 的 DispatchQueue
提及 DispatchQueue 前,先需要知道多執行緒的應用程式如何運作的?
Program:
應用程式本身
Process:
開啟應用程式後的實體
每個 Process 都是獨立的,無法自由讀取其他 Process 的資源
像是裝有 Thread 的容器
Thread:
每個 Process 會有管理多個 Thread
同一個 Process 底下的 Thread 就可以存取相同資源 (例如記憶體變數等等)
多執行緒處理需要非常細微的操作,容易發生互搶資源,死結 DeadLock 的問題
Core:
就是硬體上的核心,通常是多核心處理
一個 Core 通常同一時間只能處理一個 Thread (還是有些例外像是 Hyper-Threa ...
Hexo-RSS+Sitemap設定
RSSRSS 簡介RSS 全名叫做 RDF Site Summary 或是 Really Simple Syndication,用於訂閱網站訊息的一種方式,網站產生 RSS 檔案後,其他人可以利用訂閱該 RSS 的方式來觀察是否有更新內容,無需再連結或開啟網站,而後也衍生出很多 RSS 閱讀器,可以在上面訂閱你關注的網站,快速閱讀多個網站內容,所以為你的 Blog 製作 RSS 也是讓你的網站更容易被別人追蹤。
RSS 設定方式
先在終端機輸入下面指令,安裝 feed 生產器
1npm install hexo-generator-feed
編輯根目錄的 _config.yml,設定的相關參數請參考官網 hexo-generator-feed
12345feed: type: atom path: atom.xml limit: 7 content: true
重新產生檔案,就可以在 public 資料夾裡看到 atom.xml 檔案
12hexo cleanhexo g
SitemapSitemap 簡介通常網站建立完成,經過時間和在 Google 搜尋的訓練下,會自 ...
Podspec 內使用三方、Asset、Storyboard、Xib
模組跟專案程式碼沒有什麼差別,一樣會需要依賴某個三方、使用某個三方,也可能需要使用到一些 Asset 資源圖片等等和 Storyboard、Xib,理論上都是可以做得到的。
針對原本 Podspec 的資料夾結構,有進行調整,所以可以先看 Podspec 調整資料夾結構如果不調整也是沒問題,只要小心 podspec 內定義的路徑。
Podspec 內使用三方
編輯 TestPodFramework.podspec,新增依賴三方,例如 Alamofire
盡量固定版號或是使用 ~>,讓依賴的三方可以在固定版號之上,減少使用到錯誤版號的問題
1s.dependency 'Alamofire', '~> 5.4.4'
編輯 podfile,與第一步使用相同版號,重新 pod install
12345678910111213target 'DemoTestPodFramework' do use_frameworks! pod 'TestPodFramework', :path ...
Podspec 調整資料夾結構
由於官方的 pod lib create 產生的專案結構,模組的編譯會依賴於某個 Demo,不適合單獨編譯 Framework 和做單元測試,匯入程式碼和圖片資源也要特別小心路徑,也不便於建立多層子模組 Submodule 和進行管理,所以我們來試著改造看看吧!
原本的資料夾結構
最後調整後的資料夾結構
修改完的好處
可以單獨的 Scheme 可以單獨編譯 Framework,適合來跑 CICD
可以有預設的 DocC 來自動產生 Framework 文件
可以單獨跑 Framework UnitTest
可以方便管理多層子模組 Submodule
調整資料夾步驟
先將原本的 Podspec 模組資料夾換個名字,例如 TestPodFramework => TestPodFrameworkOrigin,避免等等衝突名稱
使用 Xcode 建立新的 Framework Project,命名跟原本的 Podspec 一樣就好,並且將它放在同名的資料夾裡
將跟程式碼沒關係的部分 (LICENSE、README.md、TestPodFramework.p ...
IBDesignable 和 IBInspectable 的可視化 View
在模組化的過程中,可能會遇到需要共用的 UI 元件,一般的 CustomView: UIView 沒辦法顯示在 Storyboard 上,會呈現空空的 View,如果想要在 Xcode 上直接顯示的話,就是需要使用 IBDesignable 和 IBInspectable。
功能說明
IBDesignable:在客製化 View 前加上此關鍵字,Xcode 可直接顯示此 View 在 Storyboard。
IBInspectable:在客製化屬性上加上此關鍵字來告訴,Xcode 可直接顯示屬性在右方的 Interface Builder。
[範例一]:可視的客製化View
步驟一:建立客製化 View,並標上 @IBDesignable,讓他變成可以在 Storyboard 被看到
步驟二:為了使我們的客製化類別能夠被即時的預覽,需要兩個initializers,required init、override init
步驟三:加入標上 @IBInspectable 的屬性,並且此屬性一定要定義類型(例如: UIColor、Int、CGFloat)
步驟四:在 Storyboar ...
iOS 模組化架構 (Modular Architecture in iOS) - 下
承接上一篇文章,為了解決”單一模組高度耦合多項功能”,因此我們想要對模組進行拆分,可以自行建立模組清單來管理多個模組。
[第三期]:Podspec + CocoaPods Private Specs建立 CocoaPods Private Specs 模組清單,由它來管理所有模組CocoaPods Specs 就是用來集中管理多個 Podspec 版本控制的 Repository,簡單來說就是一份模組清單最有名且公開的模組清單就是官方的 CocoaPodsSpecs 它包含全世界公開的三方套件你當然可以建立自己的模組清單,例如 PinkPodsSpecs
只要有 Git 就可開發 CocoaPods Specs
如果使用公開 GitHub,就是公開的三方清單
如果使用私有 GitHub 或是公司內部 GitLab,就是私有內部的模組清單 ( 通常公司內部都需要這種的 )
建立清單方式
先決定好是否要公開清單,並決定好在哪裡建立 ( 這裡示範使用公開 GitHub )
先建立一個公開 Repo,叫做 PinkPodsSpecs (用來放清單)
同時也要建立一個公開 Repo ...