使用 Packages 创建支持 Apple M1 芯片的 pkg 安装包

使用高级设置修改 Packages 默认参数

苹果发布 M1 芯片设备已经有一段时间了,虽然我当时第一时间申请了 DTK 设备,但由于一些原因,直到苹果回收设备,我也没能亲手摸到。总之,落格输入法 macOS 还是成功靠盲打支持了 Apple 架构,即 arm64,根据用户反馈,效果还行。

直到有用户说虽然 app 是支持 m1 芯片的,但安装包不行——当运行 pkg 安装包时,系统弹出了 Rosetta 2……

虽然其实并不影响[……]

点击跳转以继续阅读

macOS 使用 atos 命令解析任意崩溃记录和采样数据

最近落格输入法遇到了几个比较难以复现的问题——关键是它不会导致崩溃。这就让崩溃统计功能根本无效,具体表现为在某些情况下输入法会突然卡住几秒,叫人十分恼火。后来我想到,macOS自带活动管理器中,有个“采样”功能,可以看到对应进程当前的执行(调用)状态,那我是不是可以用它来分析错误原因呢?

在和用户沟通后,我得到了一个类似这样的采样报告:
[crayon-690910eed8f8572887[……]

点击跳转以继续阅读

快速更新 Python 包

Python 是个好东西,好多时候我们喜欢用它来写一些小东西……比如我服务器上的很多服务都是用 Python 写的( 使用 Supervisor 将你的 Python 程序变成服务 ),日积月累之下,竟然用到了很多依赖包。

可是,这些 Python 的依赖包并不会随着你的 apt upgrade  进行更新,许久之后的今天,我发现某个我正在用的包[……]

点击跳转以继续阅读

Cocoa Binding 实用教程

首先说这不是一个新技术,它很老,老到几乎没人提起它。

这是苹果 MVC 模式下的产物,最早在没有 iPhone 的时候就已经诞生了,它是用来配合 Xcode 图形化设置界面用的——比如 NIB,当然,现在已经变成 XIB了,哦,还有 Storyboard。

现在如果说起要 bind 一个 Storyboard 中的对象到代码中,你可能查到的都是这样的:

在左侧栏点击鼠标右键打开小窗口[……]

点击跳转以继续阅读

Xcode 插件丢失不显示的解决办法

在系统偏好设置中,Xcode 扩展插件不显示了

在之前的一篇文章中我为大家介绍了一个同时安装多个版本 Xcode 的工具使用 xcode-install 来管理 Xcode 版本但当你的系统中同时存在多个 Xcode 时,就会导致系统困惑,让 Xcode 的插件无法被识别,主要的体现就是系统偏好设置中根本看不到 Xcode 插件的选项——就好像你完全没安装过它们一样。

总之,我在这里找到了答案

首先执行命令:
[crayo[……]

点击跳转以继续阅读

在 macOS 上无驱动使用第三方鼠标

启用对罗技鼠标的管理

众所周知,macOS 对第三方鼠标挑剔的很,如果是普通的办公鼠标,那几乎还能凑合用,固定的 DPI 顶多就是需要调调鼠标速度罢了,但如果上升到按键多一些的游戏鼠标,就有很多问题了。

不一定是用来打游戏,比如带有前进后退按钮的鼠标在写代码时非常实用。

一般来说,名厂大牌的鼠标会对 macOS 支持较好,主要是因为大厂有精力为 macOS 做鼠标驱动,如果一个鼠标原生就只有 Windows 驱动,[……]

点击跳转以继续阅读

使用 xcodebuild 来 archive 并导出 app

之前我曾写过一篇文章macOS app 实现自动化 notarize 脚本,但并没有提到使用代码自动编译并生成 App 的脚本,毕竟这一步有好多工具可以完成,比如说 fastlane。

我由于在 notarize 之前也没想过做自动化,而在写那篇文章的时候 fastlane 还没有支持 notarized 上传,于是我就自己写了,具体的编译命令是这样的:
[crayon-690910eed[……]

点击跳转以继续阅读

/usr/libexec/lsd 占用 100% CPU 的解决办法

最近忽然发现磁盘存在大量写入,打开任务管理器一看,发现一个叫做“lsd”的进程持续占用 20% – 40% CPU,很奇怪。

经过一番查询,得知这个进程是 macOS 和 iOS 上的系统进程,全名叫做“Launch Service Daemon”,负责所有 App 文件类型关联和启动。但它的数据库有时候会损坏,这就导致它频繁读取和验证某些数据。

一旦它的数据库损坏,你就会遇到 lsd[……]

点击跳转以继续阅读

使用 xcode-install 来管理 Xcode 版本

我们都知道,在使用 Python 的时候有 pyenv,使用 ruby 的话有 rbenv,都能方便地控制和管理编程语言环境的版本,那么,有没有什么方法,能让 Xcode 也像这样切换版本呢?

每次 Xcode 发布更新,更还是不更成了一个问题,下载难,还不能断点续传,又不能用第三方工具下载,真的是非常要命……就更别提多个版本时候的兼容问题了。

使用 xcode-install,一次性[……]

点击跳转以继续阅读

clang: warning: libstdc++ is deprecated; move to libc++ with a minimum deployment target of OS X 10.9

通常,你会在安装某个 Python 包时遇到这个错误,这个包肯定是一个包含了 C++ 代码的包。

这是由于 macOS 更新后出现的不兼容,一般来说,这个包的维护者应该已经对这个特殊情况做出了兼容:

这样在 macOS 上就可以顺利编译通过了。

但如果你使用的是 PyPy,那可能即使维护者包含了这句话,你也无法成功安[……]

点击跳转以继续阅读

Python 实时检测自身内存占用

最近在做文本统计,用 Python 实现,遇到了一个比较有意思的难题——如何保存统计结果。

直接写入内存实在是放不下,十几个小时后内存耗尽,程序被迫关闭。如果直接写入数据库吧,每次写入又太慢了,本来就十几个小时了,这样下去就要往星期上数了,也不是个办法。

最后,我想到了一个两者兼顾的方案——用内存做缓冲,达到一定量之后一次性将当前所有数据合并到硬盘里。

但这样就有一个阈值,如何确[……]

点击跳转以继续阅读

Safari 13 去除 Google 搜索结果跳转

使用 Xcode 创建一个新的 Safari 插件项目

在 Safari 9 以前,我们只要下载一个 safariextz 文件双击它,就能让 Safari 加载这个插件了。好处肯定是很方便,但也不太安全(随处都能下载到的插件,很可能是被篡改过的)。

所以后来,Apple 就不再允许用户直接下载插件给 Safari 安装了,必须通过 Mac Apple Store 下载 App,然后 App 里以插件的形式提供 Safari 插件,配合 App[……]

点击跳转以继续阅读

避免 WordPress 被用作反射放大攻击

之前我写过一篇文章,使用 fail2ban 防止 Bind9 被用于 DNS 放大攻击,万万没想到,原来 Wordpress 本身也可以用来进行放大攻击,原理就是它的 Pingback 机制。

Pingback 是 Wordpress 的一个网站之间互相通知工具,比如 A 博客引用了一个 B 博客文章的链接,那么 Wordpress 就可以自动帮你通知 B 博客,告诉博主你引用了他的文章。

这[……]

点击跳转以继续阅读

iOS 正确设置 status bar style 颜色

在开发 iOS App 时,很多应用都要根据当前 App 内容颜色来设置 iOS 系统状态栏 的配色,黑色或者白色——尤其是在 iOS 13 系统支持了黑色模式后。

通常,别人会告诉你这么做:

但这会触发警告: Deprecated in iOS 9 。那么有没有其他办法呢?有,官方推荐的写法是[……]

点击跳转以继续阅读

如何让你的 macOS 重新显示台湾旗 Emoji 🇹🇼️🇹🇼️🇹🇼️

macOS 使用了一个专用字段保存国家代码

最早台湾旗不能显示,是在 iPhone 上,苹果通过 iOS 系统地区和语言设置进行判断,如果是中文,就会把台湾旗这个 Emoji 显示为 :破解方法也很容易,把语言和地区都改掉就可以了,比如语言选成繁体或者英文。

现在,苹果已经不再单纯通过语言等设置进行判断了,通过 iPhone 硬件序列号进行判断——这是不可能被修改的。

这个被屏蔽的乱码符号让人看着心烦,究竟该怎么去掉它呢?

mac[……]

点击跳转以继续阅读

当 Mailgun 不再免费,你如何安置你的域名邮箱?

之前我写过一篇文章:《 使用 Mailgun 创建你的免费域名邮箱 》Mailgun 有一个很有意思的功能就是收件路由,通过这个功能设定,你可以将任意发来的邮件转发到你设定好的邮箱当中,这样就不需要为每一个域名设置一个邮箱服务了,只需要通过 Mailgun 就可以将对应的邮件转发的需要的邮箱——毕竟,平时我们可能也就使用这些域名邮箱做个基本的验证。

最近,Mailgun 不再免费了,免费用户[……]

点击跳转以继续阅读

Swift Python 互通 Json 数据签名

最近很流行自签证书进行 HTTPS 解密,然后就有不少人通过修改苹果的内购回执实现对 App 的破解。实际上验证购买应该是 App 连接服务器,服务器来和苹果的服务器进行通信,然后将结果发送给 App 的——但不少开发者(包括个人开发者以及企业开发者)懒得去专门维护服务器,所以直接用 App 和苹果的服务器进行通信,这就给中间人攻击提供了机会。

中间人攻击,就是说当 A 和 B 进行通信[……]

点击跳转以继续阅读

Swift Debug EXC_BAD_ACCESS in AppDelegate

 

不少人在开发中都会遇到 EXC_BAD_ACCESS ,很遗憾,这一次 Xcode 不会给出任何详细的解决方案。

通常来说,这是由于内存错误造成的。简单来说就是你创建了对象 A,但在后来访问的时候,内存里 A 这块区域已经被系统挪做他用了,比如放了对象 B 在这里——你的 A 只剩下指针,实际内容已经不存在了。

这时就会出现类似这样的崩溃:
[crayon-690[……]

点击跳转以继续阅读