Tag: Xcode扩展

构建自己的Xcode 8 Source Editor Extension

自WWDC 2016以来,我对Xcode 8中发布的新Xcode源代码编辑器扩展感到非常兴奋。你们中的某些人可能知道我曾经写过另一个名为VWInstantRun的Xcode插件,该插件是用一些运行时黑客制作的,又名老式/非官方方式。 因此,自然而然地,我希望将此插件移植到全新的Xcode源代码编辑器扩展中。 我在这个周末进行了尝试,但未能通过新方法实施InstantRun 。 基本上有两个主要限制来实现它: API唯一向我们展示的是字符串缓冲区对象中当前文件的文本。 根本无法访问某些与UI相关的组件。 不可能像VWInstantRun那样将结果直接输出到调试区域。 由于我们假设现在要在扩展内构建事物,因此这当然是一个沙箱。 这意味着在运行时无法在CLI中运行build命令。 好吧,因此我放弃了。 但是我并不是说新的Xcode扩展不值得一看。 相比之下,我认为这是一个很好的开始,它允许访问最重要的部分(源代码编辑器),该部分允许创建许多有用的功能,同时消除任何潜在的隐私和安全威胁。 让我们建立一个 我将在此处尝试提供一个简单的教程,向您展示如何轻松构建自己的Xcode扩展。 让我们通过从AppCode借鉴一些想法开始做这件事,例如快速删除/复制所选行。 I.打开Xcode 8。 (当前版本为Beta 1) 创建一个新的macOS项目并激活相关方案。 使用Xcode源代码编辑器扩展创建一个新目标。 (由Xcode提出的激活方案) 二。 配置。 在“ Info.plist”文件中打开“ NSExtension”对,“ XCSourceEditorCommandDefinitions”是一个包含几个“ item”的数组,一个“ item”代表自定义命令。 在每个“项目”中,有3对。 1.`XCSourceEditorCommandClassName`:用于实现`XCSourceEditorCommand`协议的类的名称。 2.`XCSourceEditorCommandIdentifier`:您选择用来标识唯一命令的标识符 3.`XCSourceEditorCommandName`:命令的名称,将显示在Xcode菜单上。 在这里,我们需要添加两个新命令:`delete_lines`和`duplicate_lines`。 三, 实施。 直接进入`SourceEditorCommand`,实现协议方法: 公共功能表演(带有调用:XCSourceEditorCommandInvocation,completionHandler:(NSError?)-> Swift.Void) 是的,只有一种方法可以实现。 根据描述,此方法将: 使用调用中的信息执行与命令关联的操作。 Xcode将向代码传递完成处理程序,该处理程序必须调用该完成处理程序才能完成命令的执行,成功时传递nil,失败时传递错误。 换句话说,您需要做的是基于给定信息的不同命令来操纵“文本缓冲区”。 您将在`invocation`实例中找到所需的全部内容。 完成后,调用完成处理程序,传递`nil`或`error`。 请直接从Github上的代码源中检查实现的详细信息,该文件已被很好地证明。 IV。 我们完了 ! 🎉🎉 […]

如何调试iOS Notification Service Extension

在移动部门中,我们正在更新通知,并且当我们想在收到推送通知时在扩展中调试代码时发现了一些问题。 首先,我将解释两种典型的解决方法: 一方面,您必须更改目标以运行扩展: 运行后,您必须从“选择要运行的应用程序”窗口中选择您的应用程序。 之后,将启动该应用程序,并且在收到推送通知时,断点将起作用。 另一方面,您可以使用Xcode的Debug(调试)> Attach to Process(附加到进程)> By Process Identifier(PID)或Name…(名称…)菜单:您可以提供进程的名称,Xcode将等待它启动以附加并启动调试会话。 另外,我将解释另一种方法,当收到推送通知并且您的应用终止时,知道您的扩展中发生了什么,我将谈论日志。 日志 在编程时,我们可以轻松地从Xcode调试控制台读取日志,因为调试器仅显示当前的应用程序日志,而没有其他内容。 日志很容易阅读。 但是在我们的情况下,如果断点有问题,我们将遇到来自Xcode调试的日志相同的问题(不会打印日志),因此我们将在设备控制台中进行编写。 但是现在,您可能会担心,因为设备控制台中每秒有很多OS日志输出😖。 没问题,因为使用os.log 框架,我们将在控制台filter中过滤日志。 易于使用。 首先,您必须在扩展中导入框架。 导入os.log 然后,我们只需要使用不同的参数调用os_log ()函数即可。 看起来像这样: os_log(“%{public} @”,日志:OSLog(子系统:bundleIdentifier,类别:“ myExtension”),类型:OSLogType.debug,“推送收到!”) 但是……每个参数是什么? 让我们来看看💡: 第一个参数是每个消息的访问级别。 如果未提供,则将其视为私人。 如果为私有,则在应用程序未附加Xcode Debugger的情况下,不会打印该值。 第二个参数是参数列表,可用于过滤设备控制台中的消息。 第三个参数指示日志消息的不同类型(调试,信息,错误等)。 默认情况下,控制台隐藏调试日志消息,因此,如果需要,您需要在控制台>操作菜单中启用它们。 最后一个参数是您要打印的任何参数。 如果尝试该示例,则尽管应用程序处于后台或已终止,但在收到推送通知时,我们仍会在设备控制台中看到此消息。 最后,我们可以看到,当收到推送通知时,我们有不同的方式来查看扩展中的情况。 鉴于这三个选项,您选择了最适合您的一个😃