我的第一次:Xcode插件开发

作者: A天天涨不停 | 来源:发表于2016-06-14 16:39 被阅读3332次

关于


关于Xcode的插件已经层出不穷了。但笔者凭着兴趣也小有研究了一下。

由于Xcode的控制台不支持数组和字典里的中文的值输出(更准确的说是输出为Unicode编码),这让开发者(至少是我)在打印数据进行调试的时候很不方便也很不爽。故此写了一个Category来解决这个问题(github地址点此)。只要把分类拖入到项目里就能让数组和字典里的中文打印正常。

不过,至少笔者觉得还是挺麻烦的。所以凭着兴趣研究了一下插件开发,并打算把这个小需求整成一个插件。然后装在Xcode里一劳永逸。

开发

关于插件开发入门教程网上也有很多。总之大体就是先安装Xcode-Plugin-Template然后再新建一个project的时候选择xcode plugin这样就把插件开发的基本框架给搭好了。(Xcode-Plugin-Template传输门

但是,插件开发是不开放的,而苹果官方文档也没有。而网上给出大部分建议都是获取所有的通知名,然后根据名字去猜这些通知是做什么的。这样在开发过程中也是很大的阻碍,而我的需求是让控制台把Unicode编码转成中文,所以我直接去看了别人写的开源,找我需要相关的代码。而核心代码则是参考的MCLog插件(过滤控制台区域的插件)。

其中核心代码是叫一个IDEConsoleItem的类,这个类是每次控制台输出信息的时候调用的,实例化的方法是initWithAdaptorType:content:kind:。一开始我是写了method_exchangeImplementations交换实现,然后在切入一套逻辑,根据KVC取出content里的内容(控制台的内容),然后在进行Unicode转码,转码过后的字符串在利用KVC重新赋值content即可。

但是...不尽人意,崩溃了。还不知道为什么,然后我尝试了一下method_getImplementation先把IDEConsoleIteminitWithAdaptorType:content:kind:的IMP实现给保存起来,然后在method_setImplementation重新设置它的IMP,在新的IMP里调用原有IMP,然后在Unicode转码,既然就没报错了。。。核心参考代码如下:


//保存原有的IMP
IMP_IDEConsoleItem_initWithAdaptorType = method_getImplementation(class_getInstanceMethod(NSClassFromString(@"IDEConsoleItem"), @selector(initWithAdaptorType:content:kind:)));
    
//设置新的IMP    method_setImplementation(class_getInstanceMethod(NSClassFromString(@"IDEConsoleItem"), @selector(initWithAdaptorType:content:kind:)), class_getMethodImplementation([P_ZXP_IDEConsoleItem class], @selector(initWithAdaptorType:content:kind:)));

IMP代码

- (id)initWithAdaptorType:(id)arg1 content:(id)arg2 kind:(int)arg3
{
    id (*execIMP)(id,SEL,id,id,int) = (void *)IMP_IDEConsoleItem_initWithAdaptorType;
    id item = execIMP(self, _cmd, arg1, arg2, arg3);
    if (kZXPIsDecodeInConsole) {
        NSString *logText = [item valueForKey:@"content"];
        
        NSString *resultText = [ZXPUnicodeDecodePlugsForXcode convertUnicode:logText];
        [item setValue:resultText forKey:@"content"];
    }
    
    return item;
}

最后

总之目前关于插件开发也没任何知识可分享的,就目前而言,笔者感觉需要实现那些需求,然后找拥有类似需求的插件直接去看源码,比去看通知名字猜想来的更实际一些。如果有关于插件开发这一块的大神指点,我也很乐意受教。最后附上插件(让Xcode支持中文的输出)地址以供学习,代码很简单,就一百行左右的代码https://github.com/biggercoffee/ZXPUnicodeDecodePlugsForXcode

相关文章

  • iOS开发必备的Xcode插件(2)

    iOS开发必备的Xcode插件(2) iOS开发必备的Xcode插件(2)

  • Xcode13 plugin插件开发

    网上找的Xcode插件开发基本都是3年前的,所以这里自己记录一个基于xcode13的插件开发。 打开xcode创建...

  • iOS项目实战02

    修改插件:查找插件 -> 插件路径(不能记) -> Xcode插件开发 -> 查看插件代码 -> 搜索instal...

  • Xcode插件

    Xcode插件: MMNavigatorFont:一个 Xcode 插件开发的教程,从目标开始到最终效果一步步为我...

  • Xcode代码块注释小插件/** */

    在Xcode8.0以上,xcode提供了Xcode Source Editor Extension来开发插件。 X...

  • X-code插件管理器Alcatraz的安装

    Alcatraz是由国外开发者开发的一款Xcode插件管理器,它可以搜索并管理各种Xcode插件,实用性很高.本文...

  • Xcode插件开发入门

    插件开发 插件的简介 Xcode插件,必须是与Xcode是同一个级别的应用,也就是必须也是mac OS APP 改...

  • iOS开发常用之其他

    Xcode的插件 iOS开发进阶,从Xcode开始 - 学习使用Xcode构建出色的应用程序! 在Xcode启动...

  • Xcode插件大全

    Xcode插件 iOS开发进阶,从Xcode开始- 学习使用Xcode构建出色的应用程序! 在Xcode启动的时候...

  • Xcode --自动注释插件VVDocumenter-Xcode

    VVDocumenter-Xcode 是由 @onevcat 喵神开发的一个Xcode插件,其作用是在Xcode中...

网友评论

  • 困惑困惑困惑:图片不错 :smiley:
  • 无夜之星辰:可以,很强势
  • 圣僧留步:我给一百个转身!
  • cf64afa2f37a:信锤神妥妥的 :+1:
    cf64afa2f37a:广州-渣渣
    A天天涨不停:@Johnson_Xu 。。。你群里的ID叫啥。。
  • objcat:多谢分享!
    A天天涨不停:@iwgo 多谢。不过Xcode8之后貌似插件没卵用了。Xcode8支持对Xcode扩展开发了。虽然目前还是测试版。。探索中。
  • 信仰支撑我不会痛:楼主有没有关于提示类名的插件推荐,现在Xcode import的类在使用过程中不会提示了,每次我都要手打或者粘贴好麻烦啊。
    A天天涨不停:@信仰支撑我不会痛 不客气。。。一起学习。
    信仰支撑我不会痛:@水瓶座_iOSer 好的,我去学习学习
    A天天涨不停:@信仰支撑我不会痛 Auto-Importer或许你可以尝试。不需要滚动到最顶部,直接快捷键然后快速导入头文件。也省了你代码编辑区域的滚动到最顶部的时间。http://www.jianshu.com/p/010b23e8a6ee我这篇文章里有这个插件的简单介绍。具体使用去github看下就知道了。
  • jgyhc:安装不上。。。。
    jgyhc:@水瓶座_iOSer 两种方式都试了!Xcode7.3
    A天天涨不停:@jgyhc 安装的话,用alcatraz 安装也行。
    A天天涨不停:@jgyhc 你是Xcode几的版本??最好的是,command + B构建,然后重启Xcode,不然你运行的话,可能会卡在堆栈哪儿。
  • 1edc7c146291:xcode插件开发用的啥语言?
    1edc7c146291:@水瓶座_iOSer 哦哦~~~
    A天天涨不停:@梦碎心亦累 一样的是OC,看代码就看出来是OC了呀。只不过iOS的UIkit用不了而已。要用UI就APPkit里的
  • CepheusSun:牛逼牛逼

本文标题:我的第一次:Xcode插件开发

本文链接:https://www.haomeiwen.com/subject/codudttx.html