分类
iOS开发 MacOS 技术

用 Xcode cloud 解决 Xcode-beta 无法提交 App 的问题

前两天苹果的 WWDC 2024结束,每次苹果召开 WWDC 都是苹果平台开发者的节日。听完 Keynote,大家往往就想最先下载测试版本的操作系统和 Xcode 来尝鲜。

但是这里也有一个矛盾,一般来说从测试版到正式版要1个多月的时间。而测试版的 Xcode-beta 是无法提交 App。也就是尝鲜的话,你就有一个多月没办法提交你的 App。

解决的方法,一般是如果自己有多台 mac,其中一台不升级,专门留着用来提交 App。还有一种就是安装多系统。

但是前几年,苹果推出了 Xcode cloud,我就想是不是可以利用 Xcode cloud来解决这个问题呢?果然解决了。

分类
iOS开发 IT行业 技术

WWDC 2024将近,苹果的AI革命会给基于AI的独立开发者带来灭顶之灾么?

6月11日,WWDC 2024 就要召开了。每年 WWDC 召开以后,随着苹果发布一堆新的内嵌功能,就会在推特和各种 blog 网站引发很多讨论。很多独立开发者就会哭着喊着说,苹果在搞垄断,苹果新内嵌的某某功能会影响他们的生意,甚至毁掉他们的营生。

分类
iOS开发

Swift编程中应用@available和deprecated在自己的编程中提供便利

在 Swift 中,@available 是一个属性标注(Attribute),它用来表示一个类、结构体、枚举、函数或者方法等的可用性信息,指示特定的平台和版本。通过这个属性标注,开发者可以对代码中的各个部分设定适用的操作系统平台及最低支持的版本,也可以指定在某个版本中它们已经过期或不推荐使用,甚至是未来某个版本中会被添加的特性。

我们使用苹果的标准 Swift 库的时候,经常遇到 @available ,一个老代码的某个函数调用,系统升级后,可能会发现一个警告,

'oldMethod(text:messages:key:)' is deprecated: Use newMethod() instead

意思就是这个方法或者函数,现在已经被废弃了,最好不要再使用。在这个情况下,往往你其实还可以编译还可以执行。但是这些被废弃的老方法,要么也许有 bug ,或者系统的代码风格,习惯变了,已经被推荐使用了。有的人觉的既然可以编译和执行,何必理会呢?其实不然,有些方法会在某一个操作系统版本废弃,然后在后续的某个大操作系统版本就彻底消失,无法编译和运行。也就是说,废弃声明就是提醒你可以修改代码了,未来这个方法或者类有可能完全不能用了。最好尊重这些声明来写代码。

我们去看系统代码和头文件的时候,会看到很多类似的例子:

1. 指定功能在平台上的最小可用版本:
@available(iOS 10, *)
func newiOS10Method() {
// 这个方法只会在 iOS 10 及以上版本可用
}

2. 标示一个功能在新版本中被弃用:
@available(iOS, deprecated: 11.0, message: "Use newMethod instead")
func oldMethod() {
// 这个方法在 iOS 11 中被标记为弃用
}

3. 标示一个功能在新版本中被废弃或移除:
@available(iOS, obsoleted: 11.0, message: "Use anotherMethod instead")
func obsoleteMethod() {
// 这个方法从 iOS 11 开始就废弃了,调用它会出错
}

4. 标示功能未来新增:
@available(iOS 15, *)
func futureMethod() {
// 这个方法在未来的 iOS 15 版本中会被添加
}

5. 跨多平台设置可用性:
@available(iOS 10, macOS 10.12, *)
func crossPlatformMethod() {
// 这个方法在 iOS 10 和 macOS 10.12 及以上版本都可用
}

6. 为不同的平台指定不同的最小版本:
@available(iOS 14, watchOS 7, *)
func multiPlatformMethod() {
// 对于 iOS 平台,这个方法要求版本 14.0 及以上
// 对于 watchOS 平台,这个方法要求版本 7.0 及以上
}

但是,这是一般情况下我们接触的 @available 和 deprecated。其实我们自己的代码里面也可以用这些用法。比如我最近在给 TinyStudio(最好的Mac字幕软件之一)增加新的功能,代码里面涉及到如何调用 ChatGPT,以及用 ChatGPT 来进行一些复杂的字幕后续处理操作。

在此之前我不知道 Swift 的 await 和 actor 语法,所以涉及到 ChatGPT 的代码非常复杂,比如一个巨长的文本发给 ChatGPT 需要实现分段,然后一段一段的去调用 ChatGPT 来进行处理。代码就非常复杂,我用递归调用和回调函数的方法来做,非常麻烦。虽然我可以轻松的写出这样的代码,但是这样的代码在调试、调优和异常处理方面简直是噩梦。

我知道了 Swift 的 await 和 actor 语法后,发现这个场景用这些并发语法来写,代码可以变得非常简洁,而且在调试、调优和异常处理方面非常方便。于是我就着手写 ChatGPT 和文本处理库的异步版本(await/actor)。写的时候,原有的函数叫 send ,新版本就叫做 asyncSend,原有的函数叫 format,新的就叫做 asyncFormat。

初步实现以后,我发现原有的 send 和 format 在很多地方都有调用,直接用文字搜索也会遇到一些类似的函数名。于是我就想起了 @available 和 deprecated 语法。

首先,我先把 ChatGPTKit 类和 TextKit 类的新老版本函数,放在不同的 extension 里(不影响执行,但是从代码来看,就可以把不同类型的方法条理清晰的分明白了):

// 遗留版本函数
extension TextKit {

func format(textString) {
...

// 遗留版本函数
extension TextKit {

func asyncFormat(textString) {
...

然后,在遗留版本函数的 extension 声明前,标注 @available 即可:

// 遗留版本函数
@available(*, deprecated, message: "老版本已废弃,请使用异步版本")
extension TextKit {

func format(textString) {
...

这时候编译程序,就会发现还在用老版本函数的代码就会被编译器发出警告,然后我们根据警告信息,一一替换为新版本就好了。如下:

分类
技术

PHP如何解析Youtube的RSS【ChatGPT】

最近我想把我的油管视频的RSS引入到我的其他网站,比如OurCoders里。这本来应该不难。本来OurCoders的代码里面就包含了magpierss,这是一个古老的PHP RSS解析库,但是一直都可以用。

分类
技术

在Mac上用FFMpeg做youtube上传视频的预处理

大家知道我有好几个 Youtube 频道,目前主频道是Tinyfool的胡说八道。

我现在有几种视频拍摄方式,其中一种主要的是用 Mac 的 QuickTime player 来录制,录制高品质的版本生成的 .mov 文件,文件非常大。

我最近录制的一个视频有48分钟,1080p的,文件尺寸足有51G。直接上传到 Youtube 也可以,但是实际上 Youtube 也会把你上传的视频进行压缩,所以,事先先压缩可以节约大量的翻墙流量。

于是我研究了一下 FFMpeg 的命令,用下面的命令来做压缩:

ffmpeg -i input.mov -vcodec h264 -acodec mp2 -vf scale=-1:1080 output.mp4
  • -vcodec h264 是因为 Youtube 内置的视频格式是 .h264
  • -acodec mp2 是因为 Youtube 内置的音频格式是 mp2
  • 原视频是 1080p 的,用 -vf scale=-1:1080 是为了保护分辨率不被篡改。这些参数的结果是上传到 FFMpeg 以后不会有更近一步的压缩,节省了上传后的处理时间。

用了一些日子,效果非常不错。

但是这个转换速度很慢,耗时很长,我今天又研究了一下。在压缩的时候,CPU 可以跑满,这说明这完全是一个软压缩。于是我寻找了一下, FFMpeg 如何在Mac下加速,原来加入 -c:v h264_videotoolbox 就可以了。于是命令变为:

ffmpeg -i input.mov -vcodec h264 -acodec mp2 -vf scale=-1:1080 -c:v h264_videotoolbox output.mp4

在我的 Mac M1Max 笔记本上用新命令之前压缩 48 分钟的 51 G Mov文件需要 22分15秒,用了新命令,只需要12分钟1秒,省了大概一半的时间。

但是我发现用新命令的结果非常模糊,用 FFMpeg 检查文件发现,原来的 bitrate 是 2868 kb/s,新命令的结果 bitrate 是 716 kb/s。默认的压缩率太高了,所以看起来很模糊,于是我加入了一个新的参数,-b:v 2800k 限制 bitrate,然后压缩的结果就看起来没有任何问题了。而压缩速度几乎没变。所以,最后的命令如下:

ffmpeg -i input.mov -vcodec h264 -acodec mp2 -vf scale=-1:1080 -c:v h264_videotoolbox -b:v 2800k output.mp4

分类
Mac Bugs MacOS

Mac自带音箱音量过低的解决方法一例

我的 Mac 是 MacBook M1Max,最近几个月频繁遇到耳机音量正常,自带音箱音量很低,完全无法听清的偶发问题。重启 Mac 后就会完全恢复正常。

分类
iOS开发

使用StoreKit2不再需要恢复购买按钮,但是为了审核你还需要放一个【AppStore审核手记】

昨天我提交了一个新App,2023年我的计划就是开发一系列的小App试图在独立开发领域有一份收入。但是今天一早就发现被拒绝了。

理由是:

分类
iOS开发 技术

从零开始,使用SwiftUI和PDFKit快速构建完全可定制的PDF阅读器

SwiftUI快速创建UI的能力非常强大,苹果还提供了PDFKit框架,所以,用SwiftUI和PDFKit可以用非常少的代码,非常快速的创建一个完全可定制的PDF阅读器。

我们来从零开始,做一个PDF阅读器。

分类
AI 技术

万能的ChatGPT真有智能了么?一篇文章让你彻底搞懂ChatGPT-人类是怎么训练出了一只聪明的莎士比亚的猴子

很多人说ChatGPT这样的人工智能已经拥有真正的人类智慧了。他们提到了许多例子,比如ChatGPT能够和人类进行对话,甚至可以进行智能聊天,可以帮助你润色文章,提取摘要,甚至直接帮你扩写内容。但是事实并非如此,今天我们就好好聊聊这个问题。

分类
AI 技术

ChatGPT常见问题解答【官方/非官方版】

ChatGPT官方常见问题解答

翻译自官方的FAQ页面,翻译由ChatGPT完成。