
开发工具移动开发【免费下载链接】BarkBark is an iOS App which allows you to push custom notifications to your iPhone项目地址https://gitcode.com/gh_mirrors/bar/Bark点击查看免费下载本篇技术指南围绕开源项目 Bark 的工程结构与实现原理展开帮助读者快速理解这款 iOS 推送工具 App 的整体架构从依赖安装、测试与构建命令到主 App 与通知扩展的协作方式、通知处理流水线、Realm 数据存储与多服务器管理机制。读完本文你将掌握 Bark 的源码组织方式、核心数据流以及如何基于Bark.xcworkspace进行开发、测试与打包。项目概览Bark 能做什么Bark 是一个 iOS 推送工具类 App它允许用户通过 HTTP 请求向自己的 iPhone 发送自定义推送通知。其底层依赖 Apple Push Notification serviceAPNs并在此基础上支持一组进阶的 iOS 通知特性通知分组展示threadIdentifier 分组自定义图标与自定义提示音时效性通知time-sensitive关键警告critical alerts端到端加密AES 加密推送内容这些能力的核心实现分散在三个 Target 中主 AppBark/、通知服务扩展NotificationServiceExtension/以及通知内容扩展notificationContentExtension/三者通过 App Groups 共享数据。开发环境依赖安装与工程打开方式安装 CocoaPods 依赖Bark 使用 CocoaPods 管理第三方依赖首次克隆仓库后需要先执行pod install始终使用 Workspace 而非 Project项目包含主 App 与多个扩展 Target以及 RxSwift、Realm 等 Pod 依赖因此必须通过 workspace 打开工程# 打开Bark.xcworkspace open Bark.xcworkspace这是本项目最重要的开发约定之一永远使用Bark.xcworkspace而不是Bark.xcodeproj。如果直接打开 project 文件Pod 依赖与扩展 Target 的配置将无法正确加载。测试命令仓库提供两种运行测试的方式# 方式一通过 fastlane 运行测试 bundle exec fastlane tests # 方式二直接使用 xcodebuild xcodebuild test -workspace Bark.xcworkspace -scheme Bark测试代码位于 BarkTests/ 目录例如 MessageDeleteTimeRangeTest.swift 用于验证消息删除时间范围相关逻辑。构建与发布命令# 构建 App xcodebuild -workspace Bark.xcworkspace -scheme Bark build # 构建 TestFlight 包需要正确的证书与环境变量 bundle exec fastlane beta其中fastlane betalane 定义在 fastlane/Fastfile 中它会依次执行设置 CI 环境、按需递增版本号与构建号、通过match拉取 App Store 证书、build_app构建、上传至 TestFlight并在构建完成后通过 Bark 自身的推送接口发送一条构建完成通知使用环境变量BARK_KEY作为推送 key。整体架构三个 Target 的分工主 App TargetBark/入口文件 AppDelegate.swift负责 App 生命周期、APNs 注册、Realm 初始化、Darwin 通知监听、通知分类Actions注册以及深链处理。AppDelegateRealm.swiftRealm 数据库的初始化、旧库迁移以及待处理消息入库逻辑。Realm 数据库 schema 版本定义在 RealmConfiguration.swift 中当前源码为schemaVersion: 18主 App 与通知扩展共用同一份配置。通知服务扩展NotificationServiceExtension/NotificationService.swift 是UNNotificationServiceExtension子类它在推送送达展示之前拦截通知通过一条处理器流水线逐级加工UNMutableNotificationContent最终交付处理后的内容。通知内容扩展notificationContentExtension/NotificationViewController.swift 提供自定义通知界面负责在通知横幅/锁屏上以自定义 UI 展示内容。从代码结构看主 App 采用 MVVM 模式组织界面Controller/下的ViewController负责视图ViewModel负责业务状态View/目录存放可复用 UI 组件Common/存放跨模块共享的工具与单例管理器。核心机制通知处理流水线处理器协议所有处理器都遵循 NotificationContentProcessor.swift 中定义的协议public protocol NotificationContentProcessor { func process(identifier: String, content bestAttemptContent: UNMutableNotificationContent) async throws - UNMutableNotificationContent }处理器接收request.identifier与当前推送内容返回加工后的内容抛出NotificationContentProcessorError.error(content:)时流水线中断并立即交付当前内容。处理器执行顺序顺序至关重要NotificationService.swift中注册的处理器顺序如下顺序是设计的一部分不能随意调整let processors: [NotificationContentProcessorItem] [ .ciphertext, // 解密加密推送必须最先执行所有推送数据可能都在密文中 .markdown, // 渲染 Markdown 正文 .level, // 处理通知级别active/timeSensitive/passive/critical .badge, // 管理角标数 .autoCopy, // 自动复制内容到剪贴板 .archive, // 将消息归档到数据库 .mute, // 处理群组静音 .call, // 来电模式循环播放 30 秒提示音 .setImage, // 下载并附加图片 .setIcon // 设置自定义图标iOS 15必须最后执行可能超时 ]关键约束在源码注释中写得很明确ciphertext必须放在最前面因为加密推送的全部数据可能都藏在密文里必须先解密才能继续后续处理icon放在最后因为设置图标耗时可能触发扩展超时一旦超时后续处理器将没有机会运行。超时兜底机制通知服务扩展的执行时间是受限的系统会给出约 30 秒的预算。NotificationService.swift通过两个成员变量保存当前处理器与当前内容var currentContentHandler: ((UNNotificationContent) - Void)? var currentBestAttemptContent: UNMutableNotificationContent?当系统调用serviceExtensionTimeWillExpire()时直接使用currentBestAttemptContent调用contentHandler交付推送保证即使处理未完成也不会丢失通知。处理完成后的跨进程通信全部处理器执行完毕后NotificationService通过 Darwin 通知广播新消息事件主 App 收到后刷新消息列表CFNotificationCenterPostNotification( CFNotificationCenterGetDarwinNotifyCenter(), CFNotificationName(com.bark.newmessage as CFString), nil, nil, true )对应地AppDelegate.swift 在启动时通过CFNotificationCenterAddObserver注册了com.bark.newmessage监听收到通知后调用processPendingMessages()把扩展侧暂存的消息写入数据库。各处理器职责与实现细节CiphertextProcessor加密解密见 CiphertextProcessor.swift。当推送载荷中存在ciphertext字段时使用本地配置的加密 key 进行 AES 解密并把解密后的 JSON 重写进userInfo实现细节包括密钥字段大小写统一转小写、数值统一转为字符串与普通推送参数形态保持一致、支持通过iv参数显式指定初始化向量否则使用本地配置的 IV解密失败时将正文置为Decryption Failed并中断流水线。ArchiveProcessor消息归档见 ArchiveProcessor.swift。归档开关默认取全局设置ArchiveSettingManager.shared.isArchive推送参数isarchive1/0可单条覆盖。归档时读取 title/subtitle/body/url/group/image/id 等字段支持ttl秒实现消息自动过期expireDate超过当前时间则不入库。消息不直接写入 Realm而是以 plist 形式写入 App Group 容器的pending_messages目录文件名使用消息 id 的 SHA256 哈希同时向WidgetHistorySnapshotStore预追加快照用于小组件展示。MuteProcessor群组静音见 MuteProcessor.swift。根据threadIdentifier查询GroupMuteSettingManager中的静音配置若在静音时间段内则将interruptionLevel降级为.passiveiOS 15。MarkdownProcessor调用 CodeHighlighter.swift 与 MarkdownParser.swift 将正文渲染为富文本LevelProcessor处理active/timeSensitive/passive/critical四种中断级别BadgeProcessor更新角标AutoCopyProcessor将copy字段内容自动写入剪贴板CallProcessor以来电模式循环播放提示音约 30 秒ImageProcessor通过 ImageDownloader.swift 下载image参数指向的图片并作为附件附加IconProcessor设置自定义图标依赖 iOS 15 能力。数据模型与存储Realm 与 App GroupsMessage 模型历史消息以 Realm 对象存储模型定义在 Message.swift字段类型说明idString主键消息唯一标识title / subtitle / bodyString?通知标题、副标题、正文bodyTypeString?正文类型plainText/markdownurlString?点击通知跳转的链接imageString?附件图片地址groupString?索引分组名对应threadIdentifiercreateDateDate?索引创建时间expireDateDate?索引过期时间配合ttl使用Realm 配置与迁移RealmConfiguration.swift 定义了全局默认配置数据库文件位于主 App 的 Documents 目录bark.realm当前schemaVersion为 18并内置了迁移逻辑oldSchemaVersion在 0...13 之间的旧库会硬删除isDeleted true的软删除数据新版本不再维护软删除字段。修改 Message 模型时必须同步递增schemaVersion否则已有用户升级后会因 schema 不匹配而无法打开数据库。数据库存放位置的演进重要实现细节AppDelegateRealm.swift 的注释解释了数据库存放位置的一次关键架构调整旧版本将数据库放在 App Group 共享容器中但由于 Realm 无法解决0xdead10cc崩溃问题新版改为在主 App 的 Documents 目录存放数据库通知服务扩展不再直接写 Realm而是把消息写成 plist 文件放入 App Group 的pending_messages目录主 App 启动或收到 Darwin 通知时再统一读取入库。migrateRealmDatabase()负责把旧版 App Group 中的bark.realm迁移到新位置复制数据库及 lock/management/note 相关文件后删除旧文件通过hasRealmMigrated标记幂等。processPendingMessages()在主 App 侧串行执行专用串行队列读取所有 plist、过滤已过期的消息、批量写入 Realm、同步刷新 Widget 快照、清理过期通知并删除 plist 文件。App Groups 数据共享清单主 App 与通知扩展通过 App Groupgroup.bark共享三类数据待处理消息 plistpending_messages目录由 ArchiveProcessor 写入、主 App 读取设置项BarkSettings基于 DefaultsKit 的 UserDefaults 封装见 BarkSettings.swiftDarwin 通知如com.bark.newmessage用于跨进程通信服务器管理支持多推送服务器ServerManager.swift 以单例形式管理多个推送服务器默认服务器地址为https://api.day.app。每个Server包含 id、address、key 和可选 name 四个字段并提供cleanAddress去除尾部斜杠、addressAndKey拼接推送地址等派生属性。ServerManager 内置了老版本v1.2.6 之前单服务器数据的自动迁移若检测到旧的key与currentServer设置会将其转换为新的Server对象并清空旧字段。设备拿到 APNs token 后syncAllServers()会并发向所有服务器调用/register接口注册 token并从响应中回写服务器返回的 key见 BarkApi.swift。主 App 还支持通过深链bark://addserver?addressxxx快速添加服务器见 AppDelegate.swift 中的application(_:open:options:)添加后自动设为当前服务器并同步注册。关键技术栈Bark 的核心技术依赖如下均可在 Podfile 与源码中确认RxSwift / RxCocoa响应式编程用于数据绑定与异步操作Realm本地数据库主 App 与扩展共享通过 plist 中转 App GroupsMoya Alamofire网络抽象层Common/Moya/下封装了BarkApi、BarkTargetType、ObservableExtensionMaterial / SnapKitUI 框架与 Auto Layout DSLCryptoSwift推送内容 AES 加密/解密端到端加密Kingfisher图片下载与缓存端到端数据流一条推送的完整旅程结合 AppDelegate.swift、NotificationService.swift 与各处理器一条推送从发起到落地的完整链路如下设备注册App 请求 APNs token → 通过/register接口上报服务器 → 服务器保存设备 token 与用户 key接收推送用户通过 HTTP 请求发送推送 → 服务器推送至 APNs → APNs 投递到设备 →NotificationServiceExtension进入处理器流水线 → 通知展示消息归档ArchiveProcessor写入 plist → Darwin 通知告知主 App → 主 AppprocessPendingMessages()入库并刷新消息列表加密链路若推送带ciphertext参数 →CiphertextProcessor用本地密钥解密 → 继续走正常处理流程消息清理推送携带delete1idxxx时App 在后台被唤醒删除通知中心中对应的推送与历史记录见didReceiveRemoteNotification测试与质量保障测试集中在 BarkTests/ 目录CI 会在每次推送到 master 时运行整套测试见仓库 CI 配置。本地可通过bundle exec fastlane tests或xcodebuild test -workspace Bark.xcworkspace -scheme Bark复现。开发注意事项速查永远打开Bark.xcworkspace不要打开Bark.xcodeproj最低部署目标iOS 15.0Realm schema 变更时递增RealmConfiguration.swift中的schemaVersion同时支持 iPhone 与 iPadiPad 端使用BarkSplitViewController双栏布局本地化文案集中在 Localizable.xcstrings自定义提示音放在 Sounds/ 目录.caf格式Pods 的代码签名在 Podfile 的 post_install 钩子中被禁用避免与主工程签名冲突赞分享开发工具移动开发【免费下载链接】BarkBark is an iOS App which allows you to push custom notifications to your iPhone项目地址https://gitcode.com/gh_mirrors/bar/Bark点击查看免费下载相关推荐Bark 源码级技术指南iOS 自定义推送架构与通知处理管道实战解析Bark 源码级技术指南iOS 自定义推送架构与通知处理管道实战解析 导读 Bark 是一款通过 HTTP 请求向 iPhone 推送自定义通知的 iOS 工开发工具移动开发Bark iOS 推送工具完整使用指南URL 参数、加密推送与高级通知特性详解Bark iOS 推送工具完整使用指南URL 参数、加密推送与高级通知特性详解 Bark 是一款基于 APNsApple Push Notification开发工具移动开发【亲测免费】 开源项目推荐Bark - iOS端自定义通知推送工具开源项目推荐Bark iOS端自定义通知推送工具 1. 项目基础介绍与主要编程语言 Bark 是一个开源的iOS应用程序允许用户向自己的iPhone推送自定开发工具移动开发上一篇【免费下载】 时间序列预测模型TimesFM安装与使用指南下一篇探索高效下载新纪元Fansly Downloader创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考