- 博客(158)
- 收藏
- 关注
原创 iOS Widget 开发-20:从旧版 API 迁移到 iOS 17+ 现代 Widget
iOS 17+ 对 Widget 系统进行了现代化升级,提供了更简洁的 API 和交互能力。本文系统介绍了从 iOS 14 时代 Widget 迁移到新 API 的方案,包括:1)将 TimelineProvider 迁移为支持 async/await 的 AppIntentTimelineProvider;2)用纯 Swift 代码替代 XML 配置 Intent;3)使用 containerBackground 设置背景;4)新增的 Widget 交互按钮和控制中心支持。同时提供了条件编译方案,帮助开发
2026-05-22 08:25:24
487
原创 iOS Widget 开发-19:Widget 调试与单元测试
iOS Widget 调试与测试指南 Widget 开发面临独特挑战:独立进程运行、系统控制生命周期、调试困难。本文提供实用解决方案: 调试方法: 直接运行 Widget Extension Target Attach to Process 附加调试 使用 os.log 系统日志 常见问题排查: 黑屏问题:检查内存限制、超时、空数据 更新失败:验证 Timeline 策略、App Group 配置 预览差异:注意 Xcode Preview 与实际渲染区别 开发技巧: 利用 SwiftUI Preview
2026-05-22 08:19:04
714
原创 iOS Widget 开发-18:Widget 的 SwiftUI 视图适配与设计
本文介绍了 Widget 中 SwiftUI 视图的适配技巧,主要包括:1)通过 widgetFamily 实现多尺寸适配,针对不同尺寸提供优化布局;2)锁屏 Widget 的三种样式设计要点;3)暗黑模式适配策略,推荐使用语义化颜色和自定义 Asset;4)动态字体支持,建议使用系统字体样式而非固定字号。文章提供了大量代码示例,帮助开发者打造在各种设备和模式下都能良好展示的高质量 Widget。
2026-05-21 08:16:24
479
原创 iOS Widget 开发-17:Widget 错误处理与空状态设计
Widget 异常状态处理指南 本文介绍了 Widget 开发中常见的异常状态处理方案。Widget 可能面临多种异常情况,包括加载中、数据为空、网络错误、权限不足等8种典型状态。文章提出了状态枚举的设计模式,通过 WidgetState 和 WidgetErrorType 来规范状态管理。在 Provider 层实现了状态转换逻辑,包括权限检查、数据获取、缓存回退等处理策略。最后展示了如何在视图中针对不同状态渲染对应的 UI 组件,如加载动画、空数据提示和错误信息展示。这种分层处理机制可显著提升 Widg
2026-05-21 08:15:13
647
原创 iOS Widget 开发-16:Widget 网络数据加载策略
Widget 网络请求与缓存策略摘要 Widget 只能在 Timeline 构建阶段(getTimeline/timeline)发起网络请求,受限于5秒超时和30MB内存预算。建议采用三级缓存架构:优先使用App Group共享容器(主App写入+Widget读取),最后回退到硬编码默认值。主App应主动同步数据至共享容器并触发Widget刷新,而Widget端需实现缓存读取逻辑,推荐为缓存数据添加过期时间检查(TTL)。对于时效性要求高的Widget,可结合URLSession回调(iOS14+)或as
2026-05-20 07:58:47
603
原创 iOS Widget 开发-15:Widget 性能优化指南
Widget性能优化需重点关注内存管理、Timeline构建、渲染效率和电量消耗。内存预算仅30MB,需控制Entry数量(3-10个),避免存储大对象,优化图片加载。Timeline构建需在5秒内完成,建议采用缓存优先策略,设置网络请求超时。渲染优化应简化视图层级,按WidgetFamily适配不同布局。电量优化方面,应根据内容类型设置合理刷新间隔(15分钟至6小时),避免无效刷新。通过这四个维度的系统性优化,可有效防止Widget出现黑屏、延迟等问题,提升用户体验。
2026-05-20 07:56:08
1207
原创 iOS Widget 开发-14:iOS 18 控制中心组件开发
iOS 18 开放了控制中心(Control Center),允许第三方 App 提供自定义控制组件。这为用户提供了全新的快捷操作入口,也为开发者提供了新的交互场景。本篇将介绍如何创建、配置和控制中心组件的最佳实践。
2026-05-19 07:58:54
824
原创 iOS Widget 开发-13:Live Activity 实战详解
iOS 16 的 Live Activity 功能支持在锁屏和灵动岛实时展示动态信息,适用于外卖、赛事等时效性场景。与 Widget 相比,Live Activity 支持秒级更新、远程推送触发,并由应用主动管理生命周期。开发流程包括:1) 添加 ActivityKit 扩展;2) 定义包含静态和动态数据的 Attributes;3) 构建锁屏和灵动岛的自适应视图;4) 通过代码启动、更新和结束活动。关键优势在于其实时推送能力和灵活展示方式,但需注意每个应用最多同时运行 25 个活动,且单个设备总活动数有限
2026-05-19 07:55:35
508
原创 iOS Widget 开发-12:Widget 深度链接与导航
Widget 深度链接跳转技术解析 本文系统介绍了 iOS Widget 与主 App 交互的三种核心跳转方式: widgetURL:适用于简单场景,整个 Widget 作为单一跳转入口 Link:支持多区域独立跳转,适合复杂交互界面 Button(intent):iOS17+新特性,可在执行逻辑后跳转 关键实现要点: 通过自定义 URL Scheme 实现深度链接 主 App 需正确处理 onOpenURL 回调 不同尺寸 Widget 适配不同跳转策略 支持传递参数实现精准页面导航 每种方式各有适用场景
2026-05-18 07:56:40
609
原创 iOS Widget 开发-11:Widget 交互按钮实战(iOS 17+ App Intents)
本文将从桌面 Widget/小组件跳转到宿主 App 的常用方式、实现细节、冷启动/热启动如何接收 URL、以及常见坑与调试方法。包含:widgetURL、Link、Intent / AppIntents(以及在 Widget 中提供“按钮/操作”)等示例代码,兼顾 SwiftUI 与 UIKit/SceneDelegate 的接收方式。
2026-05-18 00:15:00
1018
原创 iOS Widget 开发-10: TimelineProvider、IntentTimelineProvider、AppIntentTimelineProvider(中文详解)
TimelineProvider:最基础的 provider,适用于不需要用户配置的小组件。使用同步或回调 API(getSnapshot / getTimeline / placeholder)。IntentTimelineProvider:与 SiriKit 的 INIntent 配合,用于较早的用户可配置小组件(系统会传入 INIntent 实例)。API 使用回调模式(getSnapshot(for:in:completion:) 等)。AppIntentTimelineProvider:基于
2025-11-10 21:16:01
1046
原创 iOS Widget 开发-9:可配置 Widget:使用 IntentConfiguration 实现参数选择
iOS Widget 支持通过“参数化”配置内容,让用户在添加 Widget 时根据个人偏好选择展示内容。这一功能通过 IntentConfiguration 实现,是打造个性化、可复用小组件的关键。本篇将详细介绍如何创建 Intent 类型、绑定到 Widget 上,以及在 WidgetProvider 中读取用户配置,完成从 UI 到数据的个性化支持。
2025-11-10 20:59:36
1568
原创 iOS Widget 开发-8:手动刷新 Widget:WidgetCenter 与刷新控制实践
WidgetKit 是系统主导的刷新架构,但 Apple 也提供了有限的“手动刷新”手段,让开发者可以在适当时机主动请求刷新 Widget 内容。本篇将介绍 WidgetCenter 的用法、刷新方法的适用场景、调用限制以及最佳实践。
2025-10-24 22:48:54
438
原创 iOS Widget 开发-7:TimelineProvider 机制全解析:构建未来时间线
在 WidgetKit 中,TimelineProvider 是小组件生命周期的核心机制之一。它控制着 数据获取时机、展示内容 与 刷新策略,是实现时间驱动内容更新的基础。本文将介绍 TimelineProvider 的工作原理、设计模式、常见场景与高级用法,帮助大家构建智能、节能且灵活的 iOS 小组件。
2025-07-10 14:33:44
2040
原创 iOS Widget 开发-6:Widget 数据模型设计与 Entry 构建方式
在 WidgetKit 中,TimelineEntry 是信息展示的基本单位。一个 Widget 的刷新和 UI 展示,都以 Entry 为驱动。合理设计 Entry 与 Timeline,不仅提升用户体验,还能降低资源消耗,增强状态表达能力。
2025-07-10 07:33:26
622
原创 iOS Widget 开发-5:Widget 与主 App 的通信原理:App Group、UserDefaults 与文件共享
在 iOS 中,Widget 是独立于主 App 的 Extension,两者运行环境不同,无法直接调用彼此的内存空间。因此,若要实现数据共享与通信,必须借助系统提供的共享机制。
2025-07-09 08:36:39
1513
原创 iOS Widget 开发-4:Widget 的生命周期与系统行为详解
Widget 在系统中运行的方式与主 App 大相径庭,它受系统严格托管,不支持常驻运行,也不具备实时更新能力。理解 Widget 的生命周期和系统行为,有助于我们设计出刷新频率合理、性能稳定、体验良好的组件。
2025-07-09 08:08:00
1336
原创 iOS Widget 开发-3:Widget 的种类与尺寸(主屏、锁屏、灵动岛)
iOS 支持多种类型的 Widget,分布在主屏幕、锁屏、灵动岛等多个系统位置。每种 Widget 都有各自的尺寸、交互能力与限制。本篇将系统梳理 iOS 当前支持的 Widget 类型与尺寸规格,帮助开发者理解适配策略与设计方向。
2025-07-08 09:26:48
1899
原创 iOS Widget 开发-2:创建你的第一个 Widget:项目结构与扩展搭建
iOS Widget 是通过 Widget Extension 实现的独立模块,它拥有自己的生命周期与渲染逻辑,与主 App 逻辑相对独立。
2025-07-08 08:14:49
1612
原创 iOS Widget 开发-1:什么是 iOS Widget?开发前的基本认知
随着 iOS 系统的不断演进,Widget(小组件)已经成为提升用户体验的重要组成部分。从 iOS 14 开始,Apple 引入了全新的 WidgetKit 框架,允许开发者使用 SwiftUI 创建高度可定制、灵活展示的 Widget,并可添加到主屏幕、锁屏界面甚至待机模式中。
2025-07-07 13:57:31
1823
原创 Swift Package 教程:创建、发布与使用详解
Swift Package 是 Apple 推出的官方依赖管理工具,基于 Swift Package Manager(SPM)。它让我们可以轻松地组织代码模块,复用组件,同时也是开源库分享和集成的标准方式。本教程将介绍 Swift Package 的概念、创建、结构、使用与发布等内容,帮助大家掌握 Swift Package 的使用。
2025-07-06 14:37:21
1412
原创 Swift 协议详解:Equatable、Hashable、Identifiable、Comparable
Swift 是一个强类型的语言,它通过协议(Protocol)为类型提供功能扩展的强大能力。本篇文章将深入解析四个在开发中非常常见也非常重要的协议:Equatable、Hashable、Identifiable 和 Comparable。掌握它们不仅可以写出更简洁、更强大的代码,也能够更好地与 Swift 标准库(如数组、集合、字典等)进行交互。
2025-07-06 14:34:55
997
原创 在 iOS 和 tvOS 上实现 Sign in with Apple 登录功能
Apple 提供的 Sign in with Apple(Apple 登录)是一个既安全又注重隐私的身份验证方式,支持用户通过 Apple ID 登录您的 App。在 iOS 和 tvOS 上,虽然使用场景不同,但底层接口基本一致。本文将详细介绍其 API、状态处理、回调方法,并提供代码示例,帮助大家快速集成。
2025-07-02 07:09:48
2006
原创 SwiftUI 中的模糊效果详解:.blur、.material、UIVisualEffectView
模糊效果(Blur Effect)是 iOS 用户界面设计的重要组成部分,它被广泛应用于系统控制中心、通知背景、弹窗蒙版等场景,营造出“毛玻璃”的视觉层次感。 本文将深入解析 SwiftUI 中实现模糊效果的三种主流方式:`.blur(radius:)`、`.background(Material)`、以及封装 UIKit 的 `UIVisualEffectView`,并详细说明每种方式的适用场景、性能表现及实现方式。
2025-07-01 07:20:44
2858
原创 Xcode 中常用图片格式详解
在 iOS/macOS 开发过程中,合理选择图片格式对应用的性能、体积、显示效果影响显著。Xcode 中支持多种图像格式,包括位图(如 PNG、JPEG)、矢量图(如 PDF、SVG)以及动画格式(如 GIF、WebP)。本文将详细介绍这些常用图片格式的特点、优缺点及适用场景,帮助开发者在项目中做出更合理的资源选择。
2025-07-01 06:58:31
883
原创 Swift 中 Result 类型全解析:从基础到进阶
Result特性Result返回结构无返回值显式 success/failure链式调用不方便支持 map / flatMap多阶段处理需嵌套可组合可读性中高可测试性异常难模拟易构造成功/失败场景Swift 的Result是将函数式编程与错误处理融合的优秀设计。它不仅简化了异常流程,还增强了组合能力。我们应在业务逻辑、网络请求、异步流程、状态传递中更多地使用Result,写出更简洁、更安全的代码。让我们从现在开始,用Result统一错误处理思路,让代码更具表达力!
2025-06-30 07:43:51
1089
原创 Swift concurrency 10 — AsyncStream 和 AsyncThrowingStream:用异步流优雅处理事件
Swift Concurrency 带来了现代化的异步编程体验。在处理异步事件流时,AsyncStream 和 AsyncThrowingStream 提供了优雅的方式来消费和控制异步值序列。本文将全面讲解这两个 API 的用途、用法、底层机制和实战场景。
2025-06-30 06:41:30
1215
原创 AppsFlyer SDK 介绍:移动归因、事件追踪与广告效果分析
随着移动应用市场竞争日益激烈,精准的用户归因与广告投放分析变得尤为重要。AppsFlyer 是业内领先的移动归因与营销分析平台,广泛应用于广告优化、渠道评估、用户行为分析等场景。
2025-06-24 08:40:50
2916
原创 SwiftUI 的 `PhotosPicker` 构建图片选择器(含多选)
SwiftUI 在 iOS 16+ 引入了 PhotosPicker,让我们能以声明式方式使用系统原生的照片选择器。结合 Swift Concurrency,这为异步加载图片提供了极大的便利。
2025-06-24 08:24:01
1271
原创 SwiftUI 中的 .searchable() 修饰符详解:打造强大搜索体验
随着 SwiftUI 的不断演进,Apple 在 iOS 15 中引入了 .searchable() 修饰符,为开发者提供了声明式的方式,在列表、导航视图等组件中添加搜索功能。本文将深入讲解 .searchable() 的用法、进阶特性。
2025-06-20 09:32:47
955
原创 SwiftUI 的 refreshable 修饰符:优雅实现下拉刷新
在 iOS 应用中,“下拉刷新”是一种常见的交互模式。而在 SwiftUI 中,从 iOS 15 开始,Apple 提供了一个原生支持的修饰符 —— refreshable。
2025-06-20 09:06:20
897
原创 Swift concurrency 9 — Sendable 协议:跨任务共享数据的安全保障
随着 Swift 并发(Swift Concurrency)的引入,开发者终于有了一种类型安全的方式来编写并发代码,而不必再依赖传统的锁与队列模型。在这个系统中,有一个非常关键的协议:Sendable。
2025-06-13 09:33:44
1668
原创 Swift concurrency 8 — Actor的理解与使用
Swift 从 5.5 开始引入了基于协程的并发模型(Concurrency Model),为我们带来了 async/await、Task 以及 `actor` 等新特性。其中,`actor` 是专门为解决**数据竞争(data race)问题**而设计的结构化并发组件。在传统的多线程编程中,开发者常常需要依赖锁(如 `DispatchQueue`, `NSLock` 等)来手动同步数据访问,这既容易出错,又难以维护。`actor` 的出现,大大简化了并发编程的复杂性。
2025-06-13 08:15:07
1774
原创 Xcode 16.4+iOS 18.5 模拟器因缺失 libswiftWebKit.dylib 闪退问题解决方案
随着 Xcode 16.4 的发布,在使用模拟器(特别是iOS 18.5 模拟器)运行包含 WebKit 功能的 iOS 应用时,遇到了如下严重的运行时崩溃
2025-06-05 08:13:19
2704
原创 Xcode 16.4 + iOS 18 系统运行时崩溃:___cxa_current_primary_exception 符号丢失的原因与解决方案
这是一个典型的 运行时动态链接失败(dyld) 错误,表面上是找不到 ___cxa_current_primary_exception 符号,实质上是 Swift 6.1 / Xcode 16.4 使用的 C++ ABI 运行时 与老版本 iOS 不兼容。
2025-06-05 07:36:27
2536
原创 深入 UICollectionView:scrollToItem(animated: false) 的隐藏陷阱
你以为 animated: false 只是省掉动画?其实它悄悄毁了 cell 复用机制,内存瞬间爆炸……
2025-06-04 07:49:53
835
原创 SwiftUI中竖向排版文字探索及封装(支持中文及英文)
在移动开发中,有时会遇到需要垂直排版文字的场景,特别是在一些中文设计中,竖排文本可以营造出一种独特的视觉效果。这篇文章将详细讲解如何实现一个支持竖排中文和英文的 SwiftUI 组件,并提供详细的代码实现和思路。
2024-10-24 13:00:00
1389
原创 Swift concurrency 7 — Continuation的理解与使用(withCheckedContinuation、withCheckedThrowingContinuation)
在Swift中,continuation 是在异步代码中将基于回调的异步函数转换为使用现代 Swift 的 async/await 语法的一种机制。这种机制主要通过 withCheckedContinuation 和 withCheckedThrowingContinuation 函数来实现。这两个函数可以帮助我们将传统的基于回调的异步 API 适配到 Swift 的 async/await 机制中。
2024-10-24 08:30:00
1846
原创 Swift concurrency 6 — TaskGroup的理解与使用
在SwiftUI中,TaskGroup 是一种处理并发任务的工具,特别适用于需要并发执行多个独立任务并在它们都完成后进行进一步处理的场景。TaskGroup 提供了一种结构化并发的方法,使得并行任务的启动、管理和结果收集变得更加简便和安全。
2024-08-31 19:24:54
1839
1
原创 Swift concurrency 5 — async let的理解与使用
通过async let我们可以让一组异步方法同时去执行,并且当所有异步方法都返回结果后,程序再继续往下走。
2024-08-29 13:45:50
1369
SwiftUI之判断ScrollView是否滑动到底部及ChildSizeReader的使用文章示例代码
2023-09-13
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅