<?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>Sourcecode on Chen</title><link>https://hechen.github.io/zh-cn/tags/sourcecode/</link><description>Recent content in Sourcecode on Chen</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Thu, 04 Jul 2019 01:19:10 +0800</lastBuildDate><atom:link href="https://hechen.github.io/zh-cn/tags/sourcecode/index.xml" rel="self" type="application/rss+xml"/><item><title>LetsMove 中的几个点</title><link>https://hechen.github.io/zh-cn/post/letsmove/</link><pubDate>Thu, 04 Jul 2019 01:19:10 +0800</pubDate><guid>https://hechen.github.io/zh-cn/post/letsmove/</guid><description>&lt;p&gt;当我们从网络上下载某个 mac app 之后，一般都会默认在 Downloads 目录里，但是某一些 App 是需要放置到 Application 目录才行，最常见的就是自更新功能是受到当前所处目录的限制的，这时候很多下载到本地的 .app 文件打开之后都会弹出提示框，让用户选择是否移动到 Applications 目录，LetsMove 就是大部分 mac app 参考或者集成的开源库，封装了这套逻辑。&lt;/p&gt;
&lt;p&gt;&lt;img alt="LetsMove" loading="lazy" src="https://i.imgur.com/99z1BQf.png"&gt;&lt;/p&gt;
&lt;p&gt;这个库已经好多年了，最近的一次 Commit 是 2017年，其中有几个点可以学习借鉴。&lt;/p&gt;
&lt;h3 id="大致思路"&gt;大致思路&lt;/h3&gt;
&lt;p&gt;虽然叫 Move，实际上是先行 Copy 一份当前的 App Bundle 到 Application 目录，然后杀掉自己并删除源目录的 App 文件。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Move to Applications Folder 确认之后&lt;/li&gt;
&lt;li&gt;复制当前 App 文件到 /Applications 目录中&lt;/li&gt;
&lt;li&gt;删除当前已经打开 App （Mac 上是可行的，不同于 Windows，不存在占用文件句柄的情况）&lt;/li&gt;
&lt;li&gt;执行子进程执行重启过程，具体后文会讲。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="权限获取提权"&gt;权限获取（提权）&lt;/h3&gt;
&lt;p&gt;检查文件路径是否可以写入的方法是 NSFileManager 的 isWritableFileAtPath ，如果返回 false，LetsMove 会主动进行权限获取。&lt;/p&gt;
&lt;p&gt;获取权限所使用的接口是 AuthorizationExecuteWithPrivileges，该接口实际在 OSX 10.7 Lion 之后就已经标记废弃了，但是一直到目前的 macOS 10.14 还一直可以使用。&lt;/p&gt;
&lt;p&gt;而作者为了避免苹果直接移除该代码导致提权接口不可用，使用了动态查找方法的形式，利用 dlsym 查找方法指针来获取，从而避免如果完全移除该方法导致功能不稳定的情况发生。&lt;/p&gt;</description></item></channel></rss>