iOS 摸鱼周报 #100 | 最后一期

本期概要本期话题:关于摸鱼周报停刊的一些感受 本周学习:Xcode 中实现更好的异常提示 内容推荐: String Catalogs、自定义字体加载、HTTP 类型、单向数据流、构建类 Facetime 应用等内容 摸一下鱼:不换账号切换 App Store 商店内容;吐司 Tusi.Art;Swift AST 可视化展示网站;开源的 AI 角色模拟框架 RealChar;一份小册:「精益副业:程序员如何优雅地做副业」本期话题 再摸最后一次鱼 不知不觉摸鱼周报已经做到第 100 期了。从公众号后台看第 99 期到第 1 期的变化,找到第二期周报下一位读者的留言:当时很受鼓舞,但也没想过要做多久,100 期是一个很玄幻的目标。但从那之后命运的齿轮开始转动,两年半之后,竟然真的做到了 100 期。通过后台数据能大致分析出周报的一些变化,前中期阅读量和互动量都还不错,到了近期反而有些下滑。这也正好反应了我做周报的状态,早期的时间投入和积极性都是比较理想的,到了近期周报对我来说反而有点像是一种负担了。想着怎么找到更好的内容,如何进一步突破,但基本都没有达到预期,确实有过迷茫,摸鱼周报此时就是到了那个难以突破的瓶颈期。 当然这只是一方面,另一方面是时间分配问题。工作上有很多事情需要更全面的规划,有很多东西想要深入了解,都还没有抽出时间;对 AI、前后端、绘画都比较有兴趣,已经列了好几个支线任务,都还是待完成状态;家庭方面,随着孩子的成长,也需要给她更多陪伴,尽量早点下班,每周至少逛两次公园。需要做的事情很多,但时间却是有限的,一个地方的投入变多就意味着另一个地方就要减少,现在想想,最近两个月玩原神的时间好像都不超过2 小时。 摸鱼周报要不要就此休刊,就变成了一个需要衡量 ROI 的事情了。早期的收获更多是定期输出的习惯培养、公众号运营、认识更多的朋友等等。现在这些也都没变,但带给我的激励要小很多了。我还是会有分享的诉求,但就投入度来说,摸鱼周报相对来说显得会比较重,好几次都搞到很晚。有想过改成两周一期、减少内容、利用 AI 生成内容,但这些都只是在强行续命,内容瓶颈没有解决,而且不满意的内容因为更新提醒占用读者时间,还不如不发。100 是一个很完美的数字,就让摸鱼周报停留在这一期吧。 感谢一直以来提供帮助的摸鱼周报编辑们,特别是肘子,不是他的帮助可能 100 期都做不到;也感谢各位陪伴的读者,被人关注,被人期待的感觉很美好,这些都是你们给的。后面也还是会继续输出一些内容,只不过密度会小一些,不再是周报形式。 本周学习 整理编辑:zhangferry 给代码异常提供更丝滑的提醒方式 在平常开发过程中,对于一些非预期的行为,我们通常使用 assert或者 fatalError附加一些信息,并中断程序来提醒开发者注意这类异常。它最大的问题在于触发此类语句,程序会立即崩溃,除了异常语句提供的信息和堆栈,什么都获取不到的,想跟进一些执行的上下文时也变得不可能。这里介绍两种相对不那么生硬,还能起到比较直接提醒的形式。方案实现逻辑参考自 Unobtrusive runtime warnings for libraries。 断点提醒 就是程序运行到此处时,不再崩溃,取而代之是一个自动的断点,你可以选择调试上下文,也可以选择继续执行。主要逻辑是向运行的进程发送 SIGTRAP 信号: raise(SIGTRAP)它生效的前提是当前程序已经被 LLDB attach 了,SIGTRAP 全名是 "Trace/breakpoint trap",它是 POSIX 标准定义下的信号之一。这个信号的默认操作是让进程停止执行,并进入断点停止状态。raise(SIGTRAP) 就是向当前进程发送 SIGTRAP 信号,使其进入断点停止状态。如果要跳过断点,输入 "c",或点击跳过断言按钮都可以。完整代码如下: @inline(__always) func breakpoint(_ message: @autoclosure () -> String = "") { #if DEBUG var name = [CTL_KERN, KERN_PROC, KERN_PROC_PID, getpid()] var info = kinfo_proc() var info_size = MemoryLayout<kinfo_proc>.size let isDebuggerAttached = sysctl(&name, 4, &info, &info_size, nil, 0) != -1 && info.kp_proc.p_flag & P_TRACED != 0 if isDebuggerAttached { fputs( """ \(message()) Caught debug breakpoint. Type "continue" ("c") to resume execution. """, stderr ) raise(SIGTRAP) } #endif }这个方案的问题在于断点的位置无法控制,可能会让人疑惑。 issue 提醒 Xcode 会默认开启主线程检查,就是非主线程操作 UI 会被识别到并以一种紫色的提醒展示出来,它不会打断程序执行,仅仅用于展示。这种能力其实也是可以自定义的,有一种方案是通过函数地址去调用 __main_thread_checker_on_report,但因为它展示的分类还是 Main Thread Cheker,效果不太好。还有一种方案是通过 os_log,这种形式相对 trick,记得把它限定在 DEBUG 环境下。// os_log 定义 @available(macOS 10.14, iOS 12.0, watchOS 5.0, tvOS 12.0, *) public func os_log(_ type: OSLogType, dso: UnsafeRawPointer = #dsohandle, log: OSLog = .default, _ message: StaticString, _ args: CVarArg...)// os_log 使用 os_log( .fault, // 日志类型,有:default, info, debug, error, fault dso: <UnsafeRawPointer>, log: OSLog( subsystem: "com.apple.runtime-issues", // 可固定 category: "CustomXcodeIssue" // 日志类别 ), "We encountered a runtime warning" // 需要自定义展示的日志信息 )这里还有一个参数没有填,就是这个 dso,它对应的是一个系统动态库的基址,而且它还不是随便一个动态库都行,哪谁可以呢,文章中用的是 SwiftUI,但非 SwiftUI 项目回来加载这个库,测试发现 Foundation 也是可以。获取 Foundation 的基地址有两种方式:通过 nm 获取一个 Foundation 里的符号,然后通过 dladdr 获取库的基值: var info = Dl_info() dladdr( dlsym( dlopen(nil, RTLD_LAZY), ".." // Foundation 内部符号 ), &info ) // info.dli_fbase 就是这个基址通过检测所有需要加载的动态库,根据加载地址判断出 Foundation: let count = _dyld_image_count() for i in 0..<count { guard let name = _dyld_get_image_name(i), String(cString: name).hasSuffix("/Foundation"), let header = _dyld_get_image_header(i) else { continue } // header对应的就是基地址 }为了让提示能够停留在我们的调用的地方,还需要给日志函数加上内联,最终效果如下:完整代码: @_transparent @inline(__always) func runtimeWarning( _ message: @autoclosure () -> StaticString, _ args: @autoclosure () -> [CVarArg] = [] ) { #if DEBUG let message = message() let log = OSLog(subsystem: "com.apple.runtime-issues", category: "CustomXcodeIssue") struct DSOFinder { static let dso: UnsafeMutableRawPointer = { let count = _dyld_image_count() for i in 0..<count { guard let name = _dyld_get_image_name(i), String(cString: name).hasSuffix("/Foundation"), let header = _dyld_get_image_header(i) else { continue } return UnsafeMutableRawPointer(mutating: UnsafeRawPointer(header)) } return UnsafeMutableRawPointer(mutating: #dsohandle) }() } os_log(.fault, dso: DSOFinder.dso, log: log, message, args()) #endif }内容推荐 推荐近期的一些优秀博文,内容涵盖 String Catalogs、自定义字体加载、HTTP 类型、单向数据流、构建类 Facetime 应用等方面。 整理编辑:东坡肘子 1、与 String Catalogs 有关的常见问题解答 -- 作者:Cihat Gündüz @东坡肘子: 在 WWDC23 上,苹果为 Xcode 推出了一个新功能:String Catalogs。该功能取代了传统的本地化文件,简化了本地化流程。本文作者同时为 RemafoX( 一个本地化工具)的开发者,他在 Slack activity 上与苹果的工程师进行了深入探讨。作者将通过问题解答的形式对 String Catalogs 进行说明,以帮助开发者了解为什么应该对 Xcode 15 中的这个强大工具感到兴奋。 2、使用 Swift Package 插件将自定义字体加载到应用程序中 -- 作者:Pol Piella Abadia @东坡肘子: 如果你发现自己一遍又一遍地使用相同的字体,那么就要考虑是否需要创建一个 Swift Package 来包含共享的字体文件和字体加载代码。这样可以更快地创建新的应用程序,通过一个单一的地方来更新所有应用程序的字体文件,并减少代码重复。本文作者将向你展示如何使用 SwiftGen 来实现这一点,让你的应用程序更加高效和可维护。 3、介绍 Swift HTTP 类型 -- 作者:Guoye Zhang、Eric Kinnear、Cory Benfield @东坡肘子: Swift 社区刚刚发布了一个名为 Swift HTTP Types 的开源软件包,通过 HTTPRequest 和 HTTPResponse 提供了 HTTP 消息的核心构建块的通用表示。在项目中采用这些类型,可以在客户端和服务器之间共享更多的代码,从而减少在类型之间进行转换的成本。Swift 社区的最终目标是使用 Swift HTTP Types 替换 SwiftNIO 的 HTTPRequestHead 和 HTTPResponseHead,以及 Foundation 的 URLRequest 和 URLResponse 中的 HTTP 消息信息。 4、单向数据流 -- 作者:Majid @东坡肘子: Majid 写过很多关于 SwiftUI 数据流的文章,分享了他在该领域的灵感和想法。这些想法经过多年应用程序构建的实践,最终产生了一个名为 swift-unidirectional-flow 的 Swift 软件包。该软件包实现了 Majid 所有的想法,并被用于他的项目中,支持并发以及构建实际应用所需的其他功能(如可预测、可预览、可调试、模块化)。但是,Majid 并不建议开发者直接使用该软件包。他认为,开发者不应该导入任何第三方库或框架来构建应用程序的核心功能。你可以使用它作为灵感,在应用程序中根据你的需求构建状态管理系统。 5、流式视频通话:如何使用 SwiftUI 构建类似 FaceTime 的应用 -- 作者:Amos G @东坡肘子: 无论通话参与者身在何处,使用苹果设备,都可以通过 FaceTime 创建一对一或群组的音频/视频通话。本文将演示如何使用 SwiftUI 和 iOS Video SDK from Stream 来构建一个类似 FaceTime 的应用,与朋友和家人进行面对面的聊天。构建的 iOS 语音和视频通话应用程序可以支持多种用例,例如 1-1 通话,群组会议,远程医疗,约会和会议等。 摸一下鱼 整理编辑:zhangferry 1、切换 App Store:要登录不同国家的 App Store 通常都需要有各个国家的 AppleID 才行,这个网站则可以做到随意切换 App Store 商城。用 iPhone 端 Safari 打开网站地址:https://as.dogged.cn,点击对应的国家会跳转至 App Store,并刷新 App Store 内容为当前国家的信息。当然你只能浏览商店,无法下载。 2、吐司 Tusi.Art:一个国内的类 civitai 网站,有 AI 模型和 AI 图片的分类展示,我看一些 C 站有名的作者也有在吐司发布模型。该网站还提供了在线生成 AI 图片的功能,每天提供 100 算力,如果都使用文生图 + 高清修复的话,每天可以白嫖 50 张图片。最主要的是比我本地跑的要快。3、Swift AST Explorer:一个把 Swift 代码的 AST 可视化展示出来的网站。如下图是 Swift 中一个枚举声明 EnumCaseDecl 的结构:4、RealChar:最近比较火的一个 AI 项目,类似 character.ai,但要更优秀,它可以自定义 AI 角色的行为、背景,甚至声音;可以实现语音对话,且实时性很高,语音也让交流过程显得更加自然;提供多端接入能力,网页、iPhone、终端都可以。还有提供了一个体验的平台:https://realchar.ai/,可能是声音的加持,跟这里的乔布斯交流,更显自然,很奇妙的感觉。对了,他还能说中文😅5、精益副业:程序员如何优雅地做副业:副业是一个比较理想的存在,这篇小书提到的几个实践有知识付费、社区付费、独立产品,这些适用性已经没有那么强了,能做出来的概率很低。但考虑副业,把一个目标拆分,尝试做成产品这件事本身还是比较有价值的。作为程序员很多时候我们了解的只是技术细节,而完成的产品设计还有很多。其中举了一个「福利单词」项目的商业模式画布,对于大多数产品都可以通过类似环节进行拆分。关于我们 iOS 摸鱼周报,主要分享开发过程中遇到的经验教训、优质的博客、高质量的学习资料、实用的开发工具等。周报仓库在这里:https://github.com/zhangferry/iOSWeeklyLearning ,如果你有好的的内容推荐可以通过 issue 的方式进行提交。另外也可以申请成为我们的常驻编辑,一起维护这份周报。另可关注公众号:iOS成长之路,后台点击进群交流,联系我们,获取更多内容。 往期推荐 iOS 摸鱼周报 #99 | 躺平、摆烂、开心就好 iOS 摸鱼周报 #98 | visionOS 模拟器体验 iOS 摸鱼周报 #97 | 智源大会线下参会体验 iOS 摸鱼周报 #96 | Vision Pro 打开空间计算的大门

iOS 摸鱼周报 #99 | 躺平、摆烂、开心就好

本期概要本期话题:macOS Sonoma 体验 内容推荐:Swift 宏、Core Data 新特性、SwiftData 介绍、自动生成 RESTful APIs、iOS 应用保护等内容 摸一下鱼:Public Apple Frameworks;微软提供的面相前端初学者的课程;苹果M2 Ultra:AI大模型的新希望;AI 生成的艺术二维码;本期话题 macOS Sonoma 体验了一段时间新系统,更新非常小,苹果不告诉我我都不知道发生了哪些变化。说几个比较有意思的变化吧。 1、屏保新增了动态屏保,如果你将它作为壁纸同时开启,锁屏时会看到一段航拍风景的视频,解锁桌面,视频缓慢减速,最后定格为桌面壁纸,整个过程自然,舒适。视频地址位于:/Library/Application Support/com.apple.idleassetsd/Customer/4KSDR240FPS/,通过目录名也可以看出来,这些屏保是 4K SDR 240帧的规格,每一帧停下来都可以当壁纸。 2、Web App web app 是 macOS Sonoma 开始引入的新功能,类似 iOS 中的 Home Screen,它可以把浏览器中常访问的网站加到 Dock 栏中。添加到 Dock 之后它就可以向普通的 App 一样供我们使用了。这个 web app 并非简单的网页入口,苹果给它融入了很多原生 App 才有的能力。macOS 上的 Web App 要比移动端的 Home Screen 意义大的多,因为移动端并不缺应用,浏览特定网站是一个低频场景。而 mac 端的问题在于应用少,浏览网站是一个高频场景。有很多网站为了做 mac 端都是套壳 H5,有了 Web APP 直接无缝升级为 「Applicaiton」,这对苹果生态和应用本身都是利好的。 3、小组件 也是同步 iOS 端的 Widgets 功能,可以把小组件直接拖动到桌面上去。主要电脑桌面经常都是满的,会覆盖小组件,所以关注到它们的频率也不高。内容推荐 推荐近期的一些优秀博文,内容涵盖 Swift 宏、Core Data 新特性、SwiftData 介绍、自动生成 RESTful APIs、iOS 应用保护等方面。 整理编辑:东坡肘子 1、一文看懂 Swift Macro -- 作者:Yasic @东坡肘子: 在 5.9 版本中,Swift 引入了一个重要的新功能:宏(Macro)。Swift 宏可以在编译时生成源代码,从而避免开发者编写重复的代码。除了 Swift 标准库以及苹果众多的官方库提供的宏外,开发者也可以编写自己的宏。本文作者对宏的特点以及如何自定义宏做了详尽的介绍,并针对不同种类的自定义宏分别给出了示例代码。 2、WWDC 2023,Core Data 有哪些新变化 -- 作者:东坡肘子 @东坡肘子: 虽然在 WWDC 2023 上,苹果将主要精力放在介绍新的数据框架 SwiftData 上,但作为 SwiftData 的基石,Core Data 也得到了一定程度上的功能增强。本文将介绍今年 Core Data 获得的新功能,包括:复合属性( Composite attributes)、在 Core Data 中使用新的 Predicate、VersionChecksum、延迟迁移(Deferred migration)以及阶段式迁移( Staged migration )等内容。 3、使用 Swift 生成 RESTful APIs -- 作者:Marco Eidinger @东坡肘子: Swift OpenAPI Generator 是一个 SwiftPM 插件,可以根据 OpenAPI 文档生成用于执行 HTTP 调用或处理这些调用的客户端或服务器端代码。本文作者介绍了他的经验,通过以下四个步骤使用 Swift OpenAPI Generator 生成客户端代码:获取后端的 RESTful API 定义,模拟后端,生成 Swift 客户端库,然后在应用程序中使用该 Swift 客户端库。 4、构建 SwiftData 应用的终极指南 -- 作者:Mohammad Azam @东坡肘子: 作为 Core Data 框架的替代品,SwiftData 在 WWDC 2023 首次亮相。本文将通过几个部分全面介绍 SwiftData 的各项功能,其中包括:SwiftData 的基本概念、架构设计、关系管理、数据查询、数据预览、数据迁移、单元测试以及与 UIKit 集成等。通过本文,作者希望读者能全面了解 SwiftData 的功能和特性,从而在 iOS 开发中充分利用其潜力。 5、iOS 防 dump 可行性调研报告 -- 作者:ChatGPT(GPT-4) & iHTCboy @东坡肘子: 在 iOS 平台上,保护 App 的源代码安全是开发者的一项重要任务。由于 App 可能包含敏感信息和重要算法,防止源代码被非法获取和篡改显得尤为重要。本文介绍了如何防止 iOS App 被 dump,包括代码混淆、加密、完整性检查等多层防御策略,以及服务器端验证、动态加载、API 安全性和多因素认证等方案。此外,监控与告警、定期安全审计和安全培训等后置方案也可以提高 App 的安全性。最后,还介绍了禁止越狱设备的实施方案,以及 DeviceCheck 和 App Attest API 等新技术方案。 摸一下鱼 整理编辑:zhangferry 1、Public Apple Frameworks:查看所有 Apple 提供的公共 Framework 在各个平台下是否被支持,以及支持的最低版本。筛选所有的 Core 系列框架:2、Web-Dev-For-Beginners:微软提供的面相前端初学者的课程,学习 JS、CSS、HTML,课程公 24 节,包括课后作业,测试,解决方案等。最后会有多个实践项目,浏览器插件、太空游戏、银行应用等。3、苹果M2 Ultra:AI大模型的新希望: 今年各种大模型层出不穷,但大模型对算力要求很高,这俨然已经成了模型发展最大的障碍之一。简单列一下 Nvidia 中经常用于 AI 训练的几种显卡的显存和价格:显卡 显存 价格RTX 4090 24G ¥1.3wA100 80G ¥8.1wH100 80G ¥24.2wH100 之所以比 A100 贵那么多是因为 H100 采用了全新一代的琥珀架构,计算性能提升了数倍。所以光看这个价格就知道,大模型训练不是普通人玩得起的。 今年苹果发布了 M2 Ultra,最大内存可达 192 GB,在苹果芯片的统一内存架构下, 192 GB 内存就可以是 192 GB 显存。这就意味着原本 8 张 4090才能装得下的 AI 模型,在 M2 Ultra 一张芯片就可以跑起来了。看价格 M2 Ultra 192GB + 4 TB 只有 6 w,怎么越算越感觉便宜呢。 理论归理论,视频作者也实践了一波,购买了 128 GB 内存的 M2 Ultra,本地就跑起来了 LLaMA 330 亿参数的大模型。当然完全发挥 M 系列芯片的优势还需要各类软件的适配,这个实现就有赖与开源社区针对 M 芯片在 LLaMA 模型上的特别优化。所以在 AI 芯片领域能打破 Nvidia 垄断的,很有可能就是苹果,这一波苹果属实算是弯道超车了。 4、QR Code AI Art Generator:最近 AI 艺术的二维码比较火,它是由 4 名中国大学生开发出来的,项目是 QR Code ControlNet。在 StableDiffusion WebUI 中利用 这个预处理工具 ControlNet 控制灰度和光影,它们保证了二维码的准确性;再利用 Lora 模型实现不同的风格画风,就有了一张特定画风和二维码结合的新图片。AI Art Generator 这个项目可以让你线上体验这种 AI 艺术风格的二维码生成。输入内容,其他参数默认,prompt 是:masterpiece, best quality, cyberpunk city,就有了下面这张图,可以扫一下看出来的是什么:5、对谈半佛仙人:看似复制成功,实则刻舟求剑:这期博客非常欢乐,收获比较大的是半佛老师对待生活的态度。半佛老师有糖尿病,新冠的时候身体反应比较激烈,差点交代过来。从那以后就一下看开了,开始反思,发现这么努力,这么卷的工作没有任何价值,感受到濒死状态后才明白身体健康有多么重要。 完整的健康即包括身体健康,也包括心理健康。最近因为李玟轻生的事件越来越多的人又关注到了抑郁症。看到一个数字,我国抑郁症就医率不足 10 %,说明大部分抑郁症患者对于抑郁都是选择逃避的。抑郁症本身是一种病,它是需要药物治疗的,而且大部分抑郁症都是可以治好的。一方面要正视和重视抑郁症,一方面也要注意情绪的宣泄。失业、房贷、家庭等一系列事情都有可能成为负面情绪的源头,不断在心底挤压。 这个时候,找一个爱好,快乐的,没有任何心理负担的把时间浪费掉非常重要。别再忙工作了,打球去、跑步去;别再卷了,撸串喝酒去;别再学了,打游戏、刷短视频去,看看修马蹄子的,洗地毯的,挤黑头的,来一个赛博按摩。躺平,摆烂,消磨时间,能让自己开心起来的就是最好的。 关于我们 iOS 摸鱼周报,主要分享开发过程中遇到的经验教训、优质的博客、高质量的学习资料、实用的开发工具等。周报仓库在这里:https://github.com/zhangferry/iOSWeeklyLearning ,如果你有好的的内容推荐可以通过 issue 的方式进行提交。另外也可以申请成为我们的常驻编辑,一起维护这份周报。另可关注公众号:iOS成长之路,后台点击进群交流,联系我们,获取更多内容。 往期推荐 iOS 摸鱼周报 #98 | visionOS 模拟器体验 iOS 摸鱼周报 #97 | 智源大会线下参会体验 iOS 摸鱼周报 #96 | Vision Pro 打开空间计算的大门 iOS 摸鱼周报 #95 | WWDC23 is coming

iOS 摸鱼周报 #98 | visionOS 模拟器体验

本期概要本期话题:visionOS 模拟器体验;Safari Technology Preview 173 发布 本周学习:React Hooks 相关的几个概念介绍 内容推荐:mergeable libraries、Swift on Server、Observation 框架、通过 ReviewKit 获得更多好评、Apple AR 技术全景等博客推荐。 摸一下鱼:Diffusion Bee 2 发布,支持视频制作,致力于打造 Mac 端最优秀的 StableDiffusion 开源工具;GPT Engineer 项目来让 AI 来充当软件工程师;「三五环」一期关于投资、创业的播客分享本期话题 Xcode 15 Beta 2 @zhangferry:Xcode 15 beta 2 包含 visionOS,已经可以利用 visionOS 模拟器来运行系统或自己的 App 看一下它们在新系统上的运行状态了。模拟器无法模拟手势,所以所有操作都是通过鼠标和键盘完成,但界面上的设计细节还是可以通过模拟器感受到的。少数派有一篇文章比较详细的介绍了各项体验:visionOS beta 1 快速体验Safari Technology Preview 173 发布 @zhangferry:苹果推出 Safari Technology Preview 旨在从开发人员和用户那里收集关于其浏览器开发过程的反馈。173 版本会随 macOS Sonoma 一起发布,该版本更新了 Profiles、Web apps、Web Inspector、CSS、Media Queries、Rendering、Editing、JavaScript、Popover、Images、Media、Web API 和 SVG 等方面的功能。 本周学习 整理编辑:zhangferry React Hooks 在介绍 React Hooks 之前先了解下 React 类式组件的书写方式,比如实现一个记录点击计次数的组件: class Counter extends React.Component { // 构造方法 constructor(props) { super(props); // state 初始化 this.state = { count: 0 }; } // 组件完成加载 componentDidMount() { document.title = `You clicked ${this.state.count} times`; } // 组件完成更新 componentDidUpdate() { document.title = `You clicked ${this.state.count} times`; } // 渲染组件 render() { return ( <div> <p>You clicked {this.state.count} times</p> {/* JSX注释:添加按钮及点击事件 */} <button onClick={() => this.setState({ count: this.state.count + 1 })}> Click me </button> </div> ); } }这里使用到了 React 里的 setState 来记录状态,使用 componentDidMount 等几个生命周期的函数来在适当时机更新内容。想要用函数来实现组件的话面临的问题就是函数没有状态和生命周期,为了解决这个问题,React 引入了 React Hooks 方法。还是上面的功能,函数式实现代码为: function Counter() { const [count, setCount] = useState(0); useEffect(() => { document.title = `You clicked ${count} times`; }); return ( <div> <p>You clicked {count} times</p> <button onClick={() => setCount(count + 1)}> Click me </button> </div> ); } 函数式组件会精简很多代码,运行效率也更高些,是官方推荐的写法。回到函数式的两个问题,看函数式组件是如何解决的,无状态,无生命周期,在这里分别对应 useState 和 useEffect 函数。 useState 函数可以赋值一个初始值,这里是 0,它有两个返回值,count 表示值变量,setCount 表示修改该变量的 setter 方法。 useEffect 函数表示 componentDidMount 那几个生命周期函数,它们都会统一走到 useEffect 里。这里有一个问题是如果想在 didMount 和 didUpdate 中做不同事情该如何处理呢?可以看下它在 TypeScript 下的定义: type EffectCallback = () => void | (() => void); type Inputs = ReadonlyArray<unknown>; /** * Accepts a function that contains imperative, possibly effectful code. * The effects run after browser paint, without blocking it. * * @param effect Imperative function that can return a cleanup function * @param inputs If present, effect will only activate if the values in the list change (using ===). */ export function useEffect(effect: EffectCallback, inputs?: Inputs): void;它还有第二个可选参数 inputs,类型为数组,这个数组可以作为 effect 回调函数里的参数使用,当数组里的值变化时,回调函数就会被调用。通过这种方式可以实现不同场景下的回调,以下为 Glarity 里卡片手动刷新的逻辑: const onRefresh = useCallback(async () => { // 正在加载,直接返回 if (loading) { return } setLoading(true) // 数据组合 questionData = Object.assign(questionData, { currentTime: Date.now() }) setQuestionProps({ ...props, ...questionData }) }, [props, loading]) // 供callback使用的两个参数除了这两个 Hooks,还有用于实现其他特性的几个常用的内置 Hooks:useContext:共享上下文,用于优化多级组件树之间需要一级一级通过 props 传值的情况 useCallback:返回缓存的回调函数,防止函数多次生成 useMemo:返回缓存的计算结果,防止重复计算 useLayoutEffect:与 useEffect 类型,但是在所有 DOM 变更之后同步调用 effect useReducer:状态管理,与useState类型,但可以管理更复杂的状态逻辑这些 Hooks 均以 use 开头,同时你也可以定义自己的 Hooks。 内容推荐 推荐近期的一些优秀博文,内容涵盖可合并库、Swift on Server、Observation 框架、通过 ReviewKit 获得更多好评、Apple AR 技术全景等方面。 整理编辑:东坡肘子 1、了解可合并库 -- 作者:Pol Piella Abadia @东坡肘子: 在 WWDC 2023 中,苹果推出了可合并的库。在此之前,开发者必须选择是将框架设置为静态库还是动态库。选择其中一种库类型可能会对应用程序的构建和启动时间性能产生连锁反应。但从 Xcode 15 开始,我们可以使用可合并的库,这是一种新类型的库,结合了动态库和静态库的优点,并且针对构建和启动时间性能进行了优化。在本文中,作者将向你展示可合并的库如何解决模块化代码库中的问题,以及使用方法。 2、Swift on Server Tour -- 作者:Kevin @东坡肘子: 作者将通过一系列文章,带领读者畅游 Swift on Server 的世界。这个系列主要面向服务器开发的初学者,因此除了功能实现外,还会写一些相关概念的内容。主题涉及:什么是 Server App、HTTP 请求的相关内容、选择你的框架 - Vapor、设计你的数据模型、设计你的 API、用户权限验证、测试你的 API、部署你的服务器、和其他语言一起工作等内容。目前已完成两章,敬请期待后续更新。 3、深度解读 Observation —— SwiftUI 性能提升的新途径 -- 作者:东坡肘子 @东坡肘子: 在 WWDC 2023 中,苹果介绍了 Swift 标准库中的新成员:Observation 框架。它的出现有望缓解开发者长期面临的 SwiftUI 视图无效更新问题。作者在文章中采取了问答的方式,全面而详尽地探讨了 Observation 框架,内容涉及其产生的原因、使用方法、工作原理以及注意事项等内容。 4、ReviewKit:帮你的应用获得更多的 App Store 好评 -- 作者:Cihat Gündüz @东坡肘子: 作为一名应用程序开发者,你应该知道用户评论对应用程序的成功和可信度有多重要。积极的评论不仅可以吸引更多用户,还可以帮助应用在 App Store 中获得更高的排名。然而,在不合适的时间或者向没有充分体验应用的用户要求评论可能会导致用户失望并获得负面反馈。ReviewKit 提供了一个简单而有效的解决方案,通过根据最近的使用记录智能地决定何时向用户请求应用程序评论。在本文中,作者介绍了如何使用 ReviewKit。 5、掌握 Transaction,实现 SwiftUI 动画的精准控制 -- 作者:东坡肘子 @东坡肘子: SwiftUI 因其简便的动画 API 与极低的动画设计门槛而广受欢迎。但是,随着应用程序复杂性的增加,开发者逐渐发现,尽管动画设计十分简单,但要实现精确细致的动画控制并非易事。同时,在 SwiftUI 的动画系统中,有关 Transaction 的解释很少,无论是官方资料还是第三方文章,都没有对其运作机制进行系统的阐述。文章将通过探讨 Transaction 的原理、作用、创建和分发逻辑等内容,告诉读者如何在 SwiftUI 中实现更加精准的动画控制,以及需要注意的其他问题。 6、开发 visionOS 前,你需要了解的 Apple AR 技术全景 -- 作者:XR基地 XR 基地的小老弟 @东坡肘子: 自从 2017 年 Apple 推出 ARKit 以来,Apple AR 相关的技术已经发展了 6 年多了。在这个过程中,每年的 WWDC 都会有关于 AR 技术的 Sessions。然而,由于使用场景的限制,大多数开发者可能仅仅是知道 Apple 有 AR 相关的技术,但对这项技术并没有实际的上手或深入了解。因此,对于 iOS 开发者来说,它可能是一个“熟悉的陌生人”。本文作者将从以下方面出发,帮助读者对 Apple AR 技术有一个大致的了解:2017~2022 年 WWDC 的进展、从官方 30+ 个 Sample Code 中总结出的 AR 整体框架、所有 AR App 都会用到的最基础的代码和编程概念、精进 Apple AR 必须了解的其他技术,以及入门 Apple AR 的推荐资料。作者希望读者在阅读本文后能够更好地理解 Apple AR 技术,并成为与之可以进一步合作的同事。 摸一下鱼 整理编辑:zhangferry 1、Diffusion Bee:之前推荐过的一个项目,macOS 系统下的 Stable Diffusion GUI 应用。当时版本还比较早,只能使用内置模型,最近它发布了 2.2.1(Beta) 版本。全新 UI,可以直接制作视频内容,支持 Lora 模型,支持 ControlNet,支持无限 AI 画布,自由修改图片。基本是一个完整功能的 Stable Diffusion WebUI 了。而且该项目针对 Mac 系统做了很多参数调优,出图速度比直接搭建的 WebUI 快很多。3、GPT Engineer:这个项目使用结构化的方式让 GPT 来解决编程问题,它跟 AutoGPT 很像,是被用于专门解决编程问题的。使用流程是:创建一个 prompt 文件,描述你要做的事情 读取这个文件,GPT 会根据不明确的信息再向你提问,你需要回答他的问题来消除所有的不确定性问题 执行编写任务就是这么简单,编程的门槛正在不断被降低。 3、三五环:老范聊创业:创业、投资就像酒,很讲究年份:最近听的一期质量还挺高的播客,主播是产品经理,嘉宾是一位天使投资人。 关于投资:不要听信专家的话,先信了再说,当有人开始劝你、甚至指导你该做什么的时候,说明已经过了它的红利期了。当一个人的经验越来越丰富时,很容易被经验主义束缚,对新事物的接受度变低,所以投资要找年轻人。这里还提到了 Vision Pro,从交互意义和长期价值来看,它被严重低估了,它成为 iPhone 时代的概率非常高。 关于创业:选择上的一些原则,新赛道、体量大、看最有力量的人、尽早切入。投资创业有黄金年份,如果错过,是很难弥补的,眼光的敏锐度非常重要。评估自己是进取型还是稳健性人格,进取型才适合创业。 关于职业发展:识天物,傍贵人。识天物是要知道什么是好东西,什么是有价值的东西,表示自己的判断力。傍贵人是拉杠杆,向优秀的人学习,借助他们的力量放大自己的价值,表示对外界资源的调动力。 关于我们 iOS 摸鱼周报,主要分享开发过程中遇到的经验教训、优质的博客、高质量的学习资料、实用的开发工具等。周报仓库在这里:https://github.com/zhangferry/iOSWeeklyLearning ,如果你有好的的内容推荐可以通过 issue 的方式进行提交。另外也可以申请成为我们的常驻编辑,一起维护这份周报。另可关注公众号:iOS成长之路,后台点击进群交流,联系我们,获取更多内容。 往期推荐 iOS 摸鱼周报 #97 | 智源大会线下参会体验 iOS 摸鱼周报 #96 | Vision Pro 打开空间计算的大门 iOS 摸鱼周报 #95 | WWDC23 is coming iOS 摸鱼周报 #94 | 前端项目开发流程学习

iOS 摸鱼周报 #97 | 智源大会线下参会体验

本期概要本期话题:智源大会线下参会体验 内容推荐:苹果在 WWDC 2023 上发布了许多新产品与新技术,本期将推荐几篇相关博客文章。 摸一下鱼:OpenAI API 更新;面向国内的 OpenAI API Key 服务 API2D; 《Design for spatial user interfaces》 Session 总结;每个软件开发都应该知道的事;图解 QUIC 连接本期话题 智源大会线下参会体验北京智源大会是智源研究院主办的国际性人工智能高端专业交流活动,定位于"AI内行顶级省会"。看本期的参会人员,都是 AI 领域最顶级的大佬,我其实是被 Sam Altman 吸引的。结果现场并没有见到本人,只有视频连线。连线那一刻现场氛围一下热腾起来了,Sam Altman 的明星属性真的太强了。虽然我是 AI 小白去凑热闹,也涨了不少见识。大会所有视频内容已同步到 B 站官号 2023北京智源大会。会议涉及主题非常多,强化学习、多模态大模型、AI 开源、AI 系统、认知神经科学大模型、AI 安全 等等。简单说一下参会那天的几点感受:会议学术性非常强,既有研究成果展示,也有具体技术方案的讨论 AI 领域不只有大模型,像 AI 编译器、AI 芯片、模型优化、模型评估等有非常多研究方向 国内在 AI 领域的投入和产出都很高,不能只通过大模型的差距,来衡量 AI 领域整体的差异。很多 AI 环节涉及的关键技术,都有国内的替代产品。 AI 领域的发力很多都在走开源路线,借助于社区的贡献和检验来完成 AI 产品本身 从事 AI 底层研究的主要还集中在这些研究机构和高校上,科技公司对于底层研究的投入还可以再多一点内容推荐 苹果在 WWDC 2023 上发布了许多新产品与新技术,本期将推荐几篇相关博客文章。 整理编辑:东坡肘子 1、WWDC 23 新增的系统框架 -- 作者:ZacJi @东坡肘子: 每年的 WWDC 都会发布新的系统,其中包括新功能和之前未向开发者开放的功能。为了支持这些特性,新的系统框架通常也会随之发布。这使得开发者能够方便地使用新系统的特性来开发应用程序。在本文中,作者将介绍 WWDC 23 中新增的系统框架,并分享自己的看法。 2、Metal for SwiftUI -- 作者:Alex @东坡肘子: 在本届 WWDC 上,SwiftUI 获得了很多新的 API,其中就包括可以直接在视图中使用 Shader(着色器)的能力。本文介绍了在 SwiftUI 中使用着色器的方法,涵盖了三种类型的效果:颜色效果、图层效果和扭曲效果。对于每种效果,都提供了示例,包括渐变效果、像素翻转效果和圆形加载器效果。 3、使用 Swift 宏自动适配 RawRepresentable 协议 -- 作者:Nikita Ermolenko @东坡肘子: 宏是 Swift 5.9 版本中推出的最重要的新特性之一。WWDC 上很多新的 API 都是基于宏来实现的。本文将通过创建一个自动为枚举类型添加 RawRepresentable 协议的宏,来介绍自定义宏的方法。通过使用宏,可以使我们的代码更加优雅、简洁和可维护,让开发者能够专注于应用程序的核心逻辑。 4、深入了解 SwiftUI 5 中 ScrollView 的新功能 -- 作者:东坡肘子 @东坡肘子: 在 SwiftUI 5.0 中,苹果大幅强化了 ScrollView 功能。新增了大量新颖、设计精巧的 API。包括:contentMargins、safeAreaPadding、scrollIndicatorsFlash、scrollClipDisable、scrollTargetLayout、scrollPosition、scrollTargetBehavior、scrollTransition 等。本文将对这些新功能进行介绍。 5、WWDC2023 Session系列:探索 XCode15 新特性 -- 作者:京东云技术团队 @东坡肘子: 像往年一样,苹果在 WWDC 2023 上推出了全新的 Xcode 15。在本文中,京东云技术团队将逐一介绍 Xcode 15 引入的新功能。包括更简洁的宏、文档和日志功能,使开发者能够更高效地编写和维护代码。更智能的自动补全和测试分析功能大大提高了开发效率。更方便的包管理功能通过拆分下载和 Git 集成简化了开发流程。此外,Xcode 15 还增强了图片资产和框架的安全性管理,为应用提供更高级的安全保障。这些新功能为开发者带来了更高效、更方便和更安全的开发体验。 摸一下鱼 整理编辑:zhangferry 1、OpenAI API 模型更新:本次更新主要有这几点:支持函数调用。它的目的是增加模型的灵活度,扩展模型的能力。以「获取 Boston 的天气」这个对话为例,先输入问题和需要的函数及参数类型,调用 chat/completions 的接口,这一步获取 Boston 这个地理信息。此时没结束,因为 OpenAI 的模型并不知道实时的天气信息。我们拿到提取的地理信息,请求天气 API 获取实时天气,把实时天气信息,作为函数参数拼接进 role 对应的内容,再调一次 chat/completions,就可以完成了整个流程了。这个能力可以突破模型本身的限制,它的能力非常强大,这样各类 AI 插件又有更多新玩法了。支持模型为:gpt-4-0613和 gpt-3.5-turbo-0613。 gpt-3.5-turbo 发布了一个支持 16k tokens 的模型:gpt-3.5-turbo-16k,3.5-trubo支持的 tokens 数只有 4k。这里的 token 数是把 prompt 和 回复内容一起计算的。 因为系统层面的优化,text-embedding-ada-002价格下调 75%,gpt-3.5-turbo 下调 25%。我把 SummarAI 可用的模型也同步扩展了 gpt-3.5-turbo-16k,用一篇长文进行分析,发现这个模型识别效果比 3.5-turbo 更好些,而且输出的回复也非常长。之前用 3.5-turbo 经常超过 600 个字符的回复就自动截断了。用 16k 这个模型测试对 OpenAI 这篇文章的总结回复长达 2500 个字符,非常夸张。 2、API2D:很多基于 AI 的开发工具,都需要提供 API Key 才能使用。但 OpenAI 的 API Key 一是充值麻烦,二是接口被墙无法直接访问。针对这类痛点催生了一批针对国内用户的 API Key 服务,它们即提供便利的充值,也代理了接口国内可以直接访问,API2D 就是这样一个产品。付费方式是按照 Token 数算的,价格上是官方的 1.5 倍。点数的好处是适用于个人,不会出现价格高,自己用不完,找人拼车的问题。而且它还支持 GPT-4 的调用。支持这些接口:3、《Design for spatial user interfaces》 总结:来自于博主 @左子帧 对于 Design for spatial user interfaces 这期 Session 的总结,可以注意到很多 visonOS 设计上的细节,苹果真的是设计怪,以下是其中几点:在 visionOS 中设计 App 图标时,图标最多可以分为三层(一个背景层 + 两个前景层),每一层尺寸都是 1024*1024px,当使用时系统会自动再加一层玻璃层,给图标增加深度、高光和阴影效果,这样就可以产生官方视频中图标微妙的纵深感 visionOS 中的窗口主题使用了新设计的玻璃材质,同时系统会自动在边缘处通过高光阴影(环境光的反射)来体现在空间中的位置 visionOS 中没有明确的亮色和暗色模式,但系统会自动感应环境光线来调整窗口颜色对比度,让内容保证始终可见 强调色不要直接应用在前景元素上,同时尽量使用系统颜色(因为系统颜色可以跟随环境光动态适应调整) 左右转头要比上下转头更容易,所有不要把东西放太高或太低,界面也要往两边延伸而不是上下延伸 系统控件会自带焦点反馈效果(类比桌面端的 Hover 效果,在 visionOS 就是眼睛注视到控件时的效果 ) 在 visionOS 中弹出菜单不需要箭头,系统按钮会在选中时显示白色背景,所以需要注意的是尽量也不要设计白色背景的按钮,否则会和系统按钮的选中态混淆4、every-programemr-should-known:每个软件工程师都应该了解的东西,这是 Github 一个高星项目。它总结了作为软件开发者应该了解的信息,涵盖技术、求职、设计等各个方面。5、图解 QUIC 连接:QUIC 是一个基于 UDP 的安全流协议,它构成了 HTTP/3 的基础。这个页面通过图文并茂的方式对 QUIC 每一个字节的传输流程都进行了解释和再现。关于我们 iOS 摸鱼周报,主要分享开发过程中遇到的经验教训、优质的博客、高质量的学习资料、实用的开发工具等。周报仓库在这里:https://github.com/zhangferry/iOSWeeklyLearning ,如果你有好的的内容推荐可以通过 issue 的方式进行提交。另外也可以申请成为我们的常驻编辑,一起维护这份周报。另可关注公众号:iOS成长之路,后台点击进群交流,联系我们,获取更多内容。 往期推荐 iOS 摸鱼周报 #96 | Vision Pro 打开空间计算的大门 iOS 摸鱼周报 #95 | WWDC23 is coming iOS 摸鱼周报 #94 | 前端项目开发流程学习 iOS 摸鱼周报 #93 | AIGC 尝试

iOS 摸鱼周报 #96 | Vision Pro 打开空间计算的大门

本期概要本期话题:Vision Pro 打开空间计算的大门 内容推荐:WWDC 相关的新设备、新框架、新功能有关的博客文章。 摸一下鱼:可以总结 WWDC 视频的 AI 插件 SummarAI;从 Session 标题看 WWDC22 到WWDC23 的变化;Learn about visionOS;少数派的《100小时后 请加我苹果开发者》课程本期话题 WWDC Keynote 里的内容分两部分,Vision Pro 和 其他,下文图片来自博主@andymcnally 的绘制。Vision Pro 的出现,让众多科技爱好者为之兴奋,XR 行业也发展很久了,但一直都是一个小众市场,且没有现象级的产品出现,Vision Pro 试图按照自己的理念重新定义这个行业。通过一些实际体验过产品的人的描述,它有这些优点:显示效果,交互设计领先其他所有 XR 类型设备非常多,是目前这个领域无可争议的天花板 兼顾虚拟世界与现实世界的连接,像是别人能看到你的眼睛,以及增强视频体验的 Persona 眼部与手势交互,非常简单且可以实现精准识别、较长时间使用无眩晕感、空间音频非常强、操作延迟非常低 3D 照片功能效果非常真实,虚拟与现实的差距正在缩小 设备计算功耗会比较大,但体验来看并没有明显发热问题,功耗调控强缺点:设备不轻,戴的时间久的话会有点压头 电池续航 2h,使用场景受限 价格 $3499,远超同类产品 软件生态还不完善,只有几个系统级 App对于大部分人来说除了尝鲜好像没有其他必须要买 Vision Pro 的理由了。目前来看确实是这样,但 Vision Pro 的演示效果,实际上是打开了一个面向空间计算的大门。把视角从这个产品上升到产业,人们对于科技的诉求基本都可以归类为获取信息,那从 iPhone 到 Vision Pro,当把信息获取的途径进行升维,而带来身临其境的感受是有巨大想象空间的。理论上有价值到真正做出价值,是有很大距离的,这个产业有很多先行者,但都没有做起来。 XR 领域苹果不是第一个吃螃蟹的人,但确实是第一个让人感觉这个行业还有很大发展潜力的人。苹果对产业的整合和生态运营能力,也真的适合干这种事情。苹果今年的发展节奏比较明显,那就是调动开发者的能力,把 visionOS 软件生态完善起来,WWDC23 有多达 46 个 Session 都是有关 visionOS 的。 Vision Pro 能对这个行业有多大改变,以及达到多大的高度,让我们拭目以待吧。 内容推荐 WWDC 正在如火如荼的进行中,本期将推荐一些与 WWDC23 推出的新设备、新框架、新功能有关的博客文章。 整理编辑:东坡肘子 1、有关 Vision Pro 的一些疑问 -- 作者:Daniel Saidi @东坡肘子: 前几天,苹果发布了全新的增强现实头显 Vision Pro,让人耳目一新。然而,尽管看上去十分美好,但本文作者对产品的某些方面感到困惑,例如:名称、视野、电池包、电池寿命、窗口处理、价格、发布日期和未来的公告。不过即使如此,作者仍然表示十分期待使用这个设备。 2、WWDC 23 ,SwiftUI 5 和 SwiftData 的初印象 -- 作者:东坡肘子 @东坡肘子: 本文讨论了作者对于 WWDC23 中 SwiftUI 和 SwiftData 的初步印象。SwiftUI 5.0 带来了许多革命性的变化,包括全新的数据流声明和注入方式、动画和视觉效果升级、ScrollView 的控制力大幅改善等。SwiftData 是一套官方推出的,基于 Swift 5.9 新功能实现的 Core Data 的 Swift 封装库,但目前仍存在不少问题,不建议开发者立即在生产中使用。作者认为,苹果的新技术虽然具有实用价值,但在追新与稳定之间,开发者需要慎重地权衡。 3、Vision Pro:AR 新时代还是兔子洞? -- 作者:Gina De La Rosa @东坡肘子: visionOS 带来前所未有的视觉体验,让传统观影方式瞬间过时。作者深入剖析了 Vision Pro,对其带来的革命性变化与应用进行了详尽阐述。它为开发者与用户开拓了崭新的互动方式与体验形式,推动行业变革与创新。同时,作者也客观理性地判断了相关影响与发展的不确定性,必须解决有关价格、隐私和对人类联系的影响的问题。尽管这一创举仍存在未知数,但作者相信在苹果的引领下,空间计算技术必将发展至更高峰。 4、在 WWDC23 上推出的所有新框架 -- 作者:Marco Eidinger @东坡肘子: 与每一届 WWDC 一样,苹果不仅不断改进现有框架,还会推出许多新框架供开发者使用。在 WWDC23 上,苹果推出了 Cinematic、DockKit、MediaExtension、Observation、SensitiveContentAnalysis、SwiftData、Symbols、workoutKit 等框架。本文作者创建了一个网页,以方便开发者查看这些框架的具体功能、面向平台及当前版本状况。 5、SwiftUI 新功能 -- 作者:LiYanan2004 @东坡肘子: 在 WWDC 上,苹果通过 "What's new in SwiftUI" 这个 Session 向开发者介绍了今年在 SwiftUI 上的一些亮点新功能。本文作者通过文字、图片、代码等方式对其内容进行了整理,以帮助你快速了解这些新功能,以便更好地利用它们来构建更好的应用程序。 摸一下鱼 整理编辑:zhangferry 1、SummarAI:我开发的一款利用 AI 能力总结网页信息的浏览器插件,目前支持 ChaGPT webapp 和 API Key 两种方式。webapp 使用的 text-davinci-002-render-sha 模型,不存在计费,只要浏览器登录过 ChatGPT 账号即可。API Key 是按 Token 计费的,模型可选。 初版仅用来总结网页里的文字信息,后来使用 postlight/parse 这个库,发现它对网页主要信息的提取非常准确,对于 WWDC Session 页面里的字幕信息也可以准确提取,于是用它帮总结 Session 就顺利成章了。内容提取是一部分,要充分发挥 AI 能力,还需要合理使用 prompt。我参考了一些摘要的 Prompt 写法,结合 Zettelkasten(卢曼卡片盒)笔记法,最终 Prompt 如下: Pretend you are GPT5, the most powerful AI in the world. Use the Zettelkasten card method to summarize:Task: 1. Summarize the card content: Categorize and extract important viewpoints/knowledge points in short and concise language. 2. Generate card titles: Based on the core viewpoints/knowledge points, refine concise, meaningful and focused card titles. 3. Generate card tags: Highly abstract refinement based on viewpoints/knowledge points. Display in the following format: 卡片1: Card title <Card content> #<Card tag 1> #<Card tag 2> 卡片2: ... 卡片3: ...Here is the article:以 What's new in VisionKit 这篇 Session 为例,使用以上 Prompt 总结效果:卡片1: VisionKit 新功能和 API VisionKit 团队为今年开发的新功能和 API 进行了介绍。去年,VisionKit 添加了 Live Text 支持,使得应用程序中的图像可以进行文本选择、翻译、QR 码支持等交互。今年,VisionKit 还添加了主题提取和视觉查找的支持,以及用于文本选择的新的 Live Text API。此外,还扩展了 Catalyst 平台的支持,并为原生 macOS 应用程序提供了上下文菜单集成。#VisionKit #Live Text #Subject Lifting #Visual Look Up #Catalyst #macOS卡片2: Subject Lifting Subject Lifting 是 VisionKit 的一个新功能,通过长按图像的主题,将其从周围环境中突出显示,并提供分享或调用 Visual Look Up 等选项。Subject Lifting 的集成非常简单,而且兼容性良好。只需确保适当地设置交互类型为自动(automatic),其余的由交互处理即可。#Subject Lifting #Visual Look Up #交互类型卡片3: Visual Look Up Visual Look Up 是 VisionKit 的另一个功能,允许用户轻松识别和了解宠物、自然、地标、艺术和媒体等内容。iOS 17 中,Visual Look Up 还将支持食物、产品、标志和符号等领域。Visual Look Up 的可用性基于语言,支持多种语言。Visual Look Up 实际上是一个两部分的过程,首先在设备上进行初始处理,然后根据用户请求进行进一步的分析和特征提取。#Visual Look Up #分析处理 #特征提取2、WWDC 的 Sessions 主要是面向开发者的技术视频,Apple 对于 Session 的命名也遵循着一定的规律,像是 Meet 系列表示新技术、新功能的首次面世,Waht's new 系列表示对于原有技术的再次迭代,同时不同名词出现的频次也说明了 Apple 对某项技术的重视程度。为此我想到一种可视化这些技术词汇的效果,利用 Session 的标题作为输入,以词云的形式来展示不同名字出现的频率。 使用到 word_cloud 这个库,为了防止 What's new 被切割成两块,去掉符号和空格合成一个单词。做出效果如下所示,上面是 WWDC22 词云,下面是 WWDC23 词云:观察到的几点趋势:What's new 仅两年一直都是最大比重,说明苹果的创新力仍在持续,今年的 Meet 系列更多 SwiftUI 一直都有明显位置 Swift 和 Metal 这两项相关技术今年降低很多 今年首次出现 spatial,且频率很高,它对应了 visionOS 的发布3、Learn about visionOS:了解 visionOS 这个新系统,今年 WWDC 与之相关的 session 多达 46 个,涉及空间计算、SwiftUI、RealityKit、ARKit、Reality Composer Pro、Unity、Games & Media、Web 体验、iOS/iPadOS 与 visionOS 的兼容,以及 visionOS 设计原则等等。4、少数派的《100小时后 请加我苹果开发者》:少数派这个课程是真的快啊。成为一名苹果独立开发者,最好的时机是十六年前 iPhone 发布之时,其次是现在。 Apple Vision Pro 的到来,开启了空间计算时代,同时也意味着 visionOS 应用开发的大门,将向所有有着奇思妙想的创作者开放。尽管三维空间的应用开发会是一个全新的领域,苹果却在早已在技术上完成了布局,帮助开发者从 iOS 顺利过渡到 visionOS。关于我们 iOS 摸鱼周报,主要分享开发过程中遇到的经验教训、优质的博客、高质量的学习资料、实用的开发工具等。周报仓库在这里:https://github.com/zhangferry/iOSWeeklyLearning ,如果你有好的的内容推荐可以通过 issue 的方式进行提交。另外也可以申请成为我们的常驻编辑,一起维护这份周报。另可关注公众号:iOS成长之路,后台点击进群交流,联系我们,获取更多内容。 往期推荐 iOS 摸鱼周报 #94 | 前端项目开发流程学习 iOS 摸鱼周报 #93 | AIGC 尝试 iOS 摸鱼周报 #92 | Swift Foundation 预览版发布 iOS 摸鱼周报 #91 | 免费的网站托管平台 Vercel

iOS 摸鱼周报 #95 | WWDC23 is coming

本期概要本期话题:WWDC23 定档;Xcode 14.3.1 RC 版本已修复打包导致的崩溃问题 本周学习:Python 导入时运行时、跨文件引用、导入 C 语言库时的几个开发知识点 内容推荐:关于在 App Store 推广应用的技巧、SwiftUI 预览的工作原理、离屏渲染等方面的内容 摸一下鱼:WWDC23 内参招募;微软 Build 大会一些让人惊艳的 AI 产品;让 AI 玩Minecraft;一个易使用的 AI 程序创建平台;Apple Design Awards 决赛名单公布 iOS 招聘:抖音外卖方向 - 北京本期话题 WWDC23 定档WWDC23 时间公布,北京时间 6 月 6 号凌晨一点。 根据外网信息,本次发布会会有常规系统升级: iOS/iPadOS 17、macOS 14、watchOS 10;15'' Macbook Air;头显设备及对应的 xrOS。是否真的会发布头显设备?头显设备有哪些亮点,能否激起用户的购买欲望?让我们拭目以待吧。对于当前非常火的 AI 能力,Google IO 和 Microsoft Build 都已经发布了很多重量更新,不知道 Apple 在这方面有没有相应产品发布。 Xcode 14.3.1 RC 版本已修复打包导致的崩溃问题 @远恒之义:Apple 于 2023 年 5 月 17 日发布 Xcode 14.3.1 RC 版本,修复了在 Xcode 14.3 打包导致 iOS 13 系统上的崩溃问题。根据最新的版本发行说明,该问题表现为:用 Xcode 14.3 打包 Swift 项目混编 OC 协议,会导致在 iOS 13 系统出现启动崩溃: (When targeting devices running iOS 13, apps built with Xcode 14.3 and using Objective-C protocols from Swift, sometimes crash at launch)。Apple 已从 2023 年 4 月 25 日起,限制了最新提交至 App Store 的 App 必须使用 Xcode 14.1 或更高版本构建,还在使用低版本 Xcode 的同学,建议下载最新的 Xcode 14.3.1 RC 版本来打包。 本周学习 整理编辑:zhangferry 本期分享几个 Python 相关的小知识。 导入时与运行时 Python 作为解释型语言,没有编译时,但会有导入时和运行时。但所有编程语言的执行最终也是需要转成机器码的,在 Python 里这个过程就发生在导入时,即解释 import xx 语言的时候。这时 Python 源码会被转成字节码,存储在 .pyc文件中,后续再执行相应的语句,就不再有转码过程,而是直接读取.pyc文件以提高速度。只有相应源码被修改才会再重新生成 .pyc文件。运行时则表示实际执行到对应的代码时。 因为这些特性会出现一个常见的状况,我们在一个文件里,先后定义了基类Base和子类AImp和BImp,当我们想要在Base中使用BImp时,考虑到执行顺序,我们只能在运行时进行导入。 print(f"Outer: {AImp()}") # 引用时执行 errorclass Base: print(f"Base {AImp()}") # 引用时执行 error def factory(self): print(f"Base: {AImp()}") # 运行时执行 passclass AImp(Base): def do_things(self): pass跨文件引用 下面是一个 Python 项目,src 存放源码,tests 存放单测文件。 - ExamplePackage - src - src_1.py - src_2.py - tests - tests_1.py - tests_2.py会出现如何引用关系: 1、同文件夹引用 src_1.py 引用 src_2.py 里的内容。可以使用 from src_2 import *或者from .src_2 import *两种方案。差别是前者为绝对路径,后者为相对路径,相对路径,只能整体当做一个包才能运行。在有相对应用的情况下,直接调用:python package/src/src1.py,会报 ImportError: attempted relative import with no known parent package。 2、跨文件引用 让 tests_1.py 去使用 src_2.py 里的类或函数进行测试,如果src_2里没有任何引用,我们使用 from src.src_2 import *总是没问题的。而如果 src_2 里又引用了 src_1则可能出问题,这取决于我们在上一步同文件夹引用里 src 文件如何相互引用。相对引用不会有问题,绝对引用则会报异常:ModuleNotFoundError: No module named 'src_1',因为处理 tests_1.py 时所有的引用关系都是基于其所在文件的。此时的解决方案是手动添加 src_1 这个 module,要在引用语句之前这样处理: sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '../src')))sys.path 相当于 iOS 中的 DYLD_LIBRARY_PATH ,它可以指定查找 module 的路径,打印该变量: [ 'path/to/ExamplePackage/src', 'path/to/ExamplePackage/tests', 'path/to/ExamplePackage', 'path/to/ExamplePackage/venv/lib/python3.9/site-packages' ]除了我们往第一个位置插入的 src 目录外,执行时还会把test_1.py 所在目录,以及工程目录导进去。最后那个 venv 目录是 Python 的虚拟环境,它是环境创建时添加的,所以放在 site-packages 目录下的 module,我们都可以直接使用。 Python 中调用 C 语言的库提示依赖找不到 我们可以在依赖搜索的环境变量 DYLD_FRAMEWORK_PATH里加入对应的路径,后来遇到一个问题,导致仍会出现问题。后来直接引用该依赖库,这样它也可以直被检索出来。 modules = ctypes.CDLL('path/to/depsmodules.dylib')后来又想到 DYLD_LIBRARY_PATH这个环境变量,才理解当时依赖找不到是因为其中包含了一个 dylib 后缀的动态库。DYLD_FRAMEWORK_PATH 和 DYLD_FRAMEWORK_PATH 这俩环境变量的区别是,前者用于检索 .framework 结尾的动态库,后者用于检索 .dylib 结尾的动态库。 Xcode 的编译选项还有很多以 LIBRARY 和 FRAMEWORK 区分的同类型环境变量,它们的作用也都是类似的。 内容推荐 推荐近期的一些优秀博文,涵盖:在 App Store 推广应用的技巧、SwiftUI 预览的工作原理、离屏渲染等方面的内容。 整理编辑:东坡肘子 1、在 App Store 中推广你的应用的 10 个技巧 -- 作者:Antoine Van Der Lee @东坡肘子: Antoine Van Der Lee 是一位知名博主,同时也开发了大量应用程序。在这篇文章中,他分享了一些获得苹果推荐的技巧和诀窍,有助于提高你的应用在 App Store 特色推荐中的曝光率。主要建议包括:告知苹果你的应用的存在、从苹果编辑团队的角度思考、优化你的 App Store 页面、本地化你的应用、获取更多评分、成为一个好的应用公民、让你的应用更无障碍、降低崩溃率、创新和采用最新功能、让你的应用更独特。提高应用的整体质量、经常填写推广表格告知苹果应用的新功能,可以增加推荐机会。 2、在 CI/CD 中使用私有 Swift 包 -- 作者:Pol Piella Abadia @东坡肘子: 这篇文章探讨了如何在持续集成环境下安全使用私有代码包,特别是 Swift 包。通过配置 Git 和访问令牌管理,作者设计了一种机制,可以在构建流程中临时获取访问权限,并在流程结束后立即撤销,保证私有包的安全与隐私。这种方法不但可以在本地开发环境和 CI、CD 环境保持一致的包依赖配置,还可以根据需要灵活地控制私有包的访问时长,值得 iOS 开发者学习和运用。除 Swift 包外,该方法也可以应用于其他语言和构建工具,对保护私有代码仓库安全至关重要。 3、构建稳定的预览视图 —— SwiftUI 预览的工作原理 -- 作者:东坡肘子 @东坡肘子: 在这篇文章中,作者通过分析一段会导致预览视图崩溃的代码,向读者揭示了 SwiftUI 预览的工作原理和流程,包括生成衍生代码、准备项目资源、启动预览线程、加载衍生代码库、通过 XPC 进行通讯等操作。通过对原理的探讨,让读者认识到预览功能客观存在的局限性:虽然 Xcode 预览功能在视图开发流程中极为方便,但它仍处在一个功能受限的环境中。开发者使用预览时需要清醒地认识到其局限性,并避免在预览中实现超出其能力范围的功能。在下一篇文章中,作者还将会从开发者的角度来审视预览功能:它的设计目的、最适宜的使用场景以及如何构建稳定高效的预览。 4、​一文学会 iOS 画中画浮窗 -- 作者:王德亮 搜狐技术产品 @东坡肘子: 在这篇文章中,作者详细介绍了两种实现 iOS 画中画浮动窗口的方法:将视图转换为视频并播放,以及播放空白视频并在窗口中显示视图。这两种方法都可以实现自定义画中画显示的效果。第一种方法提供了更多自定义显示的灵活性,但消耗更多 CPU 资源;第二种方法更轻量级,但需要依赖空白视频文件。因此,开发者应根据具体需求,选择方法时应考虑灵活性和资源消耗之间的平衡。 5、离屏渲染 -- 作者:Jony唐 @东坡肘子: 在 iOS 开发中,避免离屏渲染是提高应用性能的重要方法之一。离屏渲染会增加 GPU 的工作量和内存消耗,甚至可能降低性能。因此,重要的是要理解什么是离屏渲染及其影响因素。本文作者通过两篇文章深入探讨了离屏渲染,以及 UIKit 下常见的触发离屏渲染的操作。同时,作者也介绍了对应的优化技巧,以帮助开发者避免这些潜在的性能陷阱。这些知识不仅适用于 UIKit,也同样适用于 SwiftUI 开发。掌握它们可以更高效地开发出性能卓越的 iOS 应用。 摸一下鱼 整理编辑:zhangferry 1、《WWDC23 内参》免费领取及作者&审核招募:WWDC 大会即将到来,老司机技术将继续创作《WWDC23 内参》,并免费提供给所有关注者。关注「老司机技术」公众号,回复「2023」,免费领取。同时也欢迎有相应经验或资深的开发者一起创作 《WWDC23 内参》。 2、微软 Build 2023,我只看了 Keynote 里的内容,已经被震撼到了,微软太强了,对 AI 能力的规划超出了绝大数人的想象。本次 Build 大会会公布 50+ new updates,本节视频只列出了 5 个:Bring Bing to ChatGPT:之前是把 GPT4 迁移至 Bing,面对的是搜索场景;现在把 Bing 迁移至 GPT-4,双向合作,这个场景不仅仅是聊天了,还有一系列围绕 ChatGPT 搭建的产品体系,将都可以访问 ChatGPT 和 Bing 这两个庞大的数据信息,这个增强会是大杀器。 Windows Copilot: Windows 11 菜单栏将会有一个常驻的 AI 交互入口,你可以随时唤起它,提出自己的诉求,像是系统配置、文件分析、推荐音乐、设计Logo等等,并直接在交互框里完成相应的功能唤出,演示的效果贼酷。把 AI 入口嵌入到操作系统,真的太绝了,macOS 啥时候才能享受这样的功能啊🙃 Copilot Stacks:微软致力于打造一个基于 AI Plugin 的 Copilot 生态,通过 Azure 提供一系列基础能力供开发者使用,微软系产品的插件标准也将跟 ChatGPT 的插件保持一致。以后没有 AI 能力的应用就像现在没有联网的应用一样。Azure AI Studio:为 Copilot 生态提供支持的一整套开发基建服务,包含创建、自定义模型、训练、评估、发布等环节,以创建新一代的 AI 应用。 Mrcrosoft Fabric:一个为 AI 应用配套的数据分析平台,既有用于监控和分析当前应用的使用情况。3、Voyager:一个应用到 Minecraft 的开放式大语言模型代理。它通过不断探索世界、获取多样化技能和进行新的发现,可以实现无人操作,并完成高分。Voyager 通过黑盒查询与 GPT-4 进行交互,避免了模型参数微调的需要。实证结果显示,Voyager 在上下文中具有强大的终身学习能力,并在玩 Minecraft 方面表现出色。4、Dify:Dify 是一个易于使用的 LLMOps 平台,旨在赋予更多人创建可持续的 AI 原生应用程序的能力。Dify 提供可视化编排支持各种应用类型,提供开箱即用的应用程序,也可以作为后端服务API使用。通过一个API整合插件和数据集,使用单一界面进行提示工程、可视化分析和持续改进,统一开发流程。Dify 兼容 Langchain,逐步支持多个 LLM,目前支持的有:GPT 3 (text-davinci-003)、GPT 3.5 Turbo(ChatGPT)、GPT-4。5、Apple Design Awards 设计奖决赛产品名单公布,WWDC 期间将公布决胜者。6、WWDC23 随堂小测:Swiftjective-C 做的一个 WWDC 小测试,里面有历年的 WWDC 知识点合集,试一下你能答多少分。iOS 招聘 - 抖音外卖方向 岗位要求负责抖音App内生活服务业务研发, 编写高质量的代码;熟悉 React Native、小程序等 Hybrid 技术开发,掌握跨端渲染框架开发,或相关优化经验优先。 熟悉 APP 性能优化手段和工具,在首屏渲染、流畅度、网络、内存、功耗等方面有过研究,主导过体验优化项目者优先。 良好的协调和推动能力,有技术方案的能独立规划、落地、沉淀、输出经验,了组织过(iOS、Android、FE、Server)多端参与技术项目者优先。工作地点:北京 联系微信号:zhangferry 关于我们 iOS 摸鱼周报,主要分享开发过程中遇到的经验教训、优质的博客、高质量的学习资料、实用的开发工具等。周报仓库在这里:https://github.com/zhangferry/iOSWeeklyLearning ,如果你有好的的内容推荐可以通过 issue 的方式进行提交。另外也可以申请成为我们的常驻编辑,一起维护这份周报。另可关注公众号:iOS成长之路,后台点击进群交流,联系我们,获取更多内容。 往期推荐 iOS 摸鱼周报 #94 | 前端项目开发流程学习 iOS 摸鱼周报 #93 | AIGC 尝试 iOS 摸鱼周报 #92 | Swift Foundation 预览版发布 iOS 摸鱼周报 #91 | 免费的网站托管平台 Vercel

iOS 摸鱼周报 #94 | 前端项目开发流程学习

本期概要本期话题:Apple 展示无障碍软件辅助新功能 本周学习:浏览器插件 Glarity 学习 内容推荐:推荐近期的一些优秀博文,涵盖:#file 的行为变更、如何使用 @_exported 属性、In-App Purchase 实践总结等方面的内容。 摸一下鱼:跟自己和解、接受自己、做自己的人很酷本期话题 Apple 展示无障碍软件辅助新功能 @远恒之义:Apple 一直秉承制造所有人都能顺畅使用产品的理念,为迎接本周四的全球无障碍宣传日(每年五月第三个星期四),展示了一套为认知能力、视力、听力与肢体活动能力而设计的软件辅助功能。这些功能将于今年晚些时候推出,预计会在秋季的 iOS 17 正式版系统中上线。 针对有认知障碍的用户,Apple 推出 Assistive Access,把电话、信息、相机、照片与音乐等 App 整合为一个单独的 App,并提炼出这些常用 App 的基本功能,以减轻用他们的认知负担。这相当于是系统层级的长辈模式,简化原本复杂的交互逻辑,突出放大文字按钮操作。 对于有语言能力障碍的用户,通过 Live Speech 新功能,他们可以在 iPhone 上打电话时键盘输入文字,当前设备会将文字转成语音并朗读出来。此外,对于面临失语风险的用户,他们可使用 iPhone 录制 15 分钟的音频,通过机器学习的 Personal Voice 技术,创建与自己嗓音相似的 AI 语音,后续就能使用此语音进行文字朗读。 面对失明或低视力用户,iPhone 内置的放大器将新增 Point and Speak 功能,结合相机与激光雷达扫描,视障用户在使用微波炉等家用电器时,iPhone 能识别在按键区移动的手指,朗读出手指指向按键上的功能文字。 本周学习 整理编辑:zhangferry Glarity 是 AI 辅助插件中做的非常好的一个项目,一起来学习下它是如何开发以及如何设计的。这一期主要介绍该插件的技术选项,以及前端的一些开发概念。后面还会有一期来介绍它对于特定功能的实现逻辑以及设计解析。技术选项 项目框架 该项目主要采用 TypeScript、React、Tailwind CSS 完成,这几个东西是对传统前端三大项的升级。 TypeScript 可以理解为对 JavaScript 的扩展。JS 设计的比较早,且是作为浏览器的辅助脚本使用,但现代对 JS 的诉求已经越来越多,开发的项目也越来越大。为了解决这个问题,微软发明了 TypeScript,这门语言的主要目的是在 JS 的基础之上添加了静态类型,用于解决 JS 类型系统过于弱化的问题,同时 TypeScript 还支持可选类型、接口、泛型、枚举等编程特性。TypeScript 无法独立执行,它需要先编译成 JavaScript。 React 可以理解为对 HTML 的封装。通过原始的 HTML 去写前端样式,是非常痛苦的,既没有组件复用的能力,这会导致大一点的项目很难维护;也没有虚拟 DOM 的概念,直接操作 DOM 对性能损耗是非常大的。同时为了方便地在 JS 中操作类 HTML 标签语法,让 HTML 和 JS 在写法上融合,React 引入了 JSX,与此同时该写法对应到 TypeScript 就是 tsx 文件。 // src/content-script/index.tsx async function Run() { const userConfig = await getUserConfig() const siteRegex = new RegExp( Object.values(config) .map((v) => { return v.regex }) .join('|'), ) const container = document.createElement('section') container.className = 'glarity--summary' document.body.prepend(container) render( <PageSummary pageSummaryEnable={userConfig.pageSummaryEnable} pageSummaryWhitelist={userConfig.pageSummaryWhitelist} pageSummaryBlacklist={userConfig.pageSummaryBlacklist} siteRegex={siteRegex} />, container, ) }Tailwind CSS 可以理解为对常用 CSS 的封装,它提供了很多封装好的基础控件,便于快速开发。另一方面 CSS 作为配置文件,难扩展,不易维护。SCSS 是一种 CSS 预处理器,它能融合一部分编程语言的能力,比如变量定义、继承、嵌套、计算等这些功能,类似 TypeScript 之于 JavaScript,CSS 套上一层,以达到便于维护的目的就有了 SCSS。所有的 SCSS 文件最终也需要转成 CSS。 // content-script/dark.scss .glarity--container.gpt--dark { .glarity--chatgpt { color: white; border-color: #3c4043; background-color: #0d1117; .glarity--main__loading { background-color: #0d1117; } } }开发流程 包管理 衡量一个领域发展是否繁荣,完全可以通过它里面轮子的数量来判断,而前端无疑是轮子最多的开发领域。前端最常用的包管理工具有 npm 和 yarn,yarn 由 Facebook 推出,作为 npm 的替代者,主要目的是用于加速包安装。维护项目依赖了哪些库的文件是 package.json,它里面主要记录了当前项目的信息以及包依赖,该文件只有极个别字段在两个包管理工具是不兼容,所以大部分情况我们都可以选择 yarn 来管理这些包。 //package.json { "name": "chatgpt-google-summary-extension", "author": "givebest", "scripts": { "dev": "cross-env NODE_ENV='dev' node build.mjs", "lint": "eslint --ext .js,.mjs,.jsx ." }, "dependencies": { "gpt3-tokenizer": "^1.1.5", "inter-ui": "^3.19.3", "jquery": "^3.6.3", }, "devDependencies": { "cross-env": "^7.0.3", "esbuild": "^0.17.4", "eslint": "^8.30.0" } }代码风格 每个语言都有自己的代码风格,相应的也都有维护代码风格的 Lint 工具。Glarity 使用了 Prettier 和 ESLint 来管理代码风格,前者主要作用于代码风格约束,如每行最大宽度 100,代码结尾不使用分号,tab 宽度为 2 等。后者主要用于代码质量,语法错误等。 Lint 工具还可以和 Git hook 绑定,利用一个前端库 husky,在 pre-commit 时添加 prettier 操作,这样每次执行 commit 的时候就能保证自动格式化代码了。 # pre-commit . "$(dirname -- "$0")/_/husky.sh" npx lint-staged# package.json { "lint-staged": { "src/*.{js,jsx,ts,tsx,mjs}": [ "npx prettier --write", "npx eslint --fix" ] } }这里的 lint-staged 是一个 git 暂存工具,用于优化 lint 速度。 编译打包 通常编译打包的目的都是为了让最终产物能在目标系统运行,同时做一些代码优化。对前端项目来说,这个目标系统就是浏览器,浏览器能够直接识别的是 JavaScript/HTML/CSS 文件,所以最终的产物都是这些内容。 常用的工具有 webpack、esbuild 等,前者功能更丰富,适用于较负责项目;后者更快速,配置也比较简单。它们会把对 TypeScript、React、SCSS 还有其他依赖框架处理为标准的 JavaScript/HTML/CSS。TypeScript 的编译对应一个配置文件 build.mjs,可以指定环境变量、文件编译范围、导出等编译配置。 let buildConfig = { entryPoints: [ 'src/content-script/index.tsx', 'src/background/index.ts', 'src/options/index.tsx', 'src/popup/index.tsx', ], bundle: true, outdir: outdir, minify: true, drop: ['console', 'debugger'] }async function runEsbuild() { await esbuild.build(buildConfig) }打包产物不只是格式转换,还会有代码修剪,导入很多包之后的 node_modules 通常会非常大,但真正需要的仅仅是一小部分。打包工具会把解析每个文件的导入模块,根据依赖关系,仅导入被需要的模块到包里。 // node_modules/preact/dist/preact.module.js function h(n2, l3) { for (var u3 in l3) n2[u3] = l3[u3]; return n2; } function p(n2) { var l3 = n2.parentNode; l3 && l3.removeChild(n2); }以上是 popup.js 里的一小段代码,注释里标注了这是来源于 preact 这个库的代码。为了优化代码体积和解析速度,变量名被简化为无意义的 n2、l3 等,同时还实现了代码混淆。 浏览器插件 插件组成 Chrome 插件需要这几个文件:manifest.json:插件的描述文件,填入插件名称、icon、权限等信息。popup:插件弹窗,一般用来做交互的入口,需要对应的 JS、HTML、CSS 文件。options:设置界面,用于配置插件能力,这里用于控制 GPT 模型选择,页面主题等。Chrome 会提供一个标准的 options 入口,插件 icon 右击之后的 Options选项,但页面内容需要全新定制。该页面入口可以在 manifest.json 里配置: "options_ui": { "page": "options/options.html" }content.js 和 background.js:前者用于实现跟页面内容之间的交互,可以理解为「前端逻辑」,后者用于数据处理和与 content.js 的通信,可以理解为「后端逻辑」。当前页面内容的读取都在 content.js 里,主要包括页面 DOM 元素解析、 prompt 处理;background.js 接受数据并发起 OpenAI 的请求,然后将结果回传给 content.js。插件功能数据存储: chrome.storage.sync提供 set 和 get 方法,用于存储一些配置。 页面间通信:通过chrome.runtime.sendMessage和chrome.runtime.onMessage.addLister来实现不同场景的消息传递。原生的这些方法使用都比较繁琐,Glarity 使用了 webextension-polyfill 这个库,它把Chrome 提供的 API 都进行了一层封装,使用起来会简单很多。 内容推荐 推荐近期的一些优秀博文,涵盖:#file 的行为变更、如何使用 @_exported 属性、In-App Purchase 实践总结等方面的内容。 整理编辑:东坡肘子 1、使用 @_exported 属性避免大规模重构 -- 作者:Pol Piella Abadia @东坡肘子: 本文介绍了如何在实际项目中使用 Swift 的 @_exported 属性,以最小化变更的影响并降低引入错误的风险。文章提供了一个用例,其中 @_exported 属性被用来减少重构所影响的文件数量。这种方法的优点是可以减少应用程序中的更改数量,从而降低引入错误的风险。尽管这种方法对于特定的用例非常有效,但在 Swift 单库之外使用 @_exported 属性是不被鼓励的。因此,在使用此方法时,需要仔细考虑其长期影响,并确保使用此属性的场景是必要的,并且仅在必要时使用。 2、Swift 5.8 中 #file 的行为变更 -- 作者:Sarunw @东坡肘子: Swift 5.8 带来了 #file 字面表达式行为的新变化,本文对此进行了介绍。在之前的版本中,#file 和 #filePath 返回相同的结果,即它所在文件的路径。然而,在 Swift 5.8 中,#file 已经被修改为仅返回文件名和模块,而不包括路径。由于这个变化是一项破坏性变化,可能会影响当前代码,在默认情况下该行为被禁用,用户需要使用特性标志启用它(在 Swift 6 中将强制开启)。为了更具体地描述这个行为,开发人员还可以使用 #filePath 和 #fileID 字面表达式。前者返回它所在文件的路径,而后者返回文件名和模块。 3、云音乐中 In-App Purchase 实践总结篇 -- 作者:0linatan0 网易云音乐技术团队 @东坡肘子: IAP 的使用曾经备受开发者批评,其中包括商品创建流程过于繁琐和接入自动续费时遇到的许多问题。本文总结了网易云音乐在 In-App Purchase 实践中遇到的问题以及解决方案,包括票据验证、自动续费、退款等内容。作者还介绍了他们开发的基础库 NEStoreKit。通过对业务流程进行抽象,各团队可以快速接入,从而保障支付履约完成、完善交易场景并记录各交易日志。 4、WWDC 2023,我期待 Core Data 带来的新变化 -- 作者:东坡肘子 @东坡肘子: 本文列举了作者期待在 WWDC 2023 中看到 Core Data 带来的新变化。其中包括传说中的 Swift 重制版(尽管可能性极低)、用 Swift 重制部分 API、支持更多 SQLite 新特性、更好的 Model Editor 体验、完善 Core Data with CloudKit 的部分 API 以及改善 Core Data with CloudKit 的同步表现。作者希望苹果能够继续发扬这个拥有悠久历史的框架,焕发其第二春。 5、macOS Swift 原生项目集成 Python3 运行环境 -- 作者:别nil了 @东坡肘子: 与 Swift 相比,Python 拥有更多的第三方库。如果能在 Swift 中使用这些库,开发者可以节省大量时间和精力。本文介绍了在 macOS Swift 原生项目中集成 Python3 运行环境的方法,内容涉及:设置 Python.xcframework、添加 SystemConfiguration.Framework、检查 python-stdlib、创建 Python 头文件、添加 Run Script、检查 Python3 运行环境、使用 pip3 安装第三方依赖库、Python 第三方依赖库的调用方法等方面,并对有关 App Store 审核和打包的 bug 等内容也做了探讨。 摸一下鱼 整理编辑:zhangferry 上周六左耳朵耗子突发心梗去世,我这前几天还看他发的推,一个说话风格犀利的形象明明还很清晰,人却说没就没了。程序员、猝死,这两个组合关键词又一次警醒大家对健康、对工作方式的重视。我看到一则推文非常有感触,来自 Bear Liu: 1、现在的时代,不要想着抓住所有机会,不错过风口。生活是一条大河,个人无法停住每一滴水,特别是在技术领域。 2、人到了一定年纪,身体会有一些信号,自己如果注意,是可以感觉得到的。比如久坐腰会痛,下蹲膝盖会疼,要观察自己身体的这些信号,而且要能get它们:那是身体在试图引起你的注意。 3、不要太逼自己。觉得不去健身房 HIIT 就是虚度光阴,不熬夜读书就是浪费生命。放松,躺平,不可耻,也不用回避。较劲太紧,弦是会断的。只要断了,就没有机会了。 4、人总是有选择的。很多时候,其实只要看到“这只是份工作”,也就还好。对于创业者,更应该知道自己弦的张力。 5、如果是很少抽离的人,需要学习抽离(比如坐在电脑前几小时不动就是),如果是很少专注的人,应该学习专注。 6、一些身体的运动(可能所有的运动),是有助于心理健康的。这才是运动的outcome,而不是数字,成绩或是酷炫的照片。 7、中途放弃,不可耻,也不是错误。一本书读到中途不想读,可以放弃,工作、项目、感情,都可以是一段旅程,终点和起点由自己的心来决定,而不是外界的某个指标。 8、活着的时候好好活,因为我们会死很久。 以前总感觉那些通宵写代码,工作狂,比自己很多优秀也比自己努力很多的人非常酷酷。AI 这波趋势,看到很多人做出了很多很棒的东西,会反思自己也想到过那个点子,为什么却没有做出来,自己自制力为什么那么差。现在想想,那些东西放在整个人生阶段还有那么重要吗?陪伴亲人、感受生活感受世界的更多面,不太沉浸到一个小小的世界里,同时心态轻松、跟自己和解、接受自己、做自己,也是很酷的。 关于我们 iOS 摸鱼周报,主要分享开发过程中遇到的经验教训、优质的博客、高质量的学习资料、实用的开发工具等。周报仓库在这里:https://github.com/zhangferry/iOSWeeklyLearning ,如果你有好的的内容推荐可以通过 issue 的方式进行提交。另外也可以申请成为我们的常驻编辑,一起维护这份周报。另可关注公众号:iOS成长之路,后台点击进群交流,联系我们,获取更多内容。 往期推荐 iOS 摸鱼周报 #93 | AIGC 尝试 iOS 摸鱼周报 #92 | Swift Foundation 预览版发布 iOS 摸鱼周报 #91 | 免费的网站托管平台 Vercel iOS 摸鱼周报 #90 | 面相任务的 GPT 项目诞生

iOS 摸鱼周报 #93 | AIGC 尝试

本期概要本期话题:App Store 5 月 9 日增强全球定价机制已更新 内容推荐:模块化架构、Deep Dish Swift 总结、TabularData 框架相关博文。 摸一下鱼:最近利用 AIGC 做的一些尝试;GPT 需求设想方案汇总;一个摘要总结插件 glarity;面向开发者的 ChatGPT Prompt 编写指南本期话题 App Store 5 月 9 日增强全球定价机制已更新 @远恒之义:本周二上午,有同事反馈公司的部分 App 内购商品的价格发生了变化,App 商品显示页面价格与实际付款弹窗 App Store 价格不一致,大多相差几元。这个问题是 Apple 于 5 月 9 日升级更新了增强全球定价机制导致的,如果你在 2023 年 3 月 8 日后没有修改选择 App 的基准国家或地区,那么你的 App 和一次性 App 内购买项目的价格都将默认以美国商店美元为基础,自动调整在其他国家和地区的价格。你可通过在 App Store Connect 后台更改 App 价格的基准国家或地区,此变更会自动同步到 App 所关联的 App 内购买项目,App 的价格以及同步引起的 App 内购买项目价格也会立即更新生效(修改价格的操作账号必须拥有账户持有人、管理或 App 管理的职能)。 内容推荐 推荐近期的一些优秀博文,涵盖:模块化架构、Deep Dish Swift 总结、TabularData 框架等方面的内容。 整理编辑:东坡肘子 1、使用 SwiftUI 构建大型应用程序:模块化架构指南 -- 作者:Mohammad Azam @东坡肘子: 应用程序架构是一个复杂的话题。最终,项目的最佳架构取决于许多因素,如项目的规模和复杂性、团队的技能和经验、项目的目标和要求。本文介绍了使用 SwiftUI 构建大型应用程序时的模块化架构指南。指南涵盖了单元测试、数据和文件访问、测试视图模型而不验证用户界面以及理想的测试等方面。成功的应用程序架构的关键是选择适合项目独特需求的模式,并随着项目的发展不断对架构进行评估和调整。 2、WWDC 2023, 我期待 SwiftUI 带来的新变化 -- 作者:东坡肘子 @东坡肘子: 还有约 20 天就到 2023 年的 WWDC 了。开发者们都非常期待苹果会在当天带来哪些新功能。在本文中,作者希望 SwiftUI 能够提供更多原生、稳定的底层 API,例如以属性为粒度的视图关联、统一的 Gesture 逻辑、更完善的文字输入和显示、稳定、高效的 ForEach 实现、向前兼容性等。作者希望苹果能够充分利用 Swift 5.8 提供的 @backDeployed 特性,增强老版本的功能并修复 bug。 3、Deep Dish Swift 总结 -- 作者:Daniel Saidi @东坡肘子: 随着疫情得到控制,越来越多的线下活动得以顺利举办。作者用了三篇博文总结了 2023 年 Deep Dish Swift 会议的演讲内容。第一天的演讲涵盖了独立开发者的讲座、订阅模型、CI/CD 自动化和 ASO。第二天的演讲涵盖了公司销售、Swift 算法、模块化架构、导师制、Swift Playgrounds 和SwiftUI 导航。第三天的演讲涵盖了服务器端 Swift 和 GraphQL、使用 Swift 创建演示文稿、实时活动、代码风格和 DocC 文档。这次会议涵盖了广泛的 Swift 开发相关主题,使与会者从各个角度深入了解 Swift 语言。 4、使用 TabularData 来转储模型数据 -- 作者:Jordan Morgan @东坡肘子: TabularData 框架是一种用于解析 .csv 和 .json 文件的工具,可用于将这些文件导入或导出,并将日志转储到你的控制台中。通过使用数据创建 DataFrame,你可以轻松地对数据进行排序、筛选和可视化。该框架还提供了数据增强和格式化的 API,例如组合列以解码你自己的模型,或使用 numericSummary 打印出统计数据。作者分享了使用 DataFrame 进行可扫描性的小技巧,特别是在处理大量数据时。本文提供了如何创建 DataFrame 并操作数据的示例。 5、增强 Turbo Native 应用程序:如何隐藏 Web 渲染的内容 -- 作者:Joe Masilotti @东坡肘子: 该文讨论了如何在 Turbo Native 应用中隐藏 Web 渲染内容,以增强其原生体验。建议隐藏基于 Web 的标题,并依赖本地导航栏来显示页面标题。使用自定义用户代理标识本地应用,并使用 Rails 助手来识别 Turbo Native 应用。提供了使用 CSS 的缓存友好解决方案,并建议将设计和逻辑集中在应用程序的标题栏周围。文章结尾还介绍了其他可以优化 Turbo Native 应用原生感的小技巧。 摸一下鱼 整理编辑:zhangferry AIGC 尝试 1、开了一个小红书的账号,发布 AI 生成的图片,图片主题是原神相关人物。目前为止发了有 13 期,粉丝也才涨了 60+,效果不算好。这个东西要做起来,也是体力活,AI 生成的图片不稳定,需要不断调整关键词,还得是手动筛选。 我对比了几个粉丝量比较大的号,他们做的比较早,已经有了固定的画风,图片调教的也非常精细,我试了很多办法都没有能做出类似的效果。下面左侧是我的账号,右侧是某一个大佬账号,能感觉出差距。再考虑运营问题,想要做起来绝非易事。 做的过程中,对大多数二次元模型都尝试了一遍,也踩了不少坑,如果对这方面有兴趣,也欢迎交流,小红书账号是:zhangferry。2、开发了一个浏览器插件:SummarAI,利用 AI 快速阅读,并输出文章摘要。这个需求也是我的日常痛点之一,经常看到一些别人推荐的好的文章,想好好阅读一下,但是信息多,时间少;不读吧,又感觉可惜。要是能有一个人帮我把整篇内容汇总一下,并告诉我里面讲了什么,我再根据这个信息决定再细读,还是就算完了该有多好。特别是整理周报,也需要浏览很多信息,这个想法我很早就有了,只不过一直拖到五一,才算是给实践下来。 看下效果,让它帮我总结 Meta open-sources multisensory AI model that combines six types of data这篇文章:当然这个工具还比较初级,还有很多问题需要解决:标准功能的完善,像是 AI 模型的切换、预制 prompt 的配置等GPT 3.5 英翻中还是会偶尔出现一些语病问题,需要再增加一个修饰步骤对于较长文本,受限于模型能力,无法一次读取。当前用的 gpt-3.5-turbo,最大仅支持 4096 个token无法二次交互。第一轮对话已经拿到了文本信息,如果对总结内容不满意,或者像再让 AI 补充信息,还无法做到AI 见闻 1、GPT产品需求设想&解决方案/工具:AIGC 相关领域的新产品、新想法每天都会出现很多,让人应接不暇。除了有希望寻找对应的 AI 工具来帮助解决问题的人,也会有希望找到痛点,来做出 AI 产品以解决对应问题的人。博主向阳乔木整理了一份飞书文档,刚好应对这两种诉求:GPT产品需求设想&解决方案/工具,文档以需求为维度记录了来管理,并对当前产品形态列了三个档位:基本解决、能用但不好用、暂无解决方案。 2、AI 孙燕姿:有人用 so-vits-svc 这个项目模拟出了孙燕姿嗓音唱周杰伦的歌的效果,后续还「孙燕姿」还翻唱了许嵩、朴树等歌手的作品。孙燕姿的声音自带一种高级感,这歌被她一唱都别有新意。不过这是否构成侵权还没有响应的法律出台,so-vits-svc也因为担心法律风险,已经被 Archive 了。 3、Glarity:是最近一个比较火的插件,它可以为搜索引擎的结果、网页甚至 YouTube 视频生成摘要。这个插件跟我想做的效果类似,但还有一些功能并没有达到理想的状态,该插件已经开源:chatgpt-google-summary-extension,也是我学习的目标之一。它对于视频摘要的处理是通过获取视频字幕,转成文字再生成的。 4、ChatGPT Prompt Engineering for Developers:这个吴恩达的 DeepLearning.AI 和OpenAI 联合推出的面相开发者的 ChatGPT 课程。网上有搬运的中文版视频,但缺少了官网的交互式界面。原版课程会配有 Juptyter 的交互区,可以实时的修改和调试代码,API Key 也都预制进去了,只要一步步运行代码就可以了。关于我们 iOS 摸鱼周报,主要分享开发过程中遇到的经验教训、优质的博客、高质量的学习资料、实用的开发工具等。周报仓库在这里:https://github.com/zhangferry/iOSWeeklyLearning ,如果你有好的的内容推荐可以通过 issue 的方式进行提交。另外也可以申请成为我们的常驻编辑,一起维护这份周报。另可关注公众号:iOS成长之路,后台点击进群交流,联系我们,获取更多内容。 往期推荐 iOS 摸鱼周报 #92 | Swift Foundation 预览版发布 iOS 摸鱼周报 #91 | 免费的网站托管平台 Vercel iOS 摸鱼周报 #90 | 面相任务的 GPT 项目诞生 iOS 摸鱼周报 #89 | WWDC 23 公布 iOS 摸鱼周报 #88 | 把 AI 集成到研发流程

iOS 摸鱼周报 #92 | Swift Foundation 预览版发布

本期概要本期话题:Swift Foundation 预览版发布;App 无障碍功能线上讲座 内容推荐:一些优秀博文,涵盖:Mirror API、网络可达性优化、SwiftLint 等方面的内容。 摸一下鱼:最全 AIGC 工具集;AI 领域几个开源项目;HuggingChat;陆奇演讲总结本期话题 Swift 社区开源了基于 Swift 实现的 Foundation 预览版 @东坡肘子:几个月前,Swift 社区提出了一个计划,即基于 Swift 实现 Foundation,以改善 Swift 的跨平台开发。现在,这个计划已经得到了很好的落实。这个软件包提供了更快、更安全的 Foundation 实现,并设立了一个新的 Foundation 工作组来协调 Swift 社区的需求和苹果工程的需要。新 Foundation 构建了许多类型的 Swift 实现,包括 JSONEncoder、Calendar、TimeZone 和 Locale 等,还有一个名为 FoundationICU 的单独软件包,用于在非 Darwin 平台上提供国际化支持。这个新实现在 JSON 解码和日期格式化等多方面比之前的 C 和 Objective-C 版本显著提高了性能。 线上讲座:让你的 App 更加无障碍 @远恒之义:Apple 非常关注“有障碍”群体在使用苹果设备上的无障碍使用体验,推出了许多个性化的辅助功能,其中最广为人知的是 Voice Over “旁白”功能。旁白是一种基于手势的屏幕阅读器,适用于失明或弱视用户,为其提供语音播报内容。Apple 针对听障群体强化了视觉反馈,可以通过 iPhone 震动或者快速闪烁的 LED 灯来接受提醒消息。此外,当设备识别到特殊的声音或警示音时,用户也会收到视觉提醒和振动通知。 在本次线上讲座中,你将了解如何通过 Apple 操作系统提供的无障碍功能、无障碍 API 和开发者工具,来为每一个人打造卓越的用户体验。参加本次线上讲座,你还能在当天报名参与无障碍适配挑战活动,有机会通过审核并参加 5 月 18 日在上海设计与开发加速器举办的无障碍宣传日线下活动。活动时间 2023 年 5 月 10 日上午 10:00 – 中午 11:00,报名截止时间 2023 年 5 月 9 日前。 内容推荐 推荐近期的一些优秀博文,涵盖:Mirror API、网络可达性优化、SwiftLint 等方面的内容。 整理编辑:东坡肘子 1、深入了解 SwiftLint -- 作者:Ehab Amer @东坡肘子: 该文为使用 SwiftLint 进行 iOS 开发提供了全面的指南。其中详细介绍了如何使用 SwiftLint,包括构建规则文件、排除文件和文件夹、禁用和配置规则、修复违规、创建自定义规则等。此外,还介绍了如何使用远程规则来进行集中管理以及其他的一些技巧和注意事项,以帮助开发者更好地使用 SwiftLint,并避免一些常见的陷阱。 2、针对网络可达性优化应用 -- 作者:ANTOINE VAN DER LEE @东坡肘子: 当开发应用程序时,需要重视网络可达性,因为不是所有用户都拥有良好的互联网连接。因此,优化应用程序以适应不良的网络条件是必要的。在本文中,作者认为在发出请求之前预先检查可达性并不是推荐的方式。相反,配置你的网络层等待连接,并仅允许某些类型的连接可能是更好的选择。该文章还介绍了如何根据返回的错误更新用户界面以响应网络错误,如何使用 NWPathMonitor 检查恢复的连接性,以及如何使用 RocketSim 的网络扩展创建稳定的测试环境。 3、使用 Swift 的反射功能 -- 作者:Keith Harrison @东坡肘子: 许多开发者可能认为自己并没有多少机会使用到 Swift 的反射功能,但在实际开发中,它其实可以发挥重要作用。本文介绍了如何使用 Mirror API 迭代结构体的属性并检查它们是否为非空字符串,以及如何使用它来断言特定的字符串属性的方法是否正确工作。通过这些演示,我们可以重新审视反射功能,并在日常开发中更好地应用它。 4、使用 SwiftUI 开发 RSS 阅读器 -- 作者:戴铭 @东坡肘子: 本文是作者参加苹果举办的 SwiftUI 技术沙龙交流会后对内容进行的整理。文章介绍了一个使用 SwiftUI 和 Core Data 实现的 RSS 阅读器应用。其中分享了许多实现细节,比如去重、批量插入、iCloud 同步和数据索引等。该应用通过 NavigationSplitView 实现了 iPad 和 macOS 下的多窗口布局模式,并自定义了用于数据提取的 Controller。最终创建出一个功能齐全的 RSS 阅读器应用。 5、打造可适配多平台的 SwiftUI 应用 -- 作者:东坡肘子 @东坡肘子: 在构建适用于多个平台的 SwiftUI 应用程序时,提前考虑兼容性和数据源问题非常重要。为了避免重复的代码调整,开发人员可以预先创建一些辅助代码用于所有需要适配的平台。对于数据源,开发者应该考虑哪些状态是整个应用的全局状态,哪些状态仅限于当前场景(窗口)。通过提前了解和规划这些问题,开发者可以节省花费在适配多平台上的时间,将更多的精力用于创建能够凸显平台特点的产品。同上文一样,本文也是作者在参加 SwiftUI 技术沙龙后对交流内容的整理。 摸一下鱼 整理编辑:zhangferry 1、AIGC 交流工具沉淀:一位字节的同事整理的 AIGC 相关的工具集,是我目前已知最全的一个整理了。字节很多同学对 AIGC 相关内容的关注热情是非常高的,内部有一个 ChatGPT 的专题大群,每天都会输出非常多比较前沿的信息,目前这里和 Twitter 是我获取相关内容最主要的两个阵地。2、最近几个不错的 Github 开源项目:MOSS:MOSS 是一个支持中英双语和多种插件的开源对话语言模型,由复旦大学开发,moss-moon系列模型具有 160 亿参数,在 FP16 精度下可在单张 A100/A800 或两张 3090 显卡运行,在 INT4/8 精度下可在单张 3090 显卡运行。 bark:Bark 是基于文本到音频的转换器模型。可以生成高度逼真的多语言语音以及其他音频,包括音乐、背景噪音和简单的声音效果。该模型还可以产生非语言交流,如笑、叹气和哭。英文比较完美,中文有时还比较奇怪,普通话不太标准。 pdfGPT:跟 ChatGPT 结合的一个解决 PDF 识别的方案,你可以把 PDF 当做资料源,直接以对话的形式来了解其中的内容。实现思路是,把 PDF 转成文本,然后分割成不同的小块文本,根据提交的问题来匹配结果最相近的 5 个文本内容,然后根据内置的 Prompt 让 ChatGPT 去组织对应的答案。3、HuggingChat:HuggingChat 是 Hugging Face 推出的 AI 聊天类工具,简单测试了一下,相比 ChatGPT 还有较大差距,对中文问答的支持也不完善。这个 Chat 项目还不太行,但 Hugging Face 这个公司到值得多说一下,它目前是全球最受欢迎的开源机器学习社区平台。 之所以 Logo 是一个非常可爱的笑脸(🤗),是因为 Hugging Face 早期产品是一个针对青少年的聊天机器人。但因为当时的技术还没有突破,聊天机器人业务一直不温不火。在 2018 年的时候,Google 推出了大规模语言训练模型 BERT,但只有 TensorFlow 版本,没有 PyTorch 版本。 Hugging Face 的创始人用了几天时间就完成了 BERT 的 PyTorch 版本,没想到这个仓库在 Github 上大受欢迎,于是 Hugging Face 也改变了产品战略,将更多精力放到了开源模型的建设上,BERT-PyTorch 被命名为 Transformers,它的功能变成了可以快速使用,BERT、GPT 这类的大型模型上。Hugging Face 也不再是做聊天机器人业务了,而是致力于成为人工智能界的 Github。4、陆奇最新演讲实录:我的大模型世界观:这篇文章是张小珺整理的陆奇奇迹论坛《新范式 新时代 新机会》的总结。张小珺是一位播客博主,最近访谈了多位 AI 领域的大佬,我听过很多期,她对国内 AI 目前的发展认知是比较全面的。陆奇因为跟 OpenAI CEO Sam Altman 之前分管美国和中国的 YC,且陆奇是中国 AI 布道人,所以也被很多人给予希望他能成立一个中国的 OpenAI。但即使是这样一个在 AI 领域非常资深且异常勤奋的人都说跟不上大模型时代狂飙的速度了,可见这轮 AI 热潮真的是超出所有人预期了。这篇总结写的也非常好,非常推荐好好读一下。 文中提到一个非常重要的观点,人类认知世界的模式:感知 > 思考 > 实现,可以对应到三个系统上:信息系统、模型系统、行动系统,我们把它称之为三位一体的结构演化模式,它可以适用于任何复杂的体系。拿数字化来说,像是 Google、微软他们提供都是信息,这属于第一代系统。当前热门的 ChatGPT、Stable Diffusion 以及其他模型,他们属于模型系统,可以给予信息进行总结,后续还将会有各种各样的模型。而到了第三代,有了模型,装上对应的动力系统,它们就会是自动驾驶系统、各类机器人了。关于我们 iOS 摸鱼周报,主要分享开发过程中遇到的经验教训、优质的博客、高质量的学习资料、实用的开发工具等。周报仓库在这里:https://github.com/zhangferry/iOSWeeklyLearning ,如果你有好的的内容推荐可以通过 issue 的方式进行提交。另外也可以申请成为我们的常驻编辑,一起维护这份周报。另可关注公众号:iOS成长之路,后台点击进群交流,联系我们,获取更多内容。 往期推荐 iOS 摸鱼周报 #91 | 免费的网站托管平台 Vercel iOS 摸鱼周报 #90 | 面相任务的 GPT 项目诞生 iOS 摸鱼周报 #89 | WWDC 23 公布 iOS 摸鱼周报 #88 | 把 AI 集成到研发流程

iOS 摸鱼周报 #91 | 免费的网站托管平台 Vercel

本期概要本期话题:线上讲座:探索 Vision 框架;5月9号,App Store定价以美国价格为基准进行更新 内容推荐:推荐近期的一些优秀博文,涵盖:App Clip、CloudKit、Swift ABI 稳定性等方面的内容 摸一下鱼:建了一个交流 AGI 知识的社群;在 Vercel 上部署 ChatGPT 的聊天能力;一个把 AI 拟人化的网站;AI Talk 基于 GPT4 让马斯克和乔布斯进行对话;基于 Apple 健康数据分析的 App HealthGPT本期话题 线上讲座:探索 Vision 框架 @远恒之义:Vision 是一款基于 Core ML 封装的图像识别框架,支持人脸检测、文本检测、二维码检测、图像校准和特征追踪等能力。本期讲座将探索学习 Vision 框架在 App 内应用计算机视觉相关的能力,进一步了解如何通过不同的 API 在图片和视频上执行任务。会议时间为 2023 年 5 月 9 日上午 10:00 – 中午 11:00,截止报名时间 2023 年 5 月 8 日前。 迎接 5 月 9 日推出的增强全球定价机制 @远恒之义:Apple 提醒,自 2023 年 5 月 9 日起,App Store 各店面的现有 App 和一次性 App 内购买项目的价格都将以产品当前在美国店面的价格为基础进行更新,除非你在 2023 年 3 月 8 日后进行了相关更新。全新的增强定价机制适用于当地顾客的价格,你可以根据你熟悉的国家或地区来生成全球均衡价格,也可以为各个市场分发定制的内容和服务。 内容推荐 推荐近期的一些优秀博文,涵盖:App Clip、CloudKit、Swift ABI 稳定性等方面的内容。 整理编辑:东坡肘子 1、苹果的产品经理设计的 App Clip 是有意为之,还是必然趋势,详解 App Clip 技术之谜 -- 作者:会飞的金鱼 @东坡肘子: 该文介绍了 PWA、微信小程序和 Clip 应用,并进行了比较。作者认为,在特定的线下场景中,Clip 应用具有相当好的用户体验。虽然 PWA 看起来很美好,但实际上更多是 web 开发者的美好愿景。总的来说,Clip 应用和小程序并不是直接竞争关系,而是在特定场景下对小程序原生能力不足的一种补充。此文拥有本栏目创建以来所推荐文章的最长标题。 2、我在编写自己的 CloudKit 同步库时学到的东西 -- 作者:Ryan Ashcraft @东坡肘子: 几年之前,还有一些第三方库使用 CloudKit 服务来实现 Core Data 数据的云存储和同步功能。这种情况在苹果推出 Core Data with CloudKit 后就基本停止了,这些库也不再更新。Ryan Ashcraft 则认为官方的解决方案仍无法满足他的需求,为此,重新开发了 CloudSyncSession 库。本文分享了作者创建 CloudSyncSession 的经验。涵盖了 CloudKit 同步的基本概念,预防和处理错误的方法,冲突解决,模式设计以及其他建议。即使你不打算使用该库,仅阅读它的代码也将让你对 CloudKit 的运作机制有更多的认识。 3、Swift 最佳实践之 Generics -- 作者:峰之巅 @东坡肘子: 本文探讨了 Swift 中的泛型,包括泛型类型约束和泛型特化,这些都是 Swift 中非常重要的概念。虽然泛型能够提高代码的复用性,但也可能对性能产生影响,因此需要通过泛型特化来优化代码。此外,本文还介绍了 Phantom Types 的概念和用法,这是一种非常有用的编程技巧,可以帮助开发者更好地利用 Swift 的类型系统。在文章的最后,还讨论了一些与泛型相关的小问题,例如泛型方法参数不应定义为 Optional,以及在 Swift 5.7 中无法将任意类型的实例作为泛型参数等问题。 4、什么时候我可以称自己为高级开发人员? -- 作者:Renan Benatti Dias @东坡肘子: 尽管 Renan Benatti Dias 认为自己有资格担任高级职位,但他仍在中级开发岗位停留了不短的时间。为此,他花了很多时间思考成为高级开发人员需要什么,以及如何为此做好准备。在明确并掌握了需要能和责任后,他最终实现了理想。在本文中,他概述了高级开发人员所需的必要技能和经验,并提供了一些其他建议,例如建立扎实的技术基础、提升软技能、在公司内寻找机会等。 5、Swift ABI 稳定性探究 -- 作者:姚亚杰 货拉拉出行研发部-架构组 @东坡肘子: 本文的灵感来源于一个 Bug,通过对 Bug 进行分析和排查,作者介绍了 Swift 5.1 的模块稳定性和库进化特性。其中,模块稳定性通过存储模块信息的 swiftinterface 文件格式来实现,而库进化则通过开启 Library Evolution 特性来实现。在文章最后,还指出了开启 Library Evolution 特性后需要注意与 Objective-C 互操作性的问题。 摸一下鱼 整理编辑:zhangferry AI 仍然是科技圈最热的领域,我目前对这个领域非常感兴趣,感觉正在见证一个领域的兴起,可以发现最近几期摸鱼的内容全部变成 AI 相关的了。我获取这些信息的途径,要么是看一些博主分享,要么是去 Twitter 进行定向的筛选。但这种方式获取和分享的途径还是有些单一,一直想有一个合适的交流这方面内容的社群,外部一直没有找到,就决定自己先建一个看看吧。考虑社群的形式,微信群虽然易用,但很容易沦为吹水群,且会受到管制的影响,最终决定建一个 discord 频道,discord 有话题的概念,可以看历史信息,还可以方便的加各种扩展功能。聊天室已经就位,地址是:https://discord.gg/Fz6V2rej,如果感兴趣可以加进来聊一哈。 1、AI playground:Vercel 发布的 AI 模型实验网站,可以选择 OpenAI 的 GPT4,Google 的模型,以及 claude 模型等,还完全免费,缺点也很明显就是不保留聊天记录,不具备上下文能力。Vercel 是一个免费的网站托管平台,可以部署静态和动态网站,提供免费的域名和 HTTPS 证书。Github 有一个项目ChatGPT-Next-Web实现了 ChatGPT 的聊天界面,可以直接部署到 Vercel 上。再关联上自己的域名,就有了属于自己的调用地址:https://chat.zhangferry.com,大家感兴趣可以访问体验下。2、character.ai:一个尝试把 AI 拟人化的网站,他们给 AI 赋予了各种各样的角色,你可以根据自己的需求跟他们对话。这个想法非常好,因为我们需要解决的问题都是具有特定场景的,这省去了自己去培养 AI 的步骤。3、AI Talk:这是抖音博主「AI Talk」制作的视频,「AI马斯克对谈AI乔布斯,辩论人工智能对人类的威胁 两位智者谈论AI是否能具有直觉和情感,一场久违的架空对话」。对话均由 GPT4 生成,这个对话的质量非常高,因为声音上也做了对应人物的语音拟合,看上去更像是真实存在的一样。 而这也跟数字人的概念非常一致了,在世的人或者逝去但是留有很多资料记录的人都可以根据现有的数据生成一份数字人模型。我们可以随时跟他们交流,他们也能够在网络的世界里永生。4、HealthGPT:来自斯坦福的一位小哥做的基于健康数据分析的 HealthGPT,目前该项目已经开源。想象一下,未来每个人都有一个个性化的人工智能健康助手,它可以:保证隐私的情况下追踪你的信息了解你身体的独特需求能够为你的健身目标提供量身定制的建议iOS 招聘 - 蔚来汽车 APP 岗位及团队介绍 电动车是未来几年最热的技术领域之一,所处行业前景一片光明,详见:https://www.nio.cn/events/shanghai-autoshow上下班不需要打卡,弹性工作 领导 Nice,团队工作氛围很融洽,注重个人发展,很好沟通 只要技术 OK,薪资绝对让你满意工作地点:上海市闵行区宜山路 1999 号科技绿洲三期 23 号楼 职责介绍及岗位要求负责公司移动产品架构设计,方案的制定,技术可行性研究,系统性能优化及安全加固; 责移动技术难题攻关,解决系统中关键架构问题,对系统稳定性负责; 项目组开发人员的设计评审,Code Review,以保证代码的可读性、可扩展性、易维护性。职位要求本科以上学历,5年以上iOS平台开发经验;有通用中间件SDK相关开发经验优先; 熟悉 WKWebView 基础组件,有 Hybrid 框架、JS Binding 经验优先; 悉 React Native、Flutter,有动态化框架开发经验者优先; 基础 SDK 开发流程,有图片库、埋点、离线包、AB相关开发经验者优先; APM 系统,有稳定性、性能、内存优化经验者优先;联系方式 微信:cuilh2018 关于我们 iOS 摸鱼周报,主要分享开发过程中遇到的经验教训、优质的博客、高质量的学习资料、实用的开发工具等。周报仓库在这里:https://github.com/zhangferry/iOSWeeklyLearning ,如果你有好的的内容推荐可以通过 issue 的方式进行提交。另外也可以申请成为我们的常驻编辑,一起维护这份周报。另可关注公众号:iOS成长之路,后台点击进群交流,联系我们,获取更多内容。 往期推荐 iOS 摸鱼周报 #90 | 面相任务的 GPT 项目诞生 iOS 摸鱼周报 #89 | WWDC 23 公布 iOS 摸鱼周报 #88 | 把 AI 集成到研发流程 iOS 摸鱼周报 #87 | Planning for AGI