Ace Citizenship
一款我为帮助妻子通过美国公民身份测试而构建的免费iOS应用。她通过了。现在它帮助其他人实现同样的梦想。
摘要
当我妻子开始准备美国入籍测试时,我找不到符合我标准的学习应用。
Ace Citizenship使用间隔重复涵盖所有128道官方USCIS公民问题——这与使Duolingo有效的技术相同。
该应用完全免费,并将保持完全免费。没有广告,没有订阅,没有陷阱。
起源故事
我为一位观众构建了Ace Citizenship:我的妻子。她需要通过USCIS入籍测试,我想给她最好的成功工具。
市场上现有的应用令人失望。侵入性广告打断学习。订阅付费墙阻止访问基本内容。
我知道我可以做得更好。所以我从零开始设计、品牌化和开发整个应用。
应用
Ace Citizenship提供高端体验而无高端价格。界面简洁、专注,尊重您的时间。
视觉设计
我创造了一种统一的3D视觉语言——梦幻、乐观、明显的美国风格——让学习不再枯燥。
每幅插图都是使用我在100,000多次图像生成中完善的自定义提示在Midjourney中生成的。
在dreamofelectric.com查看更多我的AI生成艺术作品。 dreamofelectric.com.
间隔重复
Ace Citizenship的核心是一种优化学习环节的间隔重复算法。
这种基于证据的方法在提高记忆力的同时大大减少了学习时间。
该应用跟踪进度并适应个人学习模式,提供智能且响应迅速的个性化体验。
个性化学习
一些USCIS问题的答案取决于您的具体情况——您的居住州、您的国会代表。Ace Citizenship会根据您的实际测试条件个性化这些问题。
这种对细节的关注意味着用户不只是在记忆通用答案;他们在学习测试当天需要的确切信息。
技术实现
Ace Citizenship完全使用SwiftUI为iOS构建,充分利用Apple的现代框架。
架构易于维护且高效。
遵循Apple的Human Interface Guidelines确保应用感觉原生且熟悉。
内部机制
以下是使应用有效的代码库中的一些有趣模式。
间隔重复算法
核心学习引擎优先处理您困难的问题。当您答错时,该卡片进入单独的队列,混入下一个学习环节。
func completeCard(correct: Bool) {
if !currentSet.isEmpty {
let card = currentSet.removeFirst()
remainingCards -= 1
if correct {
cards.append(card) // Back to main deck
} else {
incorrectCards.append(card) // Priority requeue
}
}
}
func prepareNextSet() {
// Prioritize missed questions in next round
let incorrectCount = min(incorrectCards.count, 10)
let newCardsCount = 10 - incorrectCount
currentSet = Array(incorrectCards.prefix(incorrectCount))
incorrectCards.removeFirst(incorrectCount)
currentSet += Array(cards.prefix(newCardsCount))
}
州特定个性化
该应用维护着所有50个州及领地的数据库,已更新至当前第119届国会。
struct StateInfo {
let name: String
let senators: [String]
let governor: String
let capital: String
}
// Updated for 119th Congress (January 2025)
let stateInformation: [String: StateInfo] = [
"California": StateInfo(
name: "California",
senators: ["Adam Schiff", "Alex Padilla"],
governor: "Gavin Newsom",
capital: "Sacramento"
),
// ... all 50 states + territories
]
类型安全主题
主题系统使用Swift的KeyPath功能实现编译时安全性。
struct Theme {
struct ColorSet {
let background: Color
let surface: Color
let onBackground: Color
let blue: Color
let green: Color
let red: Color
}
static func color(
_ keyPath: KeyPath<ColorSet, Color>,
for colorScheme: ColorScheme
) -> Color {
let colorSet = colorScheme == .dark
? darkMode
: lightMode
return colorSet[keyPath: keyPath]
}
}
// Usage: Theme.color(\.blue, for: colorScheme)
她通过了
我妻子使用Ace Citizenship准备她的入籍测试。她通过了。今天,她是美国公民。
那一刻——我们一起站在USCIS办公室,她手持入籍证书——让每一小时的开发都值得。
帮助他人
在我妻子成功后,我在App Store发布了Ace Citizenship。它获得了5星评价,用户一致报告该应用帮助他们通过了公民身份测试。
一位用户写道:"我每天用这个应用练习30分钟,坚持了一个月就通过了!"
该应用继续帮助移民实现成为美国公民的目标,一次一个学习环节。
感谢
Ace Citizenship代表了我在构建软件方面的热爱:为我关心的人解决真实问题,然后与世界分享该解决方案。
这个项目让我能够跨越整个产品生命周期工作。
该应用是免费的,并将保持免费。因为有些事情——比如帮助人们成为他们选择称之为家的国家的公民——比收入更重要。