肇鑫的日常博客

肇鑫 / Owen Zhao

独立开发者,主要开发 iOS、watchOS、macOS 应用。

目前在维护 SleepTapRooster Time,以及 Markdown Writer 相关工具。

最新文章

Mac睡眠时经常异常唤醒问题的处理

技术

问题

最近从英特尔芯片的iMac 5K,换成了苹果芯片的Mac mini。一切都好,就是电脑在睡眠之后,经常会异常唤醒。表现为显示器由黑转亮,同时显示为无信号;键盘背景灯变亮;外置机械硬盘启动,发出噪音。然后几秒后,电脑又睡眠了。这个过程在电脑睡眠不久就会出现,而且会连续多次出现。

这个问题对于Mac mini这种无电池的台式机还算是小问题,最多就是有点儿烦人,费些电。但是如果是使用电池的Macbook,问题就严重多了。论坛上甚至有人反馈说,自己的电脑的电池电量,一小时就耗光了。

处理

确定了问题,就要研究如何处理。网上有很多种说法。甚至苹果自己也专门为这个问题开了技术说明。

如果 Mac 意外睡眠或唤醒

你可以先尝试使用苹果的提供的方法,如果还是没能解决你的问题。你再来使用我的方式。不过,我更建议你先使用我的方式进行调查,确定原因了之后,再使用苹果的或我的方式进行处理。

分析问题

网上对于这个问题的分析有多个思路。比如利用各种日志,通过命令行过滤来查询是什么原因唤醒了系统之类的。这些方法能查到原因,但是那些原因,一般都写得很技术,往往需要上网去查是什么意思,而且指向虽然有了,但是好多却不具备可操作性。

这里,我们采取更直接的方式,直接使用pmset来进行电源设置的查询。

我注意到Ventura下M1芯片的Mac min的节能设置中,并没有Power Nap的选项。我以为是Ventura的原因,毕竟我用M1不久。但是后来我在论坛上看到,有网友指出,苹果在M1芯片的Mac,移除了Power Nap的选项。我猜测,苹果大概是认为M1芯片的Mac足够省电,所以就把这个选项移除了。保持默认开启状态。

这个是我目前正常,没有异常唤醒状态的电源设置

zhaoxin@zhaoxins-Mac-mini-M1 ~ % pmset -g
System-wide power settings:
Currently in use:
 disksleep            10
 powernap             0
 womp                 1
 networkoversleep     0
 sleep                1 (sleep prevented by powerd, mds_stores)
 Sleep On Power Button 1
 ttyskeepawake        1
 tcpkeepalive         0
 autorestart          0
 standby              0
 displaysleep         10

每个选项的具体含义,可以参考下面的链接。

pmset
另外提一下第8行的sleep项,如果你的系统无法睡眠。那可能是有应用阻止了它睡眠。你可以看看这一行括号里的应用。这些应用都是可能阻止系统睡眠的。注意,是可能,而不是一定。所以你可以先尝试将能关闭的应用先关闭了,然后再来重新执行pmset -g这个命令,看看是不是生效了。然后再次尝试睡眠。

我的Mac mini,因为是从英特尔平台的系统迁移过来的,所以powernap默认时关闭的,如果是全新安装的系统,这一项应该是开启的。此外tcpkeepalive默认是开启的。在我的系统中,这一项的开启是导致系统的在睡眠后还被频繁唤醒的主要原因。

我的理解是,当系统睡眠后,如果tcpkeepalive还开着,那么系统就会因为各种通知唤醒。同时,由于苹果系统中的一些bug,一些可能具备网卡功能设备,比如各种USB设备(因为存在USB网卡这种设备),也能将系统唤醒。比如,我就在日志中发现,系统被我的M.2的外置移动硬盘唤醒过。

sudo pmset -a tcpkeepalive 0
sudo pmset -a powernap 0 // 如果有需要的话

现在再睡眠你的电脑,应该就不会有异常唤醒了。

New macbook Pro M1 chip waking when asleep with log "SMC.OutboxNotEmpty" wake reason

苹果芯片版macOS虚拟机的安装方法

技术

改用苹果芯片的macOS之后,连虚拟机都不会装了。一开始用VM Fusion,提示架构不对。于是又安装了Arm64的VM Fusion技术预览版,还是提示架构不对。

后来理解了,原来之前安装时一直用的pkg格式的安装包也不能用了,因为它是x86架构的。需要下载IPSW格式Arm版专用的。

虚拟机换成UTM,下载Monterery的IPSW刷机包。这次终于安装上虚拟机了。而且这个虚拟机占用还挺小了。我分配了4GB的内存,100GB的磁盘空间。结果运行虚拟机的时候,我的16GB内存的Mac mini居然都不需要启用交换分区。证明这个虚拟机内存占用还蛮少的,然后CPU的占用率也才50%,风扇也没转。看起来这个UTM还是不错的。

之所以安装这个,是因为有时候我向苹果报bug的时候,需要进行系统之间的对比。安装一个虚拟机,就不必经常在不同系统间进行切换了。

需要注意的是,安装好虚拟机之后,需要第一时间跑到时光机和CCC里,把虚拟机所在的文件夹添加到排除文件里,不要进行备份。因为这个文件夹有100多G,每次变动,这100多G就需要重新存储,所以还是不要备份了。需要的时候我重装一下就好了。🐒

简单说一下在macOS下使用联合创新32寸4K HDR显示器的感受

技术

我目前使用的系统是macOS 13 Ventura,硬件是Mac Mini M1,有HDMI和雷劈3/USB4接口。显示器是联合创新的32寸,分辨率3840x2160,支持HDR 400,接口有DP、Type-C、HDMI x 2。

所需要的所有特性

高分辨率下的HiDPI

HiDPI下的字体更加漂亮。高分辨率下的HiDPI可以显示更多的内容。但是不是所有的连接方式都能支持到最高分辨率下的HiDPI。

雷劈3转DP、Type-C接口直连最高支持3008x1692分辨率下HiDPI。HDMI直连最高支持2560x1440分辨率下的HiDPI。

前段时间,网上一直流传一个所谓苹果电脑连接的最佳分辨率。里面把4K显示器贬低得不行,认为必须得是iMac 24那样的4.5K分辨率,或者是27寸的5K分辨率才适合macOS,如果DPI数不够,效果就会很差。我当时就觉得那个是谣言,现在自己买了32寸的4K显示器,发现一样可以开HiDPI,证实了那的确就是个谣言。

当启用HiDPI后,macOS有时会提示“使用缩放分辨率可能会影响性能”。对于3840x2160这个原声分辨率来说,HiDPI下只有1920x1080这个分辨率没有这个提示,这是因为1920x1080的宽、高刚好是3840x2160的一半,即二者之间是0.5倍,倒数是2,是整数,因此性能无影响。

高动态范围/HDR

雷劈3转DP、HDMI直连下支持高动态范围/HDR。Type-C直连不支持。

有些人提到开启高动态范围之后,屏幕会发灰的问题。这是因为高动态范围需要同时在macOS系统和显示器设置中同时开启。macOS中开启了高动态范围,显示器同时要在设置中打开HDR模式。如果只开了macOS的,没开显示器的,就会发灰。

高动态范围/HDR和HiDPI之间的冲突

另外,同时开启高动态范围和HDR之后,即便没有性能的提示,HiDPI的效果也会受到影响。字体不再平滑,而是变得干瘪。不过,我找到了一个小技巧,如果显示器打开HDR,但是macOS系统不开启高动态范围。那么HiDPI的字体就还是正常的。这样也简化了看电影时的设置调整,只需要打开/关闭高动态范围就可以了。无需再调整分辨率什么的。

苹果自己的显示器应该没有这个问题。当然,我没有用过支持高动态范围的苹果显示器,所以这是我的猜测。
原来是带宽的问题,更换Type-c转DP1.4的线之后,问题消失。使用Type-c转DP1.2的线才有这个问题。

关于视频黑色发灰的问题

可以通过显示器的菜单,将“动态亮度”设置为“精细”来解决。

不过最好不要开这个功能,开了之后一些国产剧的妆容会变丑。

音量调节、亮度调节

我的显示器自带喇叭。因此,无论是哪种方式连接,都会同时传输视频和音频。不过同时,macOS系统本身的音量、亮度调整也都失效了。苹果对此的说法是,当使用HDMI和DP接口连接时,传输的音、视频数据的音量、亮度都是固定的,因此只能使用显示器上的按钮进行音量和亮度的调节。

我不知道苹果自己的显示器是不是也这样,这样的确有些不方便。不过第三方显示器实在便宜,苹果的又实在太贵了。

2023年2月14日更新

加快开机屏幕点亮速度的方法

显示器默认是采用自动识别信号源,这样哪个信号源有信号,它就会显示那个信号源的内容,不必自己手动切换信号源。缺点是开机之后显示会很慢。尤其是系统从睡眠到唤醒,明明苹果表都已经解锁了,还需要好几秒屏幕才会点亮。

如果你经常使用的是固定的信号源,只是偶尔才使用其他的信号源,那么可以将自动改成手动,设置为经常使用的那个信号源。这样可以大大提高屏幕点亮的速度。需要用其他信号源时,使用显示器的菜单手动切换就可以了。

120Hz刷新率

当屏幕分辨率设置为1920x1080p时,显示器的刷新率在Windows和macOS下都可以设置为120Hz。

2023年2月25日更新

换用type-c转DP1.4的线之后,打开HDR之后,字体不在变丑了。所以之前字体变丑的原因应该是之前用的转DP1.2的线带宽不足造成的。

DP1.4的线还可以支持4K下的10位色显示。而HDMI 2.0则不支持。只能支持到8位色。

另外,我的显卡GTX 970只支持DP1.2,并且DP下不支持HDR传输。因此,还是用HDMI连更实用。

iMac 27 5K 2014 Late升级到macOS 13 Ventura的简单步骤

技术

由于2041Late的iMac 5K,苹果官方最多只支持到macOS 11 Big Sur。所以,我的macOS 12 Monterey和macOS 13 Ventura都是通过OPLP进行安装的。

OCLP是一款第三方的引导程序,它包含引导启动系统和提供部分驱动的功能。

OCLP的5.0正式提供了对于macOS 13 Ventura的支持,所以在升级到新系统之前,我们先升级OCLP到5.0。

重启系统,选择系统的自动更新安装macOS 13 Ventura。

安装完毕重启后,我们发现,原本的屏幕分辨率设置没有了,显示器变成了5K原生的分辨率,字体特别小,而且系统十分卡顿。

这是因为macOS 13 Ventura中移除了对与iMac 5K显卡的驱动支持,此时是没有驱动硬件加速的。

再次打开OCLP,选择"Post Install Root Patch",然后选择“Install Root Patches”。这会自动下载安装显卡驱动。

按照提示安装完成并重启后,就一切恢复正常了。

Admob无法注册问题的解决

技术

起因

为了写这篇文章,我花掉了136元。

最近考虑给iOS应用添加广告。首选当然是Google的Admob,可是申请的时候我才发现。我的常用Gmail曾经申请过Admob,但是由于后来没使用,账号被停用了。需要激活。重新激活的最后一步,总是提示错误。

好在我还有另外一个Google账户,结果这个账户在注册的最后一步,也总是遇到错误。

实在没办法了。去淘宝吧。淘宝找到一个商家说是可以帮忙验证地址,价格100块。他倒是把我的账户给注册成功了。但是网页我还是打不开,一直转圈。我问他,他说需要代理开全局,我说我已经开全局了啊。问他还有别的办法没有?他让我下载一个微软的远程桌面。我以为他要协助我处理。结果安装完了之后,他说可以去云厂商那里申请一个远程主机,然后用远程桌面登陆。还说他用的是腾讯云的。碰巧,这时,我的网页突然能上去了。我确认了一下,就给他付了款。

到了昨天下午,我又想上的时候,发现还是转圈,网页上不了。于是我开始研究这个远程桌面。

在Ubuntu 20.04下安装xfce4和vnc

安装

apt install xfce4 xfce4-goodies
apt install tightvncserver

配置密码

vncserver

按照提示输入密码,vnc不需要用户名,只有一个密码需要设置。

设置默认启动xfce4

先杀掉之前的vnc实例。

vncserver -kill :1

备份并新建文件

mv ~/.vnc/xstartup ~/.vnc/xstartup.bak
nano ~/.vnc/xstartup

内容如下:

#!/bin/bash
xrdb $HOME/.Xresources
startxfce4 &

给新文件加上运行属性

chmod +x ~/.vnc/xstartup

创建启动和停止脚本

start.sh

#!/bin/sh
vncserver -geometry 1920x1080 -depth 24

stop.sh

#!/bin/sh
vncserver -kill :1

给两个脚本分别加上运行属性

chmod +x start.sh
chmod +x stop.sh

每次运行vncserver都会新建一个实例,顺序按照1、2、3、4类推。所以需要kill掉旧实例。

开启防火墙的5901端口

ufw allow 5901

运行

我使用的是VNC Viewer,只需要输入ip地址后面跟上:5901,然后在弹出的界面输入密码就可以了。

由于我的VNC只是偶尔需要用一下,我没有设置成系统自启,而是需要时通过start启动,用完了用stop杀掉,这样比较安全。

最后说说admob的问题

admob应该是为了防止有人骗点击,所以对于用户的ip审核比较严格。当我们翻墙时,即使使用了全局代理,但是原本的上网的ip还是能够检测到的。因此,admob认为这样的环境不合格。但是这其实是扩大化了。

另外,如果你使用的Firefox或者Safari等非Chrome的浏览器,admob甚至直接会显示网页错误。只有Chrome才不会显示错误,一直转圈圈。

当使用VNC之后,我用Firefox就能正常上admob了。因为VNC相当于是直接从云主机登陆。虽然IP地址和翻墙的一样,我使用同一台云主机。但是此时admob就能过了。

我使用的是腾讯云的36元一个月的主机。结果安装成功之后,我又在我原本翻墙的主机上试了一下,通过vnc一样能上admob。可见,能不能上的关键,不是主机所在的位置,而是你上网时浏览器的环境。如果是翻墙上,就会被拒。如果vnc直连,就没问题。

近期遇到的几个与苹果审核相关的一些问题的整理与吐槽

技术

从8月17到8月31日,历时半个月,终于搞定了我的第一个订阅的新应用。期间遇到好多之前非订阅应用审核时没有过的新问题。在这里小结一下。

issues

第一版

第一版遇到了三个问题。

  1. 审核人找不到应用内购买的页面。

    1. 的确。这个版本我没有特意设置购买单独的购买选项。应用本身是免费的。订阅虽然收费,但是只有你点击到了需要订阅的高级功能时,才会提示你是否需要订阅。
    2. 不过既然苹果的审核人员找不到,那我就在应用的主界面上添加一个高级版订阅的按钮吧。
  2. 应用支持开机自启,默认是开启的,可以在设置里关闭。苹果不允许,要求默认不支持开机自启,然后询问用户是否开机自启。

    1. 收到。在新增的高级版订阅按钮旁边添加一个,修复不能开启自启的按钮。
  3. 不符合订阅全部条款。
    eula_issue-1140

    1. 这条很长,我当时有点儿慌。我还以为不让我使用订阅功能呢。不过随着后来的审核,我逐渐意识到,原来订阅和一般的一次性购买不同。苹果要求将用户协议和隐私协议,都放在和订阅的同一个页面。
    2. 所以我的这个其实就是缺少用户协议。

另外,苹果的这条审核建议的说明存在误导性。它提到的meta,指的是App Store Connect网站上,应用界面中的设置EULA的位置。那个位置默认就是上面提到的标准苹果使用协议。所以,真正有问题不是它建议的修改那里。而是将你的应用中的订阅页面,添加这个协议的链接。就像苹果的设计指南建议的那样。

apple_subscription_sample

第二版

添加了苹果要求的功能之后,我上传了第二版,结果还是又被拒了。这个被拒我与苹果交流5轮。前面的几轮,主要是上面提到的问题3,EULA的问题。因为当时我还没有意识到的苹果建议的误导。所以我一直在修改App Store Connect中的EULA的位置。我甚至还修改它为自定义EULA,结果苹果还是说不行。

直到最后,苹果给我发过来一个链接,让我按照上面的进行设计。我才发现,原来苹果要的其实是在订阅界面同时显示用户协议。

期间,我还遇到一个苹果自身的bug。重新提交版本的问题。按照之前的审核流程,如果你的审核是meta被拒,那只需要修改meta,然后等审核人员继续审核就可以。如果是二进制包被拒,就需要重新上传新版应用,然后再次排队审核。但是这次。我提交了新版的包之后,居然提交审核的按钮是灰的。
这一度导致我以为苹果是不是修改了审核流程。最后我发现,需要先在审核里点击取消当前版本的审核,新版的上传的提交审核才能点击。
我询问苹果审核人员,是不是必须这么做。因为这么做和之前的审核不太一样。苹果审核人员没有正面回答我这个问题。而是给我两个链接,让我自己学习苹果的审核流程。
几天苹果悄悄修复了我上面提到的那个问题。😮‍💨现在只要提交新版就可以点击审核了,就像过去一样。

第三版

这个版本有三个问题。

  1. 应用的权限的问题。
    1. 我的应用设置了用户选择的读/写权限。但是应用本身不需要这个权限。
    2. 这个权限我当初设置是因为我想实现用户将脚本拖动到脚本窗口,实现编辑的问题。但是后来我觉得这个功能意义不大。用户其实直接复制粘接也可以。就没实现这个功能。
    3. 将读写权限,改成默认只读即可。
  2. 我的订阅只写了可以免费试用7天,没有写订阅价格。
    1. 的确我没写。因为我觉得点击订阅之后,苹果弹出的窗口已经显示价格了。这里吐槽一下苹果的订阅流程。不仅速度慢,窗口弹出的速度要以10秒为计量单位,而且还分成好几步,要弹好几次窗口才能完成订阅。
    2. 不过既然苹果要求订阅显示价格,那我加上就是了。
  3. 还是上面提到的EULA的问题。

第四版

这个版本的审核显示出苹果审核人员的不专业性。最初他说我的应用显示的购买价格,和App Store Connect里设置的不一致。

这个其实根本不可能。因为我框架是RevenueCat,它基于苹果的StoreKit,获取的价格就是直接苹果服务器提供的。我向苹果进行了说明,还给他截了个图,和他我认为这个价格是相同的。

苹果启动重新审核,然后通过了这个版本。

我本以为这就可以了,终于可以上架了。然后我从商店里下载了我的应用,点击使用高级版。结果我发现,居然接收不到苹果服务器发来的订阅价格。

我打开App Store Connect,结果发现苹果只通过了我的主程序,订阅居然还是拒绝的状态。因为订阅是拒绝的,所以应用就没发从苹果的服务器获取订阅的信息,这在用户看来,就是我的应用出现了问题。这简直太坑人了。

这个问题明显是苹果审核人员,甚至是审核系统的问题。因为我的应用是第一版,订阅就应该和审核一起通过。结果苹果只通过了主应用,没通过订阅。这将导致我的应用的可用性降低。而这种问题,审核系统应该给审核人员提示,避免这种低级错误的产生。

第五版

第四版通过之后,我才发现,如果只提供一种按月订阅的方式,每个月发给自己兑换码太麻烦了。于是我又增加一个年费订阅的方式。这样只需要每年给自己提供一个兑换码就可以了。😄

第五版我特意标注了是为了苹果审核人员给我订阅进行审核才提交的。结果这个版本很快就通过。但是审核还是拒绝的状态。

订阅审核

我现在别无他途,只能找苹果求助了。我发邮件给苹果审核客服,要求单独审核我的订阅。结果回我说,我的应用已经通过了啊,不需要审核。我说我要求审核的是订阅,不是主应用。经过几轮之后,订阅还是没通过的状态。

这里说一下,我遇到的订阅的问题,主要有两个,一个本地化的meta,显示被拒绝,这个修改一下就可以了,然后显示的是等待审核。

另外两条,显示的都是需要开发者操作。这个需要开发操作,我在网上找到的办法都说,只需要加个逗号或者空格,然后再改回去就可以了,然后点击审核就可以了。但是我这里遇到了苹果的bug,无论我怎么修改,如何修改,那个需要开发者操作总是不消失,而再次审核的按钮也一直是灰的。

这一度让我想放弃,我发邮件给苹果,说明了这个情况,然后询问苹果我是不是需要删除了这个订阅新建一个才可以?

苹果没有回复我这个邮件。但是几天后,我发现我这两个订阅都已经显示审核通过了。

然后我打开我的应用,发现可以获取订阅信息了。但是只有月费订阅的信息,年费的还是看不到。

第六版

于是我更新了一下第三方框架,提交了第六版。

第六版当天就审核通过了。下载回来后,我发现,终于可以显示全部的订阅了。

App Store Connect的其它严重问题

这期间,我还遇到了苹果商店的其它的严重问题。这个发生在我的另外一个应用咕唧上面。

大家知道,Xcode在打包应用时,会使用Xcode自动生成的第三方证书对应用进行签名。大概20号左右,我收到了苹果的邮件,提醒我Mac的第三方证书将在30天后过期。我想,还不急,等过期了再更新就可以了。

其实更新很简单。就是Xcode点击新建第三方证书就行了。我没弄,结果就出问题了。

22号左右,我更新了咕唧的一个新版。结果苹果直接给我拒了。说我的应用有两个问题:

  1. 没有签名。
  2. 应用没有使用沙箱。

我一看就知道这明显是苹果的审核系统的bug。因为我是用Xcode打包的,怎么可能没有签名呢?而且我没有使用沙箱,也不可能,因为我根本没有改变这个设置。并且我用系统自带的活动监视器,查看我的运行的TestFlight版本的应用,也提示这个应用使用了沙箱。

而且我记忆中隐约有印象,类似的问题几年前出现过。也是第三方证书临近过期的时候出现的。

我在Xcode里新建了一个第三方证书,然后修改了应用版本号。重新打包提交,结果这个应用就被通过了。

这证实了我的怀疑。苹果的审核系统存在bug。当第三方证书时间小于30天时,苹果的审核系统将拒绝应用。我将这个bug提交给了苹果反馈。

小米AX3600路由在Mac下安装Clash

技术

之前一直我在Mac上一直使用的是ClashX,然后在手机上使用的是小火箭。这次为了调试新应用的功能,我需要在路由器上安装Clash。

步骤

小米的官方固件是不支持Clash的。但是由于它的官方固件基于OpenWRT,所以只要我们获得了SSH权限,就可以通过远程登录来安装自己需要的软件。获取SSH权限的操作,是通过特定版本的官方固件的漏洞来实现的。而最新的官方固件已经没有这个漏洞了,因此我们的第一步就是检查路由当前安装的固件版本。

  1. 检查固件版本。如果不是1.0.17,那么就需要刷这个版本的固件。(目前最新的官方固件是1.1.19,所以大部分人应该都是需要降级固件。)如果是降级,建议刷新固件时,将路由的设置重置。
    1. 备份当前固件设置。
    2. 记录当前路由上网拨号的用户名和密码,等下会用到。
    3. 手动选择下载好的固件。点开始升级。
  2. 重新进入路由并设置,可以正常上网后。
  3. 获取SSH权限。
  4. 固化SSH权限。
  5. 升级系统到最新固件。
  6. 通过Telnet获取SSH权限。
  7. 安装Clash。
    1. 配置Clash
    2. 获得yaml配置
    3. 设置开机自启。
    4. 访问UI界面。

修改Mac中iOS/iPadOS设备默认备份的位置

技术

起因

我的iCloud只买了50G的,其中iPhone和iPad的备份占了大头。终于有一天,提示空间不够了,要加钱。于是我选择手动备份iPad,但是我发现,苹果默认备份是在主磁盘,并且没有改存储设置的选项。让一个很少用到的备份,占用主磁盘,实在是太不划算了。于是我查找修改的办法。

原理

访达中默认备份的位置是~/Library/Application\ Support/MobileSync/Backup文件夹。我们只需要将这个位置通过ln转移到我们需要的位置即可。

实践

  1. 打开访达(Finder),按下cmd+shift+o,输入~/Library/Application\ Support/MobileSync/,跳转到这个文件夹。
  2. 如果上面的文件夹不存在,就创建一个,名字一定要拼对。
  3. 查看底下是否有Backup文件夹,如果有,执行4、5、6。如果没有执行4、6。
  4. 打开另一个访达窗口,找到你想要保存备份的文件夹位置,我这里是/Volumes/1T/MobileSync/Backup/
  5. 将3中Backup内部的文件夹复制并粘贴到4的文件夹中。完成后,删掉3中的Backup文件夹。
  6. 打开一个终端(Terminal),输入命令ln -s /Volumes/1T/MobileSync/Backup/ ~/Library/Application\ Support/MobileSync/Backup
  7. 在Finder中点击备份,你会看到新备份保存在指定的位置了。

参考