Xcode Source Editor Extension

不知道是不是受xcodeghost的影響,現(xiàn)在任何library和bundle都需要Xcode8認(rèn)證許可烫映,通過注入code實(shí)現(xiàn)第三方功能的plugin也不允許在Xcode8上使用叮称。取而代之的酣藻,Apple提供了一種新技術(shù),通過為Xcode開發(fā)擴(kuò)展程储,獲取并改變開發(fā)環(huán)境蹭沛,從而實(shí)現(xiàn)類似plugin的功能。這個(gè)技術(shù)就是Xcode Source Editor Extension(以下簡(jiǎn)稱xsee)章鲤。
要指出的是摊灭,xsee雖然打開了一條新道路,但作為新技術(shù)咏窿,目前仍然是不成熟并且功能也很有限斟或。

  • xsee只能獲取和修改source code,并不能像很多功能強(qiáng)大的插件集嵌,對(duì)整個(gè)工程作出修改萝挤。
  • 本質(zhì)是extension,必須依存于MacOS app
  • 沒有自己?jiǎn)为?dú)的UI interface
  • 只能通過Xcode command方式觸發(fā)

不過既然提供了一種新技術(shù)根欧,想必Apple也會(huì)在這個(gè)方向上有所深入怜珍,未來應(yīng)該會(huì)提供更多更全面的功能。

Demo: 類似VVDocumenter為方法添加注釋

以下通過實(shí)現(xiàn)一個(gè)類似VVDocumenter的demo凤粗,來介紹如何創(chuàng)建使用xsee酥泛。

  1. 新建MacOS app
    xsee本質(zhì)是mac extension,所以需要新建一個(gè)MacOS app嫌拣。


    create MacOS app.png
  2. 創(chuàng)建extension
    file -> new -> target 創(chuàng)建Xcode Source Editor Extension


    create xsee.png
  3. 設(shè)置并運(yùn)行
    編輯extension的scheme柔袁,設(shè)置executable為Xcode.app,即mac上安裝的Xcode8异逐。


    set extension.png

    運(yùn)行extension捶索,就會(huì)生成一個(gè)自定義Xcode環(huán)境,在菜單欄的Editor下灰瞻,可以看到一個(gè)新的command腥例,點(diǎn)擊該command會(huì)觸發(fā)擴(kuò)展功能。


    customer xcode.png
  4. 分析code structure
    新建的extension結(jié)構(gòu)很簡(jiǎn)單酝润,默認(rèn)創(chuàng)建幾個(gè)文件:

Info.plist
SourceEditorCommand.h
SourceEditorCommand.m
SourceEditorExtension.h
SourceEditorExtension.m

SourceEditorExtension中定義了extension的life cycle燎竖,雖然只有一個(gè)launch 函數(shù)。command信息無需在commandDefinitions中設(shè)定要销,可以直接到info.plist中設(shè)置:

<key>NSExtension</key>
 <dict>
  <key>NSExtensionAttributes</key>
  <dict>
   <key>XCSourceEditorCommandDefinitions</key>
   <array>
    <dict>
     <key>XCSourceEditorCommandClassName</key>
     <string>SourceEditorCommand</string>
     <key>XCSourceEditorCommandIdentifier</key>
     <string>HAC.addDocuments</string>
     <key>XCSourceEditorCommandName</key>
     <string>Sakura</string>
    </dict>
   </array>
   <key>XCSourceEditorExtensionPrincipalClass</key>
   <string>SourceEditorExtension</string>
  </dict>
  <key>NSExtensionPointIdentifier</key>
  <string>com.apple.dt.Xcode.extension.source-editor</string>
 </dict>

SourceEditorCommand中定義了command觸發(fā)的回調(diào)函數(shù)构回,具體的處理邏輯放在

- (void)performCommandWithInvocation:(XCSourceEditorCommandInvocation *)invocation completionHandler:(void (^)(NSError * _Nullable nilOrError))completionHandler
{
  // Implement your command here, invoking the completion handler when done. Pass it nil on success, and an NSError on failure.
  [HACExtensionManager handleInvocation:invocation];
  completionHandler(nil);
}

方法傳入的參數(shù)XCSourceEditorCommandInvocation即保存著當(dāng)前source code的所有信息,最重要的是identifier和buffer,前者即定義在info.plist中的command id捐凭,做區(qū)分拨扶;buffer即緩存的環(huán)境信息,不過目前信息很少茁肠,重要的一個(gè)是lines一個(gè)是section

/** The lines of text in the buffer, including line endings. Line breaks within a single buffer are expected to be consistent. Adding a "line" that itself contains line breaks will actually modify the array as well, changing its count, such that each line added is a separate element. */
@property (readonly, strong) NSMutableArray <NSString *> *lines;

/** The text selections in the buffer; an empty range represents an insertion point. Modifying the lines of text in the buffer will automatically update the selections to match. */
@property (readonly, strong) NSMutableArray <XCSourceTextRange *> *selections;

lines是source code的行信息,selection是當(dāng)前選中區(qū)域缩举。然后就沒了...
所以整個(gè)流程很簡(jiǎn)單:

  • 啟動(dòng)extension垦梆,回調(diào)extensionDidFinishLaunching
  • 菜單或快捷鍵觸發(fā)command
  • 攔截command,調(diào)用performCommandWithInvocation
  • 獲取當(dāng)前環(huán)境信息XCSourceEditorCommandInvocation仅孩,處理并回塞數(shù)據(jù)到buffer
  • 刷新Xcode環(huán)境

在本demo中托猩,邏輯很簡(jiǎn)單:

  • 取得當(dāng)前選中區(qū)后面的文本
  • 遍歷匹配最接近的一個(gè)方法
  • 正則表達(dá)式解析出方法名,返回類型辽慕,參數(shù)
  • 生成注釋信息
  • 將注釋信息回塞到選中區(qū)后一行京腥。

tips

如果在OS 10.11上運(yùn)行,可能需要運(yùn)行命令:

sudo /usr/libexec/xpccachectl 

并且在 Xcode 嘗試加載擴(kuò)展之前重啟溅蛉。這是因?yàn)榘惭b新的 SDK 以及 El Capitan 的 XPC 服務(wù)不允許這樣的操作公浪。
參考資料時(shí),很多人反映extension性能還很不穩(wěn)定船侧。目前在Xcode8正式版本上欠气,感覺還是很可靠的,當(dāng)然目前只是初步體驗(yàn)镜撩,demo很簡(jiǎn)單预柒。

參考鏈接:
How to Create an Xcode Source Editor Extension

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市袁梗,隨后出現(xiàn)的幾起案子宜鸯,更是在濱河造成了極大的恐慌,老刑警劉巖遮怜,帶你破解...
    沈念sama閱讀 222,681評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件淋袖,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡奈泪,警方通過查閱死者的電腦和手機(jī)适贸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,205評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來涝桅,“玉大人拜姿,你說我怎么就攤上這事》胨欤” “怎么了蕊肥?”我有些...
    開封第一講書人閱讀 169,421評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我壁却,道長(zhǎng)批狱,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,114評(píng)論 1 300
  • 正文 為了忘掉前任展东,我火速辦了婚禮赔硫,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘盐肃。我一直安慰自己爪膊,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,116評(píng)論 6 398
  • 文/花漫 我一把揭開白布砸王。 她就那樣靜靜地躺著推盛,像睡著了一般。 火紅的嫁衣襯著肌膚如雪谦铃。 梳的紋絲不亂的頭發(fā)上耘成,一...
    開封第一講書人閱讀 52,713評(píng)論 1 312
  • 那天,我揣著相機(jī)與錄音驹闰,去河邊找鬼瘪菌。 笑死,一個(gè)胖子當(dāng)著我的面吹牛疮方,可吹牛的內(nèi)容都是我干的控嗜。 我是一名探鬼主播,決...
    沈念sama閱讀 41,170評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼骡显,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼疆栏!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起惫谤,我...
    開封第一講書人閱讀 40,116評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤壁顶,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后溜歪,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體若专,經(jīng)...
    沈念sama閱讀 46,651評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,714評(píng)論 3 342
  • 正文 我和宋清朗相戀三年蝴猪,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了调衰。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,865評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡自阱,死狀恐怖嚎莉,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情沛豌,我是刑警寧澤趋箩,帶...
    沈念sama閱讀 36,527評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響叫确,放射性物質(zhì)發(fā)生泄漏跳芳。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,211評(píng)論 3 336
  • 文/蒙蒙 一竹勉、第九天 我趴在偏房一處隱蔽的房頂上張望飞盆。 院中可真熱鬧,春花似錦饶米、人聲如沸桨啃。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,699評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至匈棘,卻和暖如春丧慈,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背主卫。 一陣腳步聲響...
    開封第一講書人閱讀 33,814評(píng)論 1 274
  • 我被黑心中介騙來泰國(guó)打工逃默, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人簇搅。 一個(gè)月前我還...
    沈念sama閱讀 49,299評(píng)論 3 379
  • 正文 我出身青樓完域,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親瘩将。 傳聞我的和親對(duì)象是個(gè)殘疾皇子吟税,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,870評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容