独立开发毒舌版MBTI测试App:Swift数据模型版本迁移和多文案架构的实战踩坑

uni-app 和 Flutter 打包上架 iOS 频繁触发 4.3 (a):原因拆解与合规处理路径 跨端方案让 iOS 上架的门槛降低了,但也带来一个明显的副作用 ——4.3 (a) 的命中率显著高于原生项目。很多开发者不理解:业务代码明明是自己写的,为什么还会被判为重复应用。这篇专门讲跨端场景,把原因和可走的路径讲清楚。 阅读详情

起因:严肃的MBTI测试没人转发

去年办公室突然流行起MBTI测试。我观察了一圈,发现大家测完之后最感兴趣的不是那些学术分析,而是互相对着结果吐槽:“你果然是I人”“难怪你开会从来不说话”。

说白了,大部分人做MBTI就是拿来发朋友圈的谈资。

但市面上的MBTI工具要么太严肃(长篇学术描述,谁看啊),要么太同质化。我就想:能不能做一个职场场景驱动的人格测试,结果文案写得毒舌一点,让人看完忍不住截图转发?

这就是「NMTI人格测试」的由来。N 取自 New,也取自"牛马"的谐音——对,就是这么直白。

产品长什么样

几个核心功能:

  • 测自己:回答一系列职场/校园场景题,系统算出你属于16型人格中的哪一种,配上专属毒舌文案
    • 测朋友:把链接发给朋友,对方做完之后双方能看到互测对比和"相处指南"
    • 结果海报:每个人格有个标签,比如「六边形悍匪」「优雅吸血鬼」「赛博隐形人」,生成可以直接分享的海报
      两个题包:「基础牛马包」面向职场人,「做题家版」面向学生党。同一个人格在不同题包下,文案风格完全不同。

多文案架构:16种人格 × 2套题包怎么组织

这事儿我纠结了挺久。

最开始我把所有人格数据塞在一个大数组里,每个 Personality 包含职场版和学生版的文案字段。写到第三个人格就受不了了——一个结构体十几个字段,改一个版本的文案要在一堆属性里翻半天。

后来我把文案拆成了独立的 PersonalityCopy 结构,职场版跟着 Personality 本体走,学生版用一个静态字典按 id 映射:

struct PersonalityCopy {
    let slogan: String
        let tagline: String
            let fullDesc: String
            }
extension Personality {
    func copy(for pack: QuizPack) -> PersonalityCopy {
            switch pack {
                    case .workplace:
                                return PersonalityCopy(slogan: slogan, tagline: tagline, fullDesc: fullDesc)
                                        case .student:
                                                    return Self.studentCopy[id]
                                                                    ?? PersonalityCopy(slogan: slogan, tagline: tagline, fullDesc: fullDesc)
                                                                            }
                                                                                }
                                                                                }
                                                                                ```
这样做的好处是:学生版文案单独一个文件维护,以后加第三套题包(比如恋爱版?)也不用动核心模型。fallback 到职场版文案也很自然,不会出现空数据的情况。

说实话这个设计不复杂,但我最初的方案是用 enum 的 associated value 来做,写了一半发现 Codable 支持起来巨麻烦,删了重来的。

## 存档模型版本迁移:一个真实的线上crash

用户可以多次测试,保存历史记录对比不同时期的结果。存档模型长这样:

```swift
struct ArchiveEntry: Identifiable, Codable {
    let id: UUID
        var nickname: String
            let personalityCode: String
                let scores: DimensionScores
                    let date: Date
                        let pack: QuizPack
                        }
                        ```
这里有个真实踩坑:1.0 版本上线的时候只有职场版,`ArchiveEntry` 里根本没有 `pack` 字段。等 1.1 加了学生版,老用户的存档数据反序列化直接 crash。

解决方案是在自定义的 `init(from decoder:)` 里用 `decodeIfPresent` 做兼容:

> `pack = try c.decodeIfPresent(QuizPack.self, forKey: .pack) ?? .workplace`
旧存档没有 pack 字段就默认职场版。这个问题说起来简单,但当时 TestFlight 用户反馈闪退的时候我排查了快两个小时才定位到——因为 crash log 指向的是 `JSONDecoder` 内部,不是我的代码行。错误信息是 `keyNotFound`,但堆栈里全是系统框架的符号,我一开始以为是 iOS 版本兼容问题,绕了好大一圈。

教训就是:任何持久化的数据模型,从第一天起就应该考虑字段可选和版本迁移。我知道这是老生常谈,但不踩一次真记不住。

## 四维度评分和人格编码映射

NMTI 的人格判定基于四个维度:C(控制)、S(社交)、E(能量)、A(执行)。每道题的选项会给对应维度加分或减分,答完所有题后看每个维度的最终得分正负。

编码规则是这样的:每个维度正方向取一个字母,负方向取另一个字母,四个拼在一起就是人格编码。比如 C+S+E+A+ 对应 "PRED"(六边形悍匪),C+S+E+A- 对应 "VAMP"(优雅吸血鬼),C+S+E-A+ 对应 "WORK"(金牌老黄牛)。

这些缩写不是随便起的,每组字母对应人格标签的英文缩写——PRED 取自 Predator,VAMP 取自 Vampire,诸如此类。2^4 = 16 种组合,16 个人格,一一对应。

`DimensionScores` 就存四个 Int,结构很简单。算法本身没什么技术含量,工作量全在文案上。

## 人格关系匹配:rival 和 partner

每个人格有 `rivalCode` 和 `partnerCode`,指向它的天敌和最佳搭档。比如「六边形悍匪」(PRED) 的对手是 DOOM(人形末日钟),搭档是 WORK(金牌老黄牛)。

两个人都测完之后,系统会根据双方的人格编码给出相处建议。匹配逻辑分三层:

1. 先查是不是 rival/partner 关系——这两种有手写的专属毒舌文案,比如 rival 的文案会写"你俩在一个工位三天之内必出事故"
2. 2. 如果不是,看四个维度的同向数量:有3个以上维度同向的,走"互补型"文案模板;刚好2个同向的,走"中性相处"模板;只有0-1个同向的,走"谨慎相处"模板
3. 3. 每个模板有3-4条文案随机抽取,避免重复感
16种人格两两组合有120种,全写定制文案不现实。用这个分层规则之后,我手写的文案量从120组降到了大概40组,剩下的靠模板 + 随机组合覆盖。

## 海报生成:ImageRenderer 的主线程陷阱

结果页的分享海报是用户传播的核心载体。我的做法是纯 SwiftUI 渲染:把人格标签、slogan、用户昵称组合成一个 View,然后用 `ImageRenderer` 导出为图片。

一开始我用的是 `UIGraphicsImageRenderer` + UIHostingController 的老方案,iOS 16 之后换成了 `ImageRenderer`,代码量少了一半多。但上线后收到几个用户反馈说分享出去的海报是纯白图。

排查了一阵发现问题出在这里:我在一个 `Task {}` 异步上下文里调用 `ImageRenderer`,而 `ImageRenderer` 内部需要在主线程渲染。在非主线程调用时它不会 crash,但渲染出来的 `uiImage` 的 scale 会变成 0,导致图片尺寸为空,最终导出就是一张白图。

修复方式很简单,用 `@MainActor` 确保渲染在主线程:

```swift
@MainActor
func renderPoster(view: some View) -> UIImage? {
    let renderer = ImageRenderer(content: view)
        renderer.scale = UIScreen.main.scale
            return renderer.uiImage
            }
            ```
关键是要显式设置 `renderer.scale`。不设置的话,在主线程它会自动取屏幕 scale,但在非主线程它可能拿到 0 或 1,渲染结果就不对。这个坑 Apple 文档里没有明确写,Stack Overflow 上翻了好几个帖子才拼出完整的原因。

## 一些数据

App 今年初上架 App Store,目前版本 1.1。下载量大概在几百级别,还在冷启动阶段,没有投广告预算,主要靠用户测完分享海报带自然流量。

我统计了一下,测试完成后点分享的比例大概在 35% 左右,这个数字比我预期的高。分享率最高的人格不是听起来最厉害的「六边形悍匪」,而是「优雅吸血鬼」和「精神状态堪忧」这种自嘲型标签。看来大家更愿意分享的是"看我多惨多真实",而不是"看我多牛"。这个发现让我后续调了几个人格的 slogan 方向,往自嘲和共鸣感靠。

## 最后

这个项目写到现在,我 Excel 里光文案版本就存了47个 sheet,比代码 commit 还多。16种人格 × 2套题包 × 每个人格改了少说五六版,再加上 rival/partner 的相处文案……反正写文案的时间远远超过写 Swift 的时间。

如果你也在做 iOS 独立开发,或者对人格测试类产品的数据模型设计感兴趣,欢迎评论区聊聊。特别是存档数据迁移这块,我现在用的 `decodeIfPresent` 方案只能应对加字段的情况,如果以后要改字段类型或者删字段,估计还得上一套更正式的 migration 方案——如果你有实践经验,真心想听听。
QML 转场效果:滑动推挤、旋转、缩放拉近与抖动 本文介绍四种无需着色器的QML基础转场效果:滑动推挤、旋转、缩放拉近与抖动。均通过直接操作底图的位置、缩放与旋转属性实现,依赖Stage.qml注入的fromImg、toImg及progress参数,利用clip: true裁剪越界内容。效果简洁高效,适用于L0层动画,强调纯属性驱动与直观视觉反馈。 阅读详情

相关推荐

C#与发那科机器人通信实战:从SDK配置到机械臂控制

本文详细介绍了如何使用C#与发那科机器人进行通信,从SDK配置到机械臂控制的完整实战流程。内容包括环境准备、通信连接建立、机械臂运动控制、异常处理与状态监控,以及高级功能实战,帮助开发者快速掌握工业机器人编程技术。

weixin_42524276的博客 459

05 · OpenStack的对象存储 Swift——海量静态数据的“无限仓库“

本文系统解析 OpenStack Swift 对象存储,厘清其与块、文件存储的本质区别:面向永久静态数据(如镜像、图片、备份)的长期存储,采用最终一致性模型。核心为 Account→Container→Object 三级结构,容器不支持嵌套,通过对象名前缀模拟目录。依托三类 Ring(Account/Container/Object)实现分布式定位,基于一致性哈希与副本机制保障高可用与无限扩展。实验环节可完成加盘、分区、挂载及 Ring 构建,验证多副本落点。对比华为 OBS、Ceph 等,凸显其在海量非结

路漫漫其修远兮,吾将上下而求索 590

Quartus II 13.0安装避坑指南:从下载到破解的完整流程(附常见错误解决方案)

本文提供Quartus II 13.0软件的详细安装与破解指南,涵盖从下载准备、路径设置、主程序安装到授权配置的全流程。重点解析了破解过程中生成和修改license.dat文件的核心步骤,并针对“无法找到有效的License文件”等常见错误提供了实用的解决方案,帮助用户快速构建稳定的FPGA开发环境。

weixin_29291863的博客 760

编译期常量不是 Dart 专有的概念

Dart 中的“编译期常量”指在编译阶段即可确定值的常量,如 const secondsPerHour = 60 * 60。此类常量无需运行时计算,而 final 变量可在运行时初始化,如 final startTime = DateTime.now()。const 要求初始值为编译期常量,不可变;final 不限于编译期,但初始化后不可修改。类似概念见于 C++ constexpr、C# const,Swift let 则更接近 Dart final。

侯仕奇的博客 209

华为昇腾Atlas200DK. CANN模型推理——目标检测结果不对(无检测结果)的问题解决

目录前言问题描述问题排查1.后处理模块问题排查2.预处理模块问题排查3.模型问题排查4.算法bug问题排查5.AI板卡问题排查6.模型精度问题排查6.模型推理问题解决:模型输入数据与预处理不同后记 前言 上周我在华为昇腾Atlas200DK中部署nanodet和yolov5时,出现了目标检测结果不对(没有检测到任何物体),困扰了整整三天,最后找到原因并圆满解决,在这里记录一下debug过程。 以上测试均在python中完成。 问题描述 第一天上午,我首先将nanodet由pytorch的.pth模型转换为.

qq_41035283的博客 5604

setoolkit克隆网站获取用户信息

一、环境 kali、DVWA 二、步骤 首先打开kali,输入setoolkit 依次选择选项1-选项2-选项3-选项2 输入钓鱼网站的网址(默认为本地网址) 输入要克隆的网址URL 这里我的网址如图,将网址复制 然后模拟攻击场景,攻击者向受害者发送了一条钓鱼链接,此链接与DVWA的登陆页面完全一样,受害者点击之后并进行登陆信息 点击login之后,用户信息就被setool...

BeatRex的博客 2997

Swift 变量详解:从声明、类型推断到可变性

Swift变量是类型安全的命名容器,使用var声明可变变量,let声明常量,推荐优先使用let以提升安全性。支持类型推断,可省略类型标注,但关键场景建议显式声明。变量需初始化后使用,遵循命名规范(如小驼峰),作用域明确。强调类型安全,禁止隐式转换,需显式处理。可选类型(Optional)用于表示可能为空的值,推荐使用可选绑定或空合运算符避免崩溃。掌握变量声明、作用域与最佳实践,可写出简洁、安全、可读性强的Swift代码。

2402_85743155的博客 130

海洋捕食者算法(MPA)详解:从海洋生态智慧到高性能优化

摘要: 海洋捕食者算法(MPA)是一种基于海洋生态觅食行为的元启发式优化算法,模拟捕食者(如鲨鱼)的布朗运动和莱维飞行策略进行全局与局部搜索。算法分为三阶段:高速比阶段(全局探索)、单位速度比阶段(平衡搜索)和低速比阶段(局部开发),通过精英矩阵和FADs效应(概率扰动)避免早熟收敛。MPA具有参数少、收敛快、寻优能力强等特点,适用于复杂优化问题,其数学模型将生物行为转化为随机游走与自适应策略,并通过收敛因子动态调整探索-开发平衡。实验表明,MPA在多个基准问题上表现优异。

qq_42212808的博客 274

Ceph 对象存储(RGW)与文件系统(CephFS)管理

本文系统介绍Ceph对象存储(RGW)与文件系统(CephFS)的管理机制。重点阐述RGW的realm、zonegroup、zone多站点架构,涵盖S3/Swift接口部署、用户管理、配额控制及跨区域复制;CephFS部分则详解MDS元数据服务、池创建、Kernel/FUSE挂载、目录授权、快照与镜像功能。结合实际命令演示配置验证流程,全面展示两大存储接口在云环境中的应用能力。

xianyuCcCcCCCcc的博客 255

ABAP 大规模数据并行处理实战,六套 Parallel Processing Framework 如何选,性能调优真正该盯住什么

如果今天真的面对那份执行 14 个小时的生产报表,我不会马上把原来的 Loop 改成 50 个aRFC。我会先用 SAT、ST12、SQL Monitor 和 HANA 侧工具确认时间到底花在哪里。如果 90% 时间其实消耗在一条低效 SQL 上,Parallel Processing 只是让 50 个 Worker 同时执行那条低效 SQL,数据库会比原来更痛苦。应该先把串行逻辑本身优化到合理水平。该做 Set-based Processing 的地方先交给 HANA。该避免SELECT。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 149

特殊通信领域场景应用:基于Simulink的数字预失真(DPD)算法仿真建模示例

增益压缩:高功率输入时输出信号的增益下降。相位失真:输入信号的相位随功率变化而改变。带外干扰:非线性失真会引入额外的频谱分量,影响邻道信号。多项式模型:用多项式拟合功率放大器的非线性特性。查找表(LUT):通过离线训练生成预失真映射表。自适应算法:实时调整预失真参数以动态补偿失真。发送端:生成随机比特流并调制为射频信号。预失真模块:对输入信号进行预失真处理。功率放大器模块:模拟非线性失真。接收端:解调信号并评估误码率(BER)。

xiaoheshang_123的博客 274

Swift 数据类型详解:从基础类型到值类型与引用类型

Swift是强类型语言,类型安全是其核心。掌握数据类型是编写高效、安全代码的基础。基础类型包括Int、Double、Bool、String等,推荐使用Int和Double;集合类型如数组、字典、集合分别用于有序、键值、去重场景;元组适合临时组合多值,可选类型处理“可能为空”情况。结构体与枚举为值类型,类为引用类型,优先使用值类型以避免副作用。类型推断简化代码,显式转换确保安全。善用类型别名,慎用Any/AnyObject。理解类型差异,提升代码可维护性与性能。

2402_85743155的博客 428

Allegro技巧----相同模块复用实现快速布局

使用Allegro软件进行PCB Layout设计时,当电路图中有很多路相同的模块,使用模块复用的的操作方法,可以显著提高工作效率,同时也可以使PCB布局在整体上显得美观。 如图,有8个相同的ADC采样电路模块,它们在原理图中的电路也是一样的,对于这多个相同的电路模块,如果一个个元器件布局很明显做了很多重复机械的劳动,效率低下;但是强大的Allegro软件早就考虑到了这点,只需要在PCB中做好其中的一个,则其余相同的模块通过复用的方式,可以快速完成,方便省事还美观。 具体步骤: 1.首先完成一个模块的PC

sinat_15677011的博客 5655

【FDE知识库】(1):AI 编程时代开发语言选型分析,云使用go,企业用java,算法python,底层c

AI 编程时代,开发语言选型需综合考量AI适配度、编译速度、跨平台与学习成本。Python以海量语料和即时执行成首选,适用于AI/ML与原型开发;TypeScript凭借类型系统与秒级构建,成为前端及应用层主流;Go以极速编译与统一风格,契合AI代理高效迭代需求。Rust/C++虽性能强,但编译慢、学习成本高,不适于快速试错。综合推荐:优先选Python、TypeScript、Go,兼顾效率与生态,实现最优AI协作体验。

freewebsys的专栏 561

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

[iOS]Runtime2

为了让你在父类中依然能访问当前对象(也就是子类的实例),编译器在底层会生成一个结构体,叫 : 当调用 时,底层调用的函数是 : 拿着(也就是当前的子类对象)作为消息接收者,但是把方法查找的起点定位在了 (父类)这里需要注意的就是仍然是调用者自己,即先讲一下上篇没讲过的,我们如果缓存未命中,那我们就会进入慢速查找,现在我们来详细的讲解在进入慢速查找的瞬间会再看一遍方法列表,然后立刻调用加锁,因为多线程下别人正在动态添加方法或者扩容,不加锁会崩溃类就绪OC的机制就是在编译期只生成了 结构,当类首次被发送消息时(

wzm20070304的博客 263

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

VS Code + KXApp 开发 iOS 报错排查指南,工程、签名、真机、补全、配置

在 VS Code 里用 KXApp 开发 iOS,报错常不在代码而在环境。本文按失败阶段分五类排查:工程没出现 Xcode 视图(查 .xcodeproj 与 xcode-select)、构建失败(No profiles、Team 签名、CocoaPods 用 .xcworkspace)、真机调试失败(信任、开发者模式、设备未准备好)、没补全或 No such module(等索引、清 clangd 冲突)、设置保存不了(装 xcodeproj gem),每类给现象、日志通道和修法。

2501_91590906的博客 209

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

flutter ios 4.3.a被拒整改方案

本文分享了团队首次推进Flutter项目iOS上架时遭遇4.3.a审核被拒的全过程。历经四次提审失败,因未深入分析根本原因,仅做局部优化,导致问题反复。最终通过复盘、整理被拒文档、结合元数据与IPA-Diff工具分析,发现核心问题是二进制代码相似度过高,源于Flutter项目未深度重构。遂开展为期两周的系统性整改:重构Dart代码、清理冗余、升级Flutter版本、优化元数据与UI设计,降低二进制指纹至0.23,成功通过审核。强调海外上架需环境隔离、专用设备,并愿免费协助解决同类问题。

zdgdq的专栏 185

Appuploader 创建 iOS 描述文件详解,Development / Ad Hoc / App Store

搞不清 iOS 描述文件(Provisioning Profile)该选 Development、Ad Hoc 还是 App Store?本文讲清四种类型各装到哪、哪些要绑设备、能不能上架,重点辨析最容易混的 Development 与 Ad Hoc,说明设备或证书变动后为什么要重建、重建后要重新导入签名,并给出不用 Mac 在 Windows/Linux 上用 Appuploader 新建与重建描述文件的实操步骤,附装机"描述文件不匹配"等常见问题排查。

2501_91373349的博客 237

VS Code 开发 iOS 工程,KXApp 与 Xcode 分工,双工具协同实操

想用 VS Code 写 iOS 又担心脱离 Xcode、搞乱团队工程?本文讲清 KXApp 和 Xcode 的并用关系:它是 Mac 上的 VS Code 扩展、必须装 Xcode 并调用它构建签名,两边共用编译结果(一边编过另一边不用重编)、共用同一份工程文件不迁移,补全用的 buildServer.json 可 gitignore 不影响同事,签名沿用 Xcode 登录的账户,Cmd+B/R/. 快捷键一致,Interface Builder 和 Instruments 仍回 Xcode。

2501_91592143的博客 72

苹果的内核跑上了安卓手机:2,631 Star 的 HakiOS 让 XNU 在 Adreno GPU 上画出 118 帧

HakiOS 把苹果开源的 XNU 内核搬上 Android 手机:自研引导器与驱动、RAM 内运行重启即还原,Metal 在 Adreno GPU 上跑出 118 帧。本文拆解其分层架构、双路线性能对比与法律边界。

话梅糖の优快云 Blog 356

Windows 开发 iOS,Sign in with Apple 苹果登录,KXBuild 真机调试全流程

Sign in with Apple 接入分四步:App ID 开能力并重新生成描述文件,entitlements 加 com.apple.developer.applesignin,用 SignInWithAppleButton 拿 identityToken 交服务端验签,删账号时调 revoke。本文讲清审核指南 4.8 为什么要你提供它、姓名邮箱只给一次、用 user 当主键,并在 Windows 上用 KXBuild 真机测登录,附 1000 报错排查。

2501_91373349的博客 234

Appuploader 配置 iOS Bundle ID,开启推送、iCloud,解决描述文件失效问题

App 代码没动,去开发者后台取消勾选一个能力,再打包就签名失败、描述文件失效——为什么?本文讲清 iOS Bundle ID(App ID)的注册规矩(反向域名、创建后 Identifier 不可改、通配符、App Clip)、用 Appuploader 配置推送/iCloud/App Groups 等 Capabilities 的方法,重点说明能力配置与 Apple 门户实时同步、描述文件是能力的快照,以及取消能力为何导致描述文件失效、怎么重建修复,附改名、删除、通配符等常见问题。

2501_91591841的博客 156

iOS 深度链接配置教程,URL Scheme 与 Universal Links,KXBuild 真机验证

深度链接两种:URL Scheme(myapp://)只改 Info.plist 的 CFBundleURLTypes;Universal Links(https://)要开 Associated Domains、在 entitlements 写 applinks 域名、网站放 /.well-known/apple-app-site-association。讲清两者怎么选、onOpenURL 处理代码,在 Windows 上用 KXBuild 装 Debug 包真机验证,附 CDN 缓存和十个不跳转排查。

2501_91600747的博客 299

手机远程控制电脑哪家强?2026年iOS/安卓/鸿蒙横评实测,ToDesk/向日葵谁更流畅

手机远程控制电脑已成刚需,ToDesk凭借全平台覆盖、低延迟、无广告、免费不限速等优势,成为最佳选择。其iOS、安卓、鸿蒙及Mac系统均支持,实测连接快、操作流畅,虚拟键盘、外接键鼠、互动批注等功能体验出色。相较之下,向日葵存在限时踢线、传输慢、广告多等痛点。选购建议:无论用何种手机,首选ToDesk,实现高效便捷的远程办公与协助。

lx08113的博客 308

uni-app iOS 离线打包教程,Windows KXBuild 本地生成 IPA,页面秒推真机

uni-app 云打包老排队、次数受限、改一次 manifest 原生配置就得重打?用 KXBuild 的 HBuilderX 插件在 Windows 本地做 uni-app 离线打包 iOS:导入同版本离线 SDK、填好 AppKey 和证书,就能运行到 iPhone 真机,改页面用"推送"几秒生效,最后生成可上传 App Store Connect 的 ipa,全程不用云打包。附 AppKey 错误、版本不匹配白屏、相机闪退等 9 个常见问题排查。

2501_91510632的博客 207

go消息推送之极光推送 (JPush REST API + SDK,覆盖安卓与iOS)

使用 gorush有个绕不开的问题:国内安卓设备上 FCM 基本不可达,华为、小米、OPPO、vivo 各自为政——此时可用极光推送(JPush)作解决方案。它的思路和前面几家都不一样:App 集成极光 SDK 后拿到统一的 RegistrationID,服务端发一条 REST 请求,极光云端自动把消息路由到 APNs、各家厂商通道或极光自有长连接。这里给出了:一个用纯标准库直接调用极光的;另一个用社区维护的,类型化参数,接口注释与官方文档逐条对应。两个功能相同,可放在一起对比学习。

qq_40467670的博客 187
上一篇: 独立开发一个健康记录 App,聊聊 SwiftData 数据建模和拨轮交互的踩坑过程
下一篇: iOS 专注 App 架构实践:用 struct ViewModel 全面替代 ObservableObject,代码量砍掉三分之一
SameX-4869
博客等级 码龄18年 3354粉丝 657原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值