j9九游会登陆--首页直达

iOS 10 Day By Day: Xcode Source Editor Extensions
  • 智网科技
  • ###
  • 分类: 智网新闻
  • 阅读量: 144

63.jpg


在 Xcode 8.0的版本内里,苹果引入了一个新的面向 macOS 的 App Extension,叫做 Xcode Source Editor(源代码编辑器)。经过这个源代码编辑器,j9九游会也拥有了本人编写一个Xcode插件的才能 。别的,j9九游会再也不必由于Xcode晋级,来寻觅林林总总[lín lín zǒng zǒng]让Alcatraz正常运转的措施了。

简介

Xcode是苹果开辟平台中一个退一步发者又爱又恨的IDE,在利用历程中,j9九游会发明Xcode的插件的数目不停求过于供[qiú guò yú gòng]。开辟者可以添加一些功效做为内置功效的扩展。好比反省拼写大概转换一切的 UIColor 利用新的常量。

在Xcode8曩昔,Xcode是没有这个才能的。以是Alcatraz弥补了这个空缺,看上去似乎Xcode的插件办理器便是Alcatraz。厥后由于宁静性跟波动性的担心,使用Xcode8做开辟,j9九游会再也不克不及利用Alcatraz了。侥幸的是,苹果添加了新的源代码编辑器来扩展Xcode的插件功效。

项目

j9九游会创立一个extension来完成交换ASCII字符为心情的功效。举个例子:好比"That’s a nice thing to say :)"j9九游会想酿成That’s a nice thing to say“。往常,假如j9九游会想完成这个功效,j9九游会大概会怀着盼望去Github找。j9九游会往上面看:

Emojificator.gif

像我在中创立iMessage App那样,苹果这次推出的各种Extensions 跟Xcode Extensions是差未几的,  但这个官方的Xcdoe插件最大的有点便是可以上架Mac App Store。j9九游会可以使用Extension来扩展整个步伐,听上去有点夸大,实在它更像是一种设置装备摆设选项。Xcode提供了一个没有UI的菜单选项来运转一个下令。

接上去j9九游会创立一个新的MacOS的项目,名字是Emojificate。这里要阐明一下,j9九游会可以先疏忽对Mac app的相干文件,专注于extension方面的事变。

j9九游会必要创立一个新的target,选择的Xcode Extension,j9九游会还必要取一个无独有偶[wú dú yǒu ǒu]的名字,我这里利用的名字是Emojificator_Extension。

Project_Name.png

Xcode创立了j9九游会必要的统统。

Info.plist

j9九游会改动extension的名字,只必要设置Bundle name的key值为Emojificator。

MenuItem.png

像其他的扩展那样,j9九游会可以在info.plist中定一些属性。j9九游会睁开NSExtension,在上面,j9九游会可以界说extension的type(Xcode.extension.source-editor),以及插件的类名,key名为XCSourceEditorExtensionPrincipalClass ,各人会发明,在j9九游会的这个项目中,类名是SourceEditorExtension。j9九游会还可以界说扩展中,用户可以实行的下令。

你的扩展还可以包括少量的下令行,在info.plist中j9九游会可以指定他们的次序。在j9九游会的项目中j9九游会只要一个下令行,它被界说在EmojificatorCommand这个类里,而且包括了XCSourceEditorCommand的协议。假如想界说的这个类的称号,那么j9九游会值必要修正XCSourceEditorCommandClassName的值就好了。

这个类并不限定运转下令行的个数,假如你有多个下令行必要实行,都可以放到统一个类中。假如有相反的办法,你还可以抽取出来公用,通常,j9九游会区分差别的下令是经过标识(即XCSourceEditorCommandIdentifier这个key对应的值)来区分的。

最初,j9九游会在复杂说说,修正下令行的称号。在j9九游会的项目中,XCSourceEditorCommandClassName所对应的值是Emojificate!,修正对应的key,j9九游会就可以修正下令行的称号咯。

Extension_Attributes_Plist.png

SourceEditorExtension.swift
这个文件j9九游会必需恪守XCSourceEditorExtension这个协议。当j9九游会设置好j9九游会的plist文件后,j9九游会不必要做任何事,体系就曾经帮j9九游会初始化好了。假如你想自界说初始化,你必要在extensionDidFinishLaunching这个办法来自界说初始化。

Xcode在启动时,扩展就会启动。在下令实行时,扩展只是实行。这么做的利益便是,快!

菜单项是静态加载的,可以完成 SourceEditorExtension 的 commandDefinitions: 完成,但这会掩盖失 Info.plist 中的界说。

举个例子,上面的代码会前往跟工程如今一样的设置装备摆设。

1
2
3
4
5
6
7
8
var commandDefinitions: [[XCSourceEditorCommandDefinitionKey: AnyObject]] {
    // If your extension needs to return a collection of command definitions that differs from those in its Info.plist, implement this optional property getter.
    return [[
        .classNameKey : "Emojificator_Extension.EmojificateCommand",
        .identifierKey : "com.shinobicontrols.Emojificator_Extension.EmojificateCommand",
        .nameKey : "Emojificate!"
    ]]
}

EmojificatorCommand.swift

通常,Xcode会创立一个SourceEditorCommand的类,不外在这里,我重新定名成EmojificateCommand了。为了包管跟体系的分歧,j9九游会要包管它恪守XCSourceEditorComman

的协议。

1
2
3
4
5
import Foundation
import XcodeKit
 
class EmojificateCommand: NSObject, XCSourceEditorCommand {
}

举个例子,j9九游会界说了一组心情跟ASCII之间的映射,而且只是用界说好的这些心情。

1
2
3
4
5
let asciiToEmojiMap = [
        ":)" : ":)",
        ";)" : ";)",
        ":(" : ":("]
  *Note: Use actual emojis in second column

为了完成把ASCII字符交换成Emoji心情,j9九游会要用2个办法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
extension EmojificateCommand {
    /// Returns whether the string contains an item that can be converted into emoji
    func replaceableItemsExist(in string: String) -> Bool {
        for asciiItem in asciiToEmojiMap.keys {
            if string.contains(asciiItem) {
                return true
            }
        }
        return false
    }
 
    /// Replaces any ASCII items with their emoji counterparts and returns the newly 'emojified' string
    func replaceASCIIWithEmoji(in string: String) -> String {
        var line = string
        for asciiItem in asciiToEmojiMap.keys {
            line = line.replacingOccurrences(of: asciiItem, with: asciiToEmojiMap[asciiItem]!)
        }
        return line
    }
}

最初,j9九游会在.m文件中,完成`perform(with: completionHandler:)`办法,来在xcode下令行实行的时分来挪用它。

1
2
3
4
5
6
7
8
9
10
11
func perform(with invocation: XCSourceEditorCommandInvocation, completionHandler: (Error?) -> Void) {
    let lines = invocation.buffer.lines
    for (index, line) in lines.enumerated() {
       if let line = line as? String,
           replaceableItemsExist(in: line) {
           lines[index] = replaceASCIIWithEmoji(in: line)
       }
    }
    // Command must perform completion to signify it has completed
    completionHandler(nil)
}

在`perform(with: completionHandler:)`办法中,j9九游会有一个invocation变量,范例是XCSourceEditorCommandInvocation,它是下令挪用的文件内容,好比.swift文件,oc头文件,大概空格等字符。j9九游会要做的便是在buffer中依据以后行,获取j9九游会要的数据。j9九游会还可以利用`completeBuffer`,它可以是字符串大概数组。假如只是复杂的修正一些字符,苹果发起利用数组来处置,由于Xcode对数组的处置功能更为好。

最初j9九游会挪用completionHandler(nil),报告Xcode下令实行终了。
Xcode Extension是在一个独自的历程中运转,这真是极好的,这意味着迟缓实行的下令行并不会影响到Xcode自己的利用。另一件值得留意的,Xcode对下令运转的工夫要求极为严厉,假如没有在很短工夫内完成,你的扩展将会被"点名品评",同时用户也可以选择取消下令。

运转"Emojificate"

这有一点跟j9九游会寻常开辟纷歧样的是,Xcode真实测试版本中来测试j9九游会的下令。这个测试版本的Xcode的图标颜色是灰色的,这有助于j9九游会区离开发的内容。

88.png

上面是实行的结果图:

89.gif

更多

苹果的这项办法肯定会大大扩睁开发者的生态圈,也会进步了开辟者的服从。这些下令的实行,默许仅容许修正一些文件的buffer和沙盒。假如你必要,你可以哀求更高的权限。据我所知,将来Xcode工程师会让这个东西愈加壮大,以是假如你有一些不克不及完成的特定目的,还可以将你的用例提交给苹果公司。

概况请见的介绍。