Xcode7 插件製作入門

来源:http://www.cnblogs.com/8hao/archive/2016/03/08/5254319.html
-Advertisement-
Play Games

概述 我們平時也使用了很多的xcode插件,雖然官方對於插件製作沒有提供任何支持,但是載入三方的插件,預設還是被允許的.第三方的插件,需要存放在 ~/Library/Application Support/Developer/Shared/Xcode/Plug-ins文件夾中,尾碼名必須是.xcpl


概述

我們平時也使用了很多的xcode插件,雖然官方對於插件製作沒有提供任何支持,但是載入三方的插件,預設還是被允許的.第三方的插件,需要存放在 ~/Library/Application Support/Developer/Shared/Xcode/Plug-ins文件夾中,尾碼名必須是.xcplugin (不過其實際上是一種bundle).
所以我們創建一個插件工程,直接創建bundle工程即可,然後通過修改尾碼名為.xcplugin,將其放到~/Library/Application Support/Developer/Shared/Xcode/Plug-ins目錄中就可以了

第一個demo插件功能:在xcode的edit菜單中加入一個叫做 測試菜單 的項目,當點擊的時候,彈出一個警告框,顯示一句話,完整的工程放在TestPluginBundle

詳細過程

創建Bundle工程 TestPluginBundle

工程名稱就是 TestPluginBundle

工程設置

插件工程和普通的bundle工程還是有區別的,所以需要進行特殊的設置

首先是工程的plist文件


添加 三項
XCPluginHasUI = NO
XC4Compatible = YES
DVTPlugInCompatibilityUUIDs 這是一個數組.數組內容字元串,指示了該插件相容的xcode版本,只有對應版本的xcode的UIID加入這個數組了,插件才能被載入,否則,即使你將插件放入xcode的插件文件夾,插件也不會被載入的
那麼怎麼獲取你當前版本的xcode的UUID呢?在terminal中輸入 defaults read /Applications/Xcode.app/Contents/Info DVTPlugInCompatibilityUUID ,terminal會返回一串字元串給你,這就是你的Xcode的DVTPlugInCompatibilityUUID.

接下來是 Build Setting了



Installation Build Products Location 設置為 ${HOME} [顯示的時候,顯示的是你的用戶目錄],這個是products的根目錄

Installation Directory 設置為 /Library/Application Support/Developer/Shared/Xcode/Plug-ins,這個是指定你的插件安裝的目錄. 註意,這裡填入的其實是相對目錄,插件的絕對目錄是這樣的,例如 /Users/yohunl/Library/Application Support/Developer/Shared/Xcode/Plug-ins/Alcatraz.xcplugin ,最後的絕對目錄是 Installation Build Products Location和Installation Directory的結合,這也是為什麼兩者都要設置的原因

Deployment Location 設置為 YES,這個是指示該工程不使用設置里的build location,而是用Installation Directory來確定build後放哪兒

我們預設工程生成的相關文件放在哪.都是 Build Locations指示的,通過Deployment Location 設置為 YES告訴工程,我們不使用這個預設的設置,而是我們自定義的

Wrapper extension 設置為 xcplugin,尾碼名必須為xcplugin,否則不會被載入

接下來就是插件的實現過程了

在工程中添加一個文件 ,名稱為 TestPluginBundle (當然,名字隨便什麼都可以),在其中添加代碼

@implementation TestPluginBundle+(void)pluginDidLoad:(NSBundle *)plugin {    NSLog(@"插件運行了!");    [TestPluginBundle sharedInstance];}- (instancetype)init{    self = [super init];    if (self) {        [[NSNotificationCenter defaultCenter] addObserver:self                                                 selector:@selector(didApplicationFinishLaunchingNotification:)                                                     name:NSApplicationDidFinishLaunchingNotification                                                   object:nil];    }    return  self;}- (void)didApplicationFinishLaunchingNotification:(NSNotification*)noti{    [[NSNotificationCenter defaultCenter] removeObserver:self name:NSApplicationDidFinishLaunchingNotification object:nil];    NSMenuItem *menuItem = [[NSApp mainMenu] itemWithTitle:@"Edit"];    if (menuItem) {        [[menuItem submenu] addItem:[NSMenuItem separatorItem]];        NSMenuItem *actionMenuItem = [[NSMenuItem alloc] initWithTitle:@"測試菜單" action:@selector(doMenuAction) keyEquivalent:@""];        [actionMenuItem setTarget:self];        [[menuItem submenu] addItem:actionMenuItem];    }}- (void)doMenuAction{    NSAlert *alert = [[NSAlert alloc] init];    [alert setMessageText:@"測試菜單運行"];    [alert runModal];}- (void)dealloc{    [[NSNotificationCenter defaultCenter] removeObserver:self];}+ (instancetype)sharedInstance{    static id instance;    static dispatch_once_t onceToken;    dispatch_once(&onceToken, ^{        instance = [[self alloc] init];    });    return instance;}@end

ctrl+B來Build工程,查看路徑下/Library/Application Support/Developer/Shared/Xcode/Plug-ins,可以看到我們的插件TestPluginBundle.xcplugin存在了,接下來,重啟xcode

點擊 測試菜單

可能你 會說,這樣雖然是起作用了,但是,難道開發一個插件工程,沒打單步調試麽???,當然不是啊
編輯工程的scheme,將Executable設置為Xcode.app,意思是工程調試的時候掛載到xcode中

將Options下麵的Core Location,XPC Services,View Debugging前面的勾都去掉,否則,你調試的時候,可能會直接crash

當設置完後,你的工程的scheme的圖標會從bundle圖標變為xcode的圖標

再運行(這裡是運行了,不是編譯了)
不出意外的話,會出現xode啟動另外一個xcode,接下來和你普通的調試工程就是一樣的了!

說了這麼多,其實只是想讓你明白一個插件的初始化的配置,調試等

上面的過程,已經有國外大神製作成了一個 工程模板了,https://github.com/kattrali/Xcode-Plugin-Template 其支持OC和Swift,當你安裝它後,會在新建工程時候,看到 Xcode Plugin模板,使用這個模板創建一個新工程,以上的配置等,就都設置好了,直接運行就是一個demo了.

問啊-定製化IT教育平臺,牛人一對一服務,有問必答,開發編程社交頭條 官方網站:www.wenaaa.com 下載問啊APP,參與官方懸賞,賺百元現金。

QQ群290551701 聚集很多互聯網精英,技術總監,架構師,項目經理!開源技術研究,歡迎業內人士,大牛及新手有志於從事IT行業人員進入!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1. css屬性命名區分大小寫嗎? 不區分,不過一般小寫,便於理解 2. margin-top和margin-bottom對於行內(內斂inline)元素效果一樣麽? 3.padding-top和padding-bottom對於inline元素都會增加元素本身的大小麽? 回答2,3,需要瞭解html...
  • 我們知道任何一個自定義函數都是Function構造器的實例,所以我們可以通過new Function的方式來創建函數,使用語法很簡單, new Function(形參1, 形參2, ..., 形參N, 函數體) 註意,裡面的參數全部是以字元串的形式呈現。比如一個簡單的例子——要求寫一個函數, 求兩個
  • ShineJaie 原創,轉載請註明出處。 昨晚在一個交流群里看到有位網友提了一個他的面試題求助答疑。剛好我也有看到,就對這個問題思考了一下,覺得這道題對理解 JavaScript 作用域還是很有幫助的,特此又把自己的解題思路梳理了一遍,希望對其它人有所幫助。 首先看下麵試題: 1 var arr
  • jQuery 2 的版本與jQuery 1的版本相比,沒有再考慮IE6,7,8的相容問題,因此使用時如果不用考慮IE6,7,8就用jQuery 2的版本,如果需要考慮IE6,7,8就使用jQuery 1的版本。 jQuery對象是一個以DOM為對象的特殊數組,並包含大量方法,簡單可以理解為: fun...
  • 作者: "@gzdaijie" 本文為作者原創,轉載請註明出處:http://www.cnblogs.com/gzdaijie/p/5255084.html 目錄 1.Activity生命周期 1.1 Activity生命周期簡介與測試 1.2 設備旋轉時的生命周期與數據恢復 1.3 Activit
  • EventBus是一個Android上用的消息分發的類庫,非常靈活好用,主要的原理是利用了反射註冊以及調用. 本文是在閱讀EventBus的源碼過程中所記錄的東西, 遇到不懂的去查了,然後留下了鏈接. 有點流水賬,講得也不是很深入,如果有錯請幫忙指正.
  • 當Activity 處於Android 應用中運行時,它的活動狀態由 Android 以 Activity 棧的形式管理。當前活動的Activity位於棧頂。隨著不同應用的運行,每個Activity都有可能從活動狀態轉入非活動狀態,也可能從非活動狀態轉入活動狀態。 Activity 的生命周期 歸納
  • 所謂的單例就是:一個應用程式(app)只有一個實例化對象,這個對象就是單例,一般用於音樂播放器和工具類 在這裡教大家如何手動創建單例,一種是利用互斥鎖的方式,另一種是利用dispatch的一次性執行. 1//通過互斥鎖創建單例 2 +(instancetype)sharedNetWorkTools
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...