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
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...