<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Nsview on Chen</title><link>https://hechen.github.io/zh-cn/tags/nsview/</link><description>Recent content in Nsview on Chen</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Mon, 03 Jun 2019 20:55:54 +0800</lastBuildDate><atom:link href="https://hechen.github.io/zh-cn/tags/nsview/index.xml" rel="self" type="application/rss+xml"/><item><title>How to generate a NSViewController without a Nib?</title><link>https://hechen.github.io/zh-cn/post/create-nsviewcontroller-without-nib/</link><pubDate>Mon, 03 Jun 2019 20:55:54 +0800</pubDate><guid>https://hechen.github.io/zh-cn/post/create-nsviewcontroller-without-nib/</guid><description>&lt;p&gt;Recently, I created all the ViewControllers through the storyboard or the Nib (for views). Today, when I created a demo project without any Nib file, the ViewController did not show as I expected.&lt;/p&gt;
&lt;p&gt;WTF, Can you believe that? I cannot even create a ViewController now.&lt;/p&gt;
&lt;p&gt;There exist some differences between iOS and macOS.&lt;/p&gt;
&lt;h2 id="ios"&gt;iOS&lt;/h2&gt;
&lt;p&gt;In the previous development on the iOS platform, creating a ViewController — specifically a UIViewController instance — is dead simple, as below.&lt;/p&gt;</description></item><item><title>关于 Library 和 Framework</title><link>https://hechen.github.io/zh-cn/post/library_framework/</link><pubDate>Fri, 26 Apr 2019 00:35:30 +0800</pubDate><guid>https://hechen.github.io/zh-cn/post/library_framework/</guid><description>&lt;p&gt;Library 和 Framework 的概念大家应该脑海里都有一些，本文旨在讲述下基本概念，没有对每个字节都了如指掌。关于基本的编译过程在 &lt;a href="https://hechen.github.io/post/xcode-build-system/"&gt;Build Process&lt;/a&gt; 一文中也大概讲述了一些。&lt;/p&gt;
&lt;p&gt;在链接 Library 以及 Framework 之前，我们需要先了解一下 Mach—O。&lt;/p&gt;
&lt;p&gt;提到 Mach-O ，需要明确下 object file（目标文件）的概念，其实质上是指那些由源代码编译之后生成的，还未进行链接的中间文件（比如 Linux 下的 .o 以及 Windows 下的 .obj），它和可执行文件的内容和结构很相似，所以一般上会跟可执行文件格式采用一样的格式存储。&lt;/p&gt;
&lt;p&gt;那在 Unix 系统上的 COFF 是当时发明的在 Unix 表示一个目标文件的存取格式，后来 Linux 基于 COFF 发明了 ELF，而 Windows 基于 COFF 发明了 PE 格式。广义上来说，目标文件与可执行文件几乎一样。在 Linux 下统称为 ELF 文件，Windows 上统称为 PE-COFF 文件，而在 iOS/macOS 上我们的目标文件就是 Mach-O 格式，其在目标文件的大体组成上和其他两种很相似。而 Mach-O 的全称就是 Mach Object 的缩写。&lt;/p&gt;
&lt;p&gt;&lt;img alt="目标文件" loading="lazy" src="https://i.imgur.com/CUrWruq.png"&gt;&lt;/p&gt;
&lt;p&gt;我们以 Linux 上 ELF 结构的一张图来大概说明一下情况，不同的源文件通过分类，将代码和数据，以及变量放入不同的职责段，代码段 _TEXT，数据段 _DATA 等。&lt;/p&gt;
&lt;p&gt;&lt;img alt="ELF" loading="lazy" src="https://i.imgur.com/ozMscrW.jpg"&gt;&lt;/p&gt;
&lt;p&gt;而 Mach-O 文件格式如下图（源自于 Apple 文档）, 和 ELF 格式类似，其也是将不同职责的代码和数据放置于不同的 Section 段，然后再集中成一个一个的 Segment，而 Load Commands 是用来控制每一个 Segment 是如何被加载的，数据是从哪里取的，等等。&lt;/p&gt;</description></item><item><title>Build Process</title><link>https://hechen.github.io/zh-cn/post/xcode-build-system/</link><pubDate>Thu, 25 Apr 2019 11:30:30 +0800</pubDate><guid>https://hechen.github.io/zh-cn/post/xcode-build-system/</guid><description>&lt;p&gt;编程语言的处理过程大致会有五个阶段，其每个阶段均有对应的工具：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;预处理器 Preprocessor&lt;/li&gt;
&lt;li&gt;编译器 Compiler&lt;/li&gt;
&lt;li&gt;汇编器 Assembler&lt;/li&gt;
&lt;li&gt;链接器 Linker&lt;/li&gt;
&lt;li&gt;加载器 Loader&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;我们以一个简单的源文件，来看看具体这几个步骤都做了哪些事情。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// main.m
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// MachO
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// Created by chen he on 2019/4/22.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// Copyright © 2019 chen he. All rights reserved.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#import &amp;lt;stdio.h&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;argc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[])&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Hello World.&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="预处理器-preprocessor"&gt;预处理器 Preprocessor&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;符号化&lt;/li&gt;
&lt;li&gt;宏定义展开&lt;/li&gt;
&lt;li&gt;头文件引入展开&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;在命令行执行如下命令，我们导出输出到本地文件&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;xcrun&lt;/span&gt; &lt;span class="n"&gt;clang&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;E&lt;/span&gt; &lt;span class="n"&gt;helloworld&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;preprocessed&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;txt&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;打开 preprocessed.txt 看输出如下：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;# 1 &amp;#34;helloworld.c&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;# 1 &amp;#34;&amp;lt;built-in&amp;gt;&amp;#34; 1
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;# 1 &amp;#34;&amp;lt;built-in&amp;gt;&amp;#34; 3
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;# 361 &amp;#34;&amp;lt;built-in&amp;gt;&amp;#34; 3
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;# 1 &amp;#34;&amp;lt;command line&amp;gt;&amp;#34; 1
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;# 1 &amp;#34;&amp;lt;built-in&amp;gt;&amp;#34; 2
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;# 1 &amp;#34;helloworld.c&amp;#34; 2
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;# 1 &amp;#34;/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk/usr/include&lt;/span&gt;&lt;span class="cpf"&gt;/stdio.h&amp;#34; 1 3 4&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;# 64 &amp;#34;/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk/usr/include&lt;/span&gt;&lt;span class="cpf"&gt;/stdio.h&amp;#34; 3 4&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;# 1 &amp;#34;/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk/usr/include&lt;/span&gt;&lt;span class="cpf"&gt;/_stdio.h&amp;#34; 1 3 4&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;# 68 &amp;#34;/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk/usr/include&lt;/span&gt;&lt;span class="cpf"&gt;/_stdio.h&amp;#34; 3 4&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;# 1 &amp;#34;/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk/usr/include&lt;/span&gt;&lt;span class="cpf"&gt;/sys/cdefs.h&amp;#34; 1 3 4&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// 省略一万字
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;extern&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;__vsnprintf_chk&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="kr"&gt;restrict&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;size_t&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;size_t&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="kr"&gt;restrict&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;va_list&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;# 412 &amp;#34;/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk/usr/include&lt;/span&gt;&lt;span class="cpf"&gt;/stdio.h&amp;#34; 2 3 4&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;# 2 &amp;#34;helloworld.c&amp;#34; 2
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;argc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[])&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Hello World!&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;可以看到预编译处理之后的源文件，仅仅只有几行的源文件进行头文件展开之后能增加到几百行，而我们仅仅只引入了 &lt;code&gt;stdio.h&lt;/code&gt; 一个头文件。当然，你可以使用 Xcode 来执行预处理命令。&lt;/p&gt;</description></item><item><title>写个小工具 Swwwitch</title><link>https://hechen.github.io/zh-cn/post/swwwitch/</link><pubDate>Sat, 30 Mar 2019 11:29:54 +0800</pubDate><guid>https://hechen.github.io/zh-cn/post/swwwitch/</guid><description>&lt;p&gt;最近看到开发圈某热点，做了个小工具，总结下最近的几个 CocoaApp 上的功能，仅做练手。现在只包含了两个开关：切换系统主题和隐藏桌面 icon 的功能。&lt;/p&gt;
&lt;p&gt;&lt;img alt="Swwwitch-c500" loading="lazy" src="https://i.imgur.com/U9RTmVU.png"&gt;&lt;/p&gt;
&lt;h2 id="功能点"&gt;功能点&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;切换系统主题&lt;/li&gt;
&lt;li&gt;显式或者印象桌面图标&lt;/li&gt;
&lt;li&gt;完全的 Menu Only 应用&lt;/li&gt;
&lt;li&gt;开机自启动&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;关于第三点的实现在&lt;a href="https://hechen.github.io/post/dockless-cocoaapps/"&gt;另外一篇文章&lt;/a&gt;有讲过，第四点的实现在 &lt;a href="https://hechen.github.io/post/autostartwhenlogin/"&gt;这一篇&lt;/a&gt; 中有讲。&lt;/p&gt;
&lt;h3 id="系统主题切换"&gt;系统主题切换&lt;/h3&gt;
&lt;p&gt;关于系统主题切换主要是基于 AppleScript 所写，&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-applescript" data-lang="applescript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;tell&lt;/span&gt; &lt;span class="nb"&gt;application&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;System Events&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;tell&lt;/span&gt; &lt;span class="nv"&gt;appearance&lt;/span&gt; &lt;span class="nv"&gt;preferences&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;set&lt;/span&gt; &lt;span class="nv"&gt;dark&lt;/span&gt; &lt;span class="nv"&gt;mode&lt;/span&gt; &lt;span class="k"&gt;to&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="nv"&gt;dark&lt;/span&gt; &lt;span class="nv"&gt;mode&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;end&lt;/span&gt; &lt;span class="k"&gt;tell&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;end&lt;/span&gt; &lt;span class="k"&gt;tell&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;你完全可以自行执行这段 Apple Script 来切换主题，你可以点击下面链接尝试。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://hechen.github.io/zh-cn/post/swwwitch/#ZgotmplZ"&gt;Click Here to run&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="显式隐藏桌面图标"&gt;显式/隐藏桌面图标&lt;/h3&gt;
&lt;p&gt;关于隐藏桌面图标，实际上是执行系统的 Command 来实现的，Cocoa 应用可以显式使用 Process（也就是 NSTask）来执行任务，我们也是通过 NSTask 执行了一段如下的命令行达到的目的：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;defaults write com.apple.finder CreateDesktop &lt;span class="nb"&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;killall Finder
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;你可以自行点击以下链接尝试。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://hechen.github.io/zh-cn/post/swwwitch/#ZgotmplZ"&gt;Click here to hide Desktop Icons&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://hechen.github.io/zh-cn/post/swwwitch/#ZgotmplZ"&gt;Click here to show Desktop Icons&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;感兴趣可以去看下代码，领会意思即可。
&lt;a href="https://github.com/hechen/Swwwitch/releases"&gt;Releases&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="todo"&gt;TODO&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Add more switch&lt;/li&gt;
&lt;li&gt;Add User-Customized switch setting&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="links"&gt;Links&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://ss64.com/osx/"&gt;Checkout all command lines macOS Support&lt;/a&gt;&lt;/p&gt;</description></item><item><title>关于 Mac 应用的自启动是如何做到的</title><link>https://hechen.github.io/zh-cn/post/autostartwhenlogin/</link><pubDate>Mon, 18 Mar 2019 17:29:54 +0800</pubDate><guid>https://hechen.github.io/zh-cn/post/autostartwhenlogin/</guid><description>&lt;p&gt;开机自启动是 Cocoa 应用最常见的一种功能，尤其是针对需要常驻 Menu 的服务来说更是如此，今天我们对开机启动项的功能加入做个梳理。&lt;/p&gt;
&lt;p&gt;在 &lt;a href="https://developer.apple.com/library/archive/documentation/MacOSX/Conceptual/BPSystemStartup/Chapters/CreatingLoginItems.html#//apple_ref/doc/uid/10000172i-SW5-SW1"&gt;Daemons and Services Programming Guide&lt;/a&gt; 中我们能找到关于自启动项的开发说明：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Applications can contain a helper application as a full application bundle, stored inside the main application bundle in the Contents/Library/LoginItems directory. Set either the LSUIElement or LSBackgroundOnly key in the Info.plist file of the helper application’s bundle.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;Use the SMLoginItemSetEnabled function (available in OS X v10.6.6 and later) to enable a helper application. It takes two arguments, a CFStringRef containing the bundle identifier of the helper application, and a Boolean specifying the desired state. Pass true to start the helper application immediately and indicate that it should be started every time the user logs in. Pass false to terminate the helper application and indicate that it should no longer be launched when the user logs in. This function returns true if the requested change has taken effect; otherwise, it returns false. This function can be used to manage any number of helper applications.&lt;/p&gt;</description></item><item><title>Mac 平台上那些 Dockless 的 App 都是如何实现的？</title><link>https://hechen.github.io/zh-cn/post/dockless-cocoaapps/</link><pubDate>Wed, 13 Mar 2019 17:29:54 +0800</pubDate><guid>https://hechen.github.io/zh-cn/post/dockless-cocoaapps/</guid><description>&lt;p&gt;Menu Only 算是 Cocoa App 中最常见的一项，它使得 App 不占用你的 Dock 栏，在多 workspace 的时候也不影响正常使用，随时都可以在屏幕的菜单栏中执行快捷操作。尤其是针对一些需要便捷性要求比较高的应用来讲，Menu bar 的功能必不可少。本文就简单介绍一下关于 Menu App 中关键的几个开发步骤。&lt;/p&gt;
&lt;h1 id="介绍"&gt;介绍&lt;/h1&gt;
&lt;p&gt;以 &lt;a href="https://www.shimovpn.com/"&gt;Shimo&lt;/a&gt; 这个 App 举例，&lt;/p&gt;
&lt;p&gt;&lt;img alt="Shimo" loading="lazy" src="https://i.imgur.com/vT7EEVK.png"&gt;&lt;/p&gt;
&lt;p&gt;在其设置选项卡中能看到 Show Shimo in 的选项菜单，其中有三项：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Menubar only&lt;/li&gt;
&lt;li&gt;Dock only&lt;/li&gt;
&lt;li&gt;Menubar &amp;amp; Dock&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img alt="Shimo Menu" loading="lazy" src="https://i.imgur.com/WywIVkV.png"&gt;&lt;/p&gt;
&lt;p&gt;这也是常见的 Cocoa 应用的模式支持，很多常见的 App 都支持，比如 DayOne，Dash，Todoist 等。&lt;/p&gt;
&lt;p&gt;&lt;img alt="Dash" loading="lazy" src="https://i.imgur.com/ioUvpNw.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="Todoist" loading="lazy" src="https://i.imgur.com/ORYAEcZ.png"&gt;&lt;/p&gt;
&lt;p&gt;其实核心功能有两点：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;可以显示或者隐藏 Dock 图标；&lt;/li&gt;
&lt;li&gt;可以显示或者隐藏 Menu 菜单这两者的组合。&lt;/li&gt;
&lt;/ol&gt;
&lt;h1 id="核心步骤"&gt;核心步骤&lt;/h1&gt;
&lt;h2 id="dock"&gt;Dock&lt;/h2&gt;
&lt;p&gt;普通的 Cocoa Application 创建之后，默认都是 Dock 上展示的，如果想隐藏 Dock 图标，首先它需要有这个能力，这个能力是通过 info.plist 文件中的 Key 来指定的，这个 Key 就是 &lt;code&gt;LSUIElement&lt;/code&gt;，我们将其值设置为 true&lt;/p&gt;</description></item><item><title>在英文语言系统的 Safari 中使用印象笔记</title><link>https://hechen.github.io/zh-cn/post/using-yinxiangbiji-system-english/</link><pubDate>Wed, 13 Mar 2019 00:30:49 +0800</pubDate><guid>https://hechen.github.io/zh-cn/post/using-yinxiangbiji-system-english/</guid><description>&lt;blockquote&gt;
&lt;p&gt;因为 Evernote 在国内使用了不同的账户体系，去年团队也彻底独立出来，但是 Safari 的剪藏插件是同一个，&lt;a href="https://safari-extensions.apple.com/details/?id=com.evernote.safari.clipper-Q79WDW8YH9"&gt;下载地址&lt;/a&gt;，但是当你系统是英文系统的时候，使用 Safari 剪藏有点尴尬，就是根本找不到印象笔记的登录入口，该文做个记录。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;首先 Safari 默认是没有 Develop 菜单的，因此先开启 Develop 模式，进入 Safari 的选项设置面板中，最后 Advanced 选项卡最下方如图勾选。&lt;/p&gt;
&lt;p&gt;&lt;img alt="Capto_Capture 2019-03-13_12-39-08_A" loading="lazy" src="https://i.imgur.com/J5HvXn1.png"&gt;&lt;/p&gt;
&lt;p&gt;此时，在 Safari 的顶部菜单中会多出 Develop 菜单入口，如下图所示：&lt;/p&gt;
&lt;p&gt;&lt;img alt="Capto_Capture 2019-03-13_12-40-57_A" loading="lazy" src="https://i.imgur.com/OxPf4Ji.png"&gt;&lt;/p&gt;
&lt;p&gt;安装印象笔记的插件之后，点击 Safari 上的印象笔记剪藏按钮，你会发现直接带到 Evernote 的登录界面，没有渠道让我登录印象笔记，即使你 Safari 已经登录了印象笔记，登录的 Session 和 Cookie 信息并没有任何用。&lt;/p&gt;
&lt;p&gt;&lt;img alt="Capto_Capture 2019-03-13_12-50-48_A" loading="lazy" src="https://i.imgur.com/gVTWCOc.png"&gt;&lt;/p&gt;
&lt;p&gt;这时，你就登录国际版 Evernote 账户，如果你没有，那就注册一个。总之，你需要先登录进去，因为我们必须让剪藏菜单展示出来才行。&lt;/p&gt;
&lt;p&gt;登录 Evernote 之后，打开一个页面进行剪裁，之后如图，我们终于看到了剪藏菜单：&lt;/p&gt;
&lt;p&gt;&lt;img alt="Capto_Capture 2019-03-13_12-52-36_A" loading="lazy" src="https://i.imgur.com/VtvROcP.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="Capto_Capture 2019-03-13_12-53-45_A" loading="lazy" src="https://i.imgur.com/LsitsxG.png"&gt;&lt;/p&gt;
&lt;p&gt;点击下方的 Options，打开设置选项&lt;/p&gt;
&lt;p&gt;&lt;img alt="Capto_Capture 2019-03-13_12-56-16_A" loading="lazy" src="https://i.imgur.com/KpQefZc.png"&gt;&lt;/p&gt;
&lt;p&gt;此时，因为刚才开启了 Develop 菜单选项卡，此时右键点击该窗口，&lt;/p&gt;
&lt;p&gt;&lt;img alt="Capto_Capture 2019-03-13_12-58-02_A" loading="lazy" src="https://i.imgur.com/ylecnyS.png"&gt;&lt;/p&gt;
&lt;p&gt;点击 Inspect Element 打开页面元素查看器，在下方元素展示区为焦点的前提下，Command +F 搜索 &lt;strong&gt;DeveloperContainer&lt;/strong&gt; 关键字。&lt;/p&gt;
&lt;p&gt;&lt;img alt="Capto_Capture 2019-03-13_12-59-28_A" loading="lazy" src="https://i.imgur.com/0DSMO39.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="Capto_Capture 2019-03-13_01-02-18_A" loading="lazy" src="https://i.imgur.com/t3uqMa4.png"&gt;&lt;/p&gt;</description></item><item><title>为 NSView 增加 backgroundColor</title><link>https://hechen.github.io/post/nsview-backgroundcolor/</link><pubDate>Mon, 11 Mar 2019 15:19:49 +0800</pubDate><guid>https://hechen.github.io/post/nsview-backgroundcolor/</guid><description>&lt;p&gt;NSView 作为 Cocoa 中最基本的构成元素，是构成整个 Mac App 视图体系的基础，和 UIView 在 iOS 世界中的位置一样重要，可是在 UIView 里司空见惯的背景色设置，在 NSView 中却不见身影。&lt;/p&gt;
&lt;p&gt;在 iOS 中，设置 UIView 的背景色很简单。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-swift" data-lang="swift"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;import&lt;/span&gt; &lt;span class="nc"&gt;UIKit&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;frame&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;CGRect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;origin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;zero&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;CGSize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;view&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;UIView&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;frame&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;frame&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;view&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;backgroundColor&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;blue&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;而在 macOS 上，使用 NSView 背景色需要如下设置：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-swift" data-lang="swift"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;import&lt;/span&gt; &lt;span class="nc"&gt;Cocoa&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;frame&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;CGRect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;origin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;zero&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;CGSize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;view&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;NSView&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;frame&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;frame&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;view&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;wantsLayer&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;view&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;layer&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="n"&gt;backgroundColor&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;NSColor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;blue&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cgColor&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;UIView 自身有一个 backgroundColor 的属性，而在 NSView 中是没有的，你需要做的是设置 View 所包含的 layer 的背景色。而且 layer 是 Optional 的，也就意味着 NSView 默认是不包含 layer 的，所以你还需要设置 wantsLayer 为 true 让 NSView 创建 layer 出来。&lt;/p&gt;
&lt;p&gt;在 Apple 的&lt;a href="https://developer.apple.com/documentation/appkit/nsview/1483695-wantslayer"&gt;官方文档&lt;/a&gt; 有针对 wantsLayer 的一些说明&lt;/p&gt;</description></item></channel></rss>