Mac状态栏Hack

依旧是一篇探究 Mac 软件原理的文章 前几天在用小历的时候,发现了这么一个功能。 选择之后,小历会从这样变到这样。 然后我就开始想这个是怎么实现的,这里我们必须要对比一个软件,卖了105.88人民币的著名 Mac 状态栏管理软件 Bartender 2。 在 Bartender 中有一个功能,你可以按住 ⌘ 之后点击图标来拖动来改变它在 Mac 状态栏的位置,就像这样(看网易云音乐)。 如果 Bartender 可以的,那为什么小历不能这么做,这样的话用户体验不是更好吗?于是开始了一轮疯狂的 Google 和 Stackoverflow 。 结果结论是,在老版本的 Mac 操作系统中,是默认支持 ⌘+ 图标改变位置的,但是在 10.11 中,这个功能被取消了,只有使用 Bartender 来改变位置。而在 Apple 给出的 API 中,没有可以改变状态栏图标位置的方法。那么 Bartender 是怎么实现的,小历又为什么不能实现。之后就是接着查。 经过不断的改变关键字..在某一个 Stackoverflow 中发现了一个叫做 NSMenuExtra 的类,这是私有的 API ,在这个方法中,可以实现 Bartender 中的那个改变位置的效果,但是如果使用了苹果私有的 API ,应用是不能上线到 App Store 的,小历上线到了 App Store ,说明没有用到私有 API,之后我就一片混乱了… 无耐之下,我在微博上给小历的作者发了一个私信,没想到很快小历的作者就给我回复了!他给了我一个 Github 的地址,NSStatusBar-MISSINGOrder 之后我看了一下,正如作者所说,是构造了一个 Selector,但实际上是用 Hack 的方法调用了两个方法 - (void)_insertStatusItem:(id)arg1 withPriority:(long long)arg2; - (id)_statusItemWithLength:(double)arg1 withPriority:(long long)arg2;...

七月 9, 2016 · 1 分钟 · Me

记一次Mac软件的踩坑过程

11个月前,有一款mac软件,叫做Foldery。pinapps推荐了。简单的说,可以把mac下蓝色的文件夹换成其他颜色。 那时候限免不知道为啥没买。最近在想它怎么实现的。因为现在要花12块钱才能买来使用,我印象中是替换颜色,所以我一直以为是把系统所有文件夹的颜色都替换了。于是就按照这个思路往下想。首先想到的是Applescript修改finder属性,但是经过一番查询,这条路失败了。这应该是上上周干的了..然后就想有没有接口可以,有,apple提供了Finder Sync extension的接口,可以增加finder的角标还有sidebar icon。不过下载了一下demo看了一眼api,只能对finder进行一些简单的操作。附一句,dropbox就这么干的。不过,这条路就这么死了。 然后就开始思考xtrafinder怎么干的,上星期的时候看到了inject code in finder,有两个github的项目mach_override,mach_inject,xtrafinder应该就是这么干的。但是想了想,人家上架了appstore。应该不会那么复杂吧,而且权限应该还不够。这条路,也死了。 之后想,是不是applescript有接口。结果我把一本Basics of AppleScript翻完了都想不到原理。 最后就到了昨天。昨天的查着查着看到系统图标的位置。其实finder什么的都是mac app,mac下可以看到resource,修改系统图标就都修改了。经过一番尝试,图标格式icns好像,神奇的格式。就是苹果专业图标格式。后来才发现可以直接用preview改…找到系统的图标处准备修改,发现没有权限,不过想了想应该就是这么干的了。 现在要解决权限问题,mac升级之后,对系统进行了保护,要关保护。见我的Mac升级10.11 EI Captain 填坑那篇文章。然后应该就可以解决权限问题了。不过这么着干和xtrafiner差不多了。想想肯定不能上架。万念俱灰。准备查查网上有没有这方面的文章,结果尼玛,我查到了Foldery的源码,在github上。本来不想看了,后来想想差不多也完成整个思路的整理了。进去一看,直接NSWorkspace获取当前文件夹的图标位置然后覆盖一层拉倒。想想不对啊,不是全部替换嘛,后来仔细一看才发现,是单独替换。 就这样,历时快两周,完成了一次伟大的踩坑。

六月 5, 2016 · 1 分钟 · Me

Mac升级10.11 EI Captain 填坑

上周日更新了新版的Mac OS 10.11 EI Captain,上午在工作室升级Xcode7还有keynote等等,下午安装操作系统和各种倒腾。最后发现时间都浪费在下午软件不能正常安装上了。特此写篇博客记录一下整个填更新的填坑过程。 其实我是很反对更新的,一更新就得踩坑,但是强迫症患者没法看到有更新不去更。 下面开始正文。 1. homebrew不能使用 homebrew本身是需要Xcode的command line的,而新版的Xcode7,应该是会把之前的command line删除了..所以即使你用sudo xcode-select --switch /Applications/Xcode.app/Contents/Developer但是你还是没有办法使用homebrew,你在使用homebrew的时候,不论什么命令,都是Failure while executing: /usr/bin/otool -L /usr/bin/install_name_tool 当然,有sudo xcodebuild -license的原因,就是你没有同意xcodebuild的license。当然这些我都试了。还是不行,后来查查发现是command line没有选中的原因。 解决方法:首先xcode-select -p一般默认是sudo xcode-select --switch /Applications/Xcode.app/Contents/Developer 但是Xcode7你需要切换到/Library/Developer/CommandLineTools,这时候就好了。 很多人的homebrew不能用是因为权限问题,在使用homebrew doctor的时候会提醒你。这点就不说了。 2. Xtrafinder不能使用 Xtrafinder更新完之后会提醒你怎么做,这就是苹果的rootless机制导致的,开开就OK了。 我想说的就是Xtrafinder会挡住finder一部分,前天好像已经出了更新,但是源没有换,所以还是0.25.6版本。V2ex上有人问了,大家都一样,不是电脑的问题所以不要着急。 3. gem更新 gem安装的东西,反正我的是都没了…因为苹果把/usr (except /usr/local)里的东西都再见了。需要把gem的默认安装路径重新设置一下。 所以我的rails还有博客的jekyll,当然,还有我的cocoapods都挂了。需要重新安装。 网上好多方法,说自定义GEM_HOME等等。我觉得都不太好,在stackoverflow上看到一个方法很好,分享一下。 打开terminal修改~/.gemrc 增加gem: -n/usr/local/bin这样就把gem的默认安装环境换到了/usr/local/bin下,这样更新gem就没问题了。 4.Xcode的Alcatraz不在window下显示 也就自己的Mac作大死解决这个问题。 网上有很多在github提issue,我看了很多,对着做了很多。里面说的都很详细,在此不贴,最后面有链接。 基本上原因就是,你的Alcatraz没有加入Xcode的UUID。 这里说明一下,每个Xcode版本的UUID不一样,所以最好的方法是先获取Xcode的UUID。 命令是defaults read /Applications/Xcode.app/Contents/Info DVTPlugInCompatibilityUUID 最后加到一个plist文件然后重启Xcode就可以了,大部分都是这样解决了。 当然,我用这个方法没有解决。万念俱灰下,重新用了百度..想看看国内人怎么解决的,记不得在cocoachina还是csdn看到一个人说,那些方法我都没有,我把Alcatraz下载下来运行了一下就ok了… 于是乎,我上github上下载了Alcatraz,运行了一下。。我也ok了。。 基本上遇到的大坑就这几个,踩完也没啥了。 但是我app store更新完新版本的Xcode7之后再安装Xcode6,app store就会更新我的Xcode6..而且我的homebrew也是只能识别我的Xcode6了…我一直无法解决。还有我的XQuartz一直显示过期也没法解决。简直,强迫症。 最后唠两句。 最近为啥没更新博客,我会说我同时写了几份代码么…完全没有时间。。 最近的心凉的很透彻。晚上看着微信洗脸。唉,说好了四星期之后做点其他事情,这都五星期了,还在写代码。在意的东西太多,不放弃一些永远只能这样。 还有,暂时是决定考研了。 有些事情,唉,就这了,没戏的事情总在想也没啥意义..还是忙一忙充实充实就不想了。 参考链接 1.关于 OSX 升级到 EI Captain 的解决方案...

十一月 18, 2015 · 1 分钟 · Me