普通视图

发现新文章,点击刷新页面。
今天 — 2025年5月18日iOS

老司机 iOS 周报 #335 | 2025-05-19

作者 ChengzhiHuang
2025年5月18日 18:06

ios-weekly
老司机 iOS 周报,只为你呈现有价值的信息。

你也可以为这个项目出一份力,如果发现有价值的信息、文章、工具等可以到 Issues 里提给我们,我们会尽快处理。记得写上推荐的理由哦。有建议和意见也欢迎到 Issues 提出。

新闻

Apple 公布将于今年晚些时候推出的强大辅助功能

苹果在辅助功能的上的设计还是非常先进的,现有的一些辅助功能适配起来相对来说还是比较轻松的,期待苹果更多的辅助功能。

文章

🐎 UIApplication delegate deprecation coming in iOS 19 SDK

@Damien:作者通过关注 WebKit 提交记录发现 iOS 19 SDK 中 UIApplicationDelegate 协议中的部分 API 将被弃用,原因是修复因新 SDK 导致的弃用警告,作者预测“新 SDK ”指的是即将在 6 月 WWDC 发布的 iOS 19,苹果工程师们已经在用 iOS 19 SDK 编译 WebKit,所以出现了这些弃用警告。

🐕 Using Model Context Protocol in iOS apps

@含笑饮砒霜:MCP(Model Context Protocol,模型上下文协议)是一种用于大语言模型(LLM)与外部工具交互的协议。它允许模型在对话过程中调用开发者自定义的函数(称为“工具”),以访问本地或远程的数据和服务,从而增强模型的实际能力。这篇文章介绍了如何在 iOS 应用中使用 Model Context Protocol(MCP)集成大模型能力。作者通过示例展示了如何实现一个 MCP Server(用于获取 Apple Health 中的血压数据)和一个 MCP Client(通过 Anthropic Claude API 实现聊天功能)。整个流程包括定义工具、调用本地服务、解析大模型响应,并在用户请求与工具调用之间建立桥梁,实现智能对话与本地数据交互的结合。

🐕 Xtool: cross-platform Xcode replacement. Build iOS apps on Linux and more!

@Kyle-Ye: 这篇贴子介绍了作者的开发名为 Xtool 的跨平台 Xcode 替代工具。Xtool 可以在 Linux 和 Windows 上构建和部署 iOS 应用程序 , 同时也可以在 macOS 上替代 Xcode。它支持使用 SwiftPM 构建 iOS 应用程序、签名和安装应用程序。中间还提到了一些 Xtool 目前还不支持的功能 , 如 Interface Builder、资产目录和 LLDB 调试等,作者表示未来会继续完善这些功能。

🐕 Vibe Xcoding your apps

@EyreFree:本文探讨了 LLMs 驱动的氛围编程(Vibe Coding)在 Xcode 生态的应用,介绍了 Alex、CopilotForXcode 等社区开发的 AI 代码助手,提及 MCP 协议对上下文交互的作用。同时指出了 Xcode 的扩展性局限,期待苹果开放底层接口(如借鉴 VSCode 模式)优化集成,强调了上下文、运行时数据和文档对 AI 辅助的重要性。作者认为氛围编程将推动苹果革新开发者工具,建议感兴趣的朋友持续关注社区在 Xcode 与 AI 整合方面的探索。

🐎 A flowing WebGL gradient, deconstructed

@莲叔: 一篇非常棒的科普文章,通过由浅入深的例子,娓娓道来的揭开了复杂动效的神秘面纱。本质上,绝大多数动画都可以解构为 时间 + 公式 + 图形 api。本篇文章从渐变开始、过度到波浪、贝塞尔曲线等复杂动效,都以思路,公式到代码予以实现,一直到最后实现了一个非常炫酷的动态模糊效果,标题中虽然有 WebGL,但绝大多数代码其实可以非常方便的移植到其他图形 api,如 OpenGL 和 Metal 等等。对动画和图形学有兴趣的同学千万不能错过。

🐕 Unlocking the Real Power of Swift 6's Typed Throws with Error Chains

@阿权:本文围绕 Swift 6 的类型化抛出(Typed Throws)特性展开,重点解决错误处理中的「嵌套地狱」问题,核心内容如下:

  1. 类型化抛出的优势与挑战
    • 优势:编译时错误检查、类型安全、自文档化 API、IDE 支持。
    • 挑战:抛出类型只能指定一个,不支持嵌套。多层架构中错误需手动转换,导致代码冗余、类型激增和上下文丢失。
  2. Catching 协议与 ErrorKit 解决方案
    • 引入 ErrorKit,通过 Catching 协议为错误类型添加 caught(Error) case,统一包装子层错误。
    • 关键函数:
      • catch 函数:自动将闭包中抛出的错误包装为当前层错误类型,避免手动转换。
      • errorChainDescription 函数:递归构建层级化错误链,保留原始错误上下文,提升调试效率。
  3. 总结
    • 类型化抛出结合 Catching 协议,在保证类型安全的同时简化错误处理,ErrorKit 提供的工具链进一步增强了调试能力。
    • 适用于复杂多层架构,尤其适合需要清晰错误追踪和高效调试的场景。

🐕 Debug crashes in iOS using MetricKit

@Barney:文章介绍如何通过苹果 MetricKit 实现系统级崩溃诊断,捕获内存 / 系统信号等传统工具遗漏的崩溃。涵盖框架配置、调用栈分析和 iOS 版本差异化报告机制(13-14 每日汇总,15+ 即时推送),提供崩溃模拟方案,并展示与 Zoho Apptics 整合实现符号解析与数据可视化。

🐕 Fitting the Lapse experience into 15 MegaBytes

@DylanYang:本文讲述了作者在开发 App Clip 时如何将包体压缩到 15 MB 的方式。作者通过重构依赖关系,减少核心功能的依赖库大小,减少、压缩内置的图片、字体等文件,分割核心模块,较少不必要的代码,裁剪字体包,编译优化等各种手段来极致的压缩包体。虽然这是 App Clip,但是对 App 本体的包体有诉求的开发者也有不错的参考价值。

代码

ButtonKit

@Smallfly:ButtonKit 的设计背景源于 SwiftUI 对异步任务交互的不足,旨在简化开发者在处理复杂用户交互时的工作量。其主要作用是提供一个支持异步操作、进度展示和自定义样式的按钮组件,特别适合需要处理网络请求、文件操作或其他耗时任务的 SwiftUI 应用。开发者可以通过这个库减少样板代码,提升代码可读性和用户体验。

内推

重新开始更新「iOS 靠谱内推专题」,整理了最近明确在招人的岗位,供大家参考

具体信息请移步:https://www.yuque.com/iosalliance/article/bhutav 进行查看(如有招聘需求请联系 iTDriverr)

关注我们

我们是「老司机技术周报」,一个持续追求精品 iOS 内容的技术公众号,欢迎关注。

关注有礼,关注【老司机技术周报】,回复「2024」,领取 2024 及往年内参

同时也支持了 RSS 订阅:https://github.com/SwiftOldDriver/iOS-Weekly/releases.atom

说明

🚧 表示需某工具,🌟 表示编辑推荐

预计阅读时间:🐎 很快就能读完(1 - 10 mins);🐕 中等 (10 - 20 mins);🐢 慢(20+ mins)

如何提高前端应用的性能?

作者 Riesenzahn
2025年5月18日 07:37

如何提高前端应用的性能

1. 代码优化

1.1 减少不必要的DOM操作

// 差: 频繁操作DOM
for(let i=0; i<100; i++) {
  document.getElementById('list').innerHTML += `<li>${i}</li>`;
}

// 好: 使用文档片段批量操作
const fragment = document.createDocumentFragment();
for(let i=0; i<100; i++) {
  const li = document.createElement('li');
  li.textContent = i;
  fragment.appendChild(li);
}
document.getElementById('list').appendChild(fragment);

1.2 使用事件委托

// 差: 为每个元素绑定事件
document.querySelectorAll('.btn').forEach(btn => {
  btn.addEventListener('click', handleClick);
});

// 好: 使用事件委托
document.getElementById('container').addEventListener('click', (e) => {
  if(e.target.classList.contains('btn')) {
    handleClick(e);
  }
});

2. 资源优化

2.1 图片优化

  • 使用WebP格式替代JPEG/PNG
  • 实现懒加载(Lazy Loading)
  • 使用响应式图片(srcset)
  • 压缩图片(TinyPNG等工具)

2.2 代码分割

// 动态导入实现代码分割
const module = await import('./module.js');

2.3 缓存策略

  • 设置合理的Cache-Control头
  • 使用Service Worker实现离线缓存
  • 资源文件使用内容哈希命名

3. 网络优化

3.1 使用CDN

  • 将静态资源部署到CDN
  • 选择离用户最近的CDN节点

3.2 启用HTTP/2

  • 多路复用减少连接数
  • 头部压缩减少传输量
  • 服务器推送预加载资源

3.3 预加载关键资源

<link rel="preload" href="critical.css" as="style">
<link rel="prefetch" href="next-page.js" as="script">

4. 渲染优化

4.1 减少重排和重绘

// 获取布局信息前进行批量修改
const width = element.offsetWidth; // 触发重排
element.style.width = width + 10 + 'px'; 

// 使用requestAnimationFrame优化动画
function animate() {
  // 动画逻辑
  requestAnimationFrame(animate);
}
requestAnimationFrame(animate);

4.2 使用CSS硬件加速

.transform-element {
  transform: translateZ(0);
  will-change: transform;
}

5. 监控与分析

5.1 性能指标

  • First Contentful Paint (FCP)
  • Largest Contentful Paint (LCP)
  • Cumulative Layout Shift (CLS)
  • Time to Interactive (TTI)

5.2 性能工具

  • Lighthouse
  • WebPageTest
  • Chrome DevTools Performance面板
  • 真实用户监控(RUM)

6. 框架优化

6.1 React优化

// 使用React.memo避免不必要渲染
const MemoComponent = React.memo(MyComponent);

// 使用useCallback/useMemo缓存计算结果
const memoizedValue = useMemo(() => computeExpensiveValue(a, b), [a, b]);

6.2 Vue优化

// 使用v-once处理静态内容
<div v-once>{{ staticContent }}</div>

// 合理使用计算属性
computed: {
  filteredList() {
    return this.list.filter(item => item.active);
  }
}

7. 构建优化

7.1 Tree Shaking

// package.json配置sideEffects
{
  "sideEffects": ["*.css", "*.scss"]
}

7.2 压缩代码

  • 使用Terser压缩JavaScript
  • 使用CSSNano压缩CSS
  • 使用HTMLMinifier压缩HTML

8. 移动端优化

8.1 减少首屏资源

  • 关键CSS内联
  • 非关键JS延迟加载
  • 使用骨架屏提升感知性能

8.2 优化触摸事件

/* 禁用触摸高亮 */
button {
  -webkit-tap-highlight-color: transparent;
}

/* 优化滚动性能 */
.scroll-container {
  overflow-y: scroll;
  -webkit-overflow-scrolling: touch;
}

最佳实践总结

  1. 测量优先:使用性能工具找出瓶颈
  2. 渐进增强:确保核心功能在低端设备可用
  3. 按需加载:只加载当前需要的资源
  4. 持续监控:建立性能基准和报警机制
  5. 团队协作:将性能指标纳入开发流程

通过综合应用以上技术,可以显著提升前端应用的加载速度、交互流畅度和整体用户体验。性能优化是一个持续的过程,需要定期评估和调整策略。

昨天 — 2025年5月17日iOS
昨天以前iOS
❌
❌