從零開始 編寫一個 XCode Source Extension
先看最終效果圖:
簡書圖片大小限制躁劣,不清楚可以點擊查看原圖
就像你看到的促煮,這個插件包括兩個模塊,一個是設置頁面我們使用Mac APP 完成(不需要Mac開發(fā)基礎)整袁,另一部分是Xcode source Editor插件菠齿。這兩個模塊我們均用swift進行開發(fā)。
第一步:開始創(chuàng)建項目坐昙,創(chuàng)建一個Mac APP
然后為項目取名為
DKJSONExtension
開發(fā)語言為swift使用storyboard绳匀。這時候我們就創(chuàng)建好了主項目了,運行以后是一個空白的窗口炸客。我們先實現(xiàn)設置功能的頁面疾棵,在進行xcode source editer插件的開發(fā)。首先我們打開storyboard
修改一下主程序窗口的標題
接著在viewcontroller中拖出設置頁面痹仙,為了方便布局我使用兩個stackview去橫向排列3個選項
設置界面完成以后就可以進行事件處理了是尔,設置頁面主要是為了顯示和修改當前的模型類型和命名規(guī)則。這里我們使用
UserDefaults
存儲數(shù)據(jù)為了和storyboard中的控件交互這里我們使用兩種常用的方式獲取控件第一種使用
@IBOutlet
引用开仰,第二章通過設置tag
取subview我們要實現(xiàn)單選按鈕需要在按鈕的點擊事件中自己處理.為同一行的按鈕做一個事件處理拟枚,并且存儲當前的值
@IBAction func modeTypeChange(_ sender: NSButton) {
[codeableBtn,handyJSONBtn,swiftyJSONBtn].forEach {
$0?.state = sender.title == $0?.title ? .on : .off
}
UserDefaults.modelType = sender.title
}
@IBAction func modeNameStyleChange(_ sender: NSButton) {
for i in 0..<3 {
let btn = self.view.viewWithTag(100 + i) as? NSButton
btn?.state = sender.title == btn?.title ?.on:.off
}
UserDefaults.modelStyle = sender.title
}
這樣我們做好了事件處理和數(shù)據(jù)存儲,這里我們存儲數(shù)據(jù)需要和extension共享為此我們使用APP group進行userdefault 存取众弓。如果使用UserDefaults.standard
進行存取我們將無法在extension中獲取到存取的值恩溅。
具體步驟如下:
到開發(fā)者中心創(chuàng)建APP group
選擇 APPgroup 填寫名稱和標識
創(chuàng)建完成打開
如圖復制identifier
在項目中添加APPgroup,天上剛才復制的identifier
這時我們就能按group存取數(shù)據(jù)了,這些數(shù)據(jù)將會被同一group的應用共享谓娃。我們?yōu)閡serdefault 添加擴展.注意要使用groupID創(chuàng)建userdefault
extension UserDefaults{
static var grouped:UserDefaults{
return UserDefaults(suiteName: "group.com.dkjone.DKJsonExtension") ?? standard
}
/// 模型類型
static var modelType: String {
get { return grouped.string(forKey: #function) ?? "HandyJSON" }
set { grouped.setValue(newValue, forKey: #function) }
}
// 命名規(guī)則
static var modelStyle: String {
get { return grouped.string(forKey: #function) ?? "駝峰法" }
set { grouped.setValue(newValue, forKey: #function) }
}
}
最后一步脚乡,設置頁面加載時,顯示當前存儲的設置數(shù)據(jù)
override func viewDidLoad() {
super.viewDidLoad()
[codeableBtn,handyJSONBtn,swiftyJSONBtn].forEach {
$0?.state = UserDefaults.modelType == $0?.title ? .on : .off
}
for i in 0..<3 {
let btn = self.view.viewWithTag(100 + i) as? NSButton
btn?.state = UserDefaults.modelStyle == btn?.title ?.on:.off
}
}
到此我們完成了設置應用的全部功能
接下來我們實現(xiàn)source editor extension部分
這部分我們首先創(chuàng)建extension如圖:
創(chuàng)建完成以后我們項目中多呢以下文件
-- JSONExtension
---- SourceEditorExtension.swift
---- SourceEditorCommand.swift
---- Info.plist
這幾個文件是我們編寫extension的關鍵滨达。我們的 項目 target也會多一個選項,我們使用如下選項運行就會出現(xiàn)一個灰色的xcode 可以讓我們調試奶稠,用灰色xcode 打開文件便會在editor菜單中出現(xiàn)我們添加的插件名稱。
如果你出現(xiàn)報錯
dyld: Library not loaded: @rpath/XcodeKit.framework/Versions/A/XcodeKit
Referenced from:
說明庫連接有問題弦悉,找到這個庫鏈接刪除后按圖添加即可
出現(xiàn)以下錯誤是賬號問題需要到xcoed->preferencces->account 中窒典,刪除之前的賬號,重新登陸賬號就可以了
"Your session has expired. Please log in."
如果成功運行會出現(xiàn)灰色Xcode
用灰色的xcode打開文件或者項目在editor 菜單最下面就會有我們新建的插件了稽莉,在此之前我們修改下插件的菜單名稱
可以在info.plist中修改也可以在代碼中自定義瀑志,我們直接修改代碼中的返回值,修改返回值優(yōu)先級高于info.plist,
修改
SourceEditorExtension.swift
文件為以下內容
class SourceEditorExtension: NSObject, XCSourceEditorExtension {
var commandDefinitions: [[XCSourceEditorCommandDefinitionKey: Any]] {
return [[.nameKey: "將JSON文件轉化模型", .identifierKey: "paraseFile", .classNameKey: SourceEditorCommand.className()],
[.nameKey: "從剪貼板獲取JSON轉化為模型", .identifierKey: "parasePasteboard", .classNameKey: SourceEditorCommand.className()]]
}
}
要注意的地方:
nameKey: 菜單的名稱
identifierKey: 菜單的標識污秆,可以在處理類中用于判斷點擊了哪一個菜單
classNameKey: 處理此菜單的類名劈猪,這里我們直接使用className()
獲取,如果你直接寫字符串記得在類名前加上模塊名良拼。
到此我們直接運行后就是以下的效果了
最后我們需要處理如何生成代碼了:
打開處理類
class SourceEditorCommand: NSObject, XCSourceEditorCommand {
// 點擊菜單時調用的方法
func perform(with invocation: XCSourceEditorCommandInvocation, completionHandler: @escaping (Error?) -> Void) {
}
}
這里方法的參數(shù)invocation
就是當前編輯的上下文可以獲取當前菜單的ID和當前文檔類型战得,文檔內容,所在行號等等庸推。
如果需要修改文件內容直接修改invocation.buffer.lines
就可以常侦。這是個[Sting]
類型的可變數(shù)組浇冰,可以在后面直接加,也可以替換某一行內容聋亡。
為了獲取主程序保存的配置我們也要為這個extension配置相同的APP group肘习,方法同上。也使用相同的userdefault就可以取出主程序存儲的配置了坡倔。
這里具體解析json的邏輯就不仔細說明了漂佩,有興趣的可查看完整的源碼github或者碼云
最后一步發(fā)布我們制作的插件。選擇主項目罪塔,然后xcode->product->archive 接下來和發(fā)布IOS應用一樣可以選擇開發(fā)者簽名或者提交到APP store 或者內部測試投蝉。導出內容如圖:
如果想制作圖中的dmg文件,打開
磁盤工具
->文件->新建映像->基于文件夾新建->選擇插件所在文件夾即可征堪。使用時將其中的APP文件(上圖圈中的)拖入application文件夾后打開瘩缆。記得一定要打開一次,然后到系統(tǒng)偏好設置
->擴展
中勾選這個插件就可以了這樣我們就可以正常使用這個extension了