Skip to content

kyinwind/TaskKit

Repository files navigation

TaskKit

介绍: 当我们的app需要设置一些任务,用来引导用户完成这些学习任务,逐步熟悉app功能的时候,可以考虑使用TaskKit。 当需要针对用户完成任务的情况,为用户划分不同level的时候,也可以考虑使用TaskKit。

主要功能:

  • 支持用户在app初始化的时候定义引导任务,以及激活的奖励。
  • 当任务完成时,自动写入UserDefaults
  • 当一个或多个任务完成,触发解锁奖励时,NotificationCenter.default.post(name: .rewardUnlocked, object: reward),通知主app
  • 提供一个展示任务和奖励的view:CheckListView

2025-12-06:发布 0.1 版
2025-12-17:发布0.2版

使用方法:

  1. 初始化 checkpoint 方法
@main
struct MyApp: App {
    init() {
        //原有代码
        。。。
        //初始化 TaskKit
        initTaskKit()
    }

    var body: some Scene {
        WindowGroup {
            ContentView()
        }
    }
}

func initTaskKit() {
    //初始化 app 有多少 task
    let tasks = [
            AppTask(
                id: "create_gongke",
                title: "创建功课计划",
                description: "根据功课向导完成了功课的创建",
                event: TaskEvent.finishFeature("create_gongke"),
                rewardId: "佛学知识测试题"
            ),
            AppTask(
                id: "finish_songdujingshu",
                title: "完成一部经书的诵读",
                description: "打开一部经书,并完成了诵读",
                event: TaskEvent.finishFeature("finish_songdujingshu"),
                rewardId: "佛学知识测试题"
            ),
            AppTask(
                id: "finish_readshanshu",
                title: "完成一次阅读善书",
                description: "打开一本善书并阅读",
                event: TaskEvent.finishFeature("finish_readshanshu"),
                rewardId: "佛学知识测试题"
            ),
            AppTask(
                id: "finish_baichan",
                title: "完成一次拜忏",
                description: "新建一个拜忏,并完成",
                event: TaskEvent.finishFeature("finish_baichan"),
                rewardId: "佛学知识测试题"
            ),
            AppTask(
                id: "finish_oneweek",
                title: "连续一周完成功课",
                description: "坚持连续一周完成功课,中间没有间断",
                event: TaskEvent.finishFeature("finish_oneweek"),
                rewardId: "佛学入门书籍下载链接"
            ),
            AppTask(
                id: "finish_onemonth",
                title: "连续一个月完成功课",
                description: "坚持连续一个月完成功课,中间没有间断",
                event: TaskEvent.finishFeature("finish_onemonth"),
                rewardId: "海量佛学视频下载链接"
            ),
        ]

    //有多少奖励,以及奖励和task对应关系
    let appRewards = [
        Reward(
            id: "r1",
            title: "新手礼包",
            description: "完成前 4 个新手任务即可领取奖励",
            condition: .allTasksDone(taskIds: [
                "create_gongke",
                "finish_songdujingshu",
                "finish_readshanshu",
                "finish_baichan"
            ])
        ),

        Reward(
            id: "r2",
            title: "精进小达人",
            description: "连续一周完成功课即可解锁",
            condition: .allTasksDone(taskIds: [
                "finish_oneweek"
            ])
        ),

        Reward(
            id: "r3",
            title: "精进大师",
            description: "连续一个月完成功课即可解锁",
            condition: .allTasksDone(taskIds: [
                "finish_onemonth"
            ])
        )
    ]
    //配置 TaskKit
    TaskKit.configure(tasks:tasks,rewards: appRewards)
        
}
  1. 监听奖励:
.onReceive(NotificationCenter.default.publisher(for: .rewardUnlocked)) { note in
    if let reward = note.object as? Reward {
        print("奖励解锁: \(reward.title)")
    }
}
  1. 发送事件:
EventCenter.shared.send(.finishFeature("create_gongke"))
  1. 展示任务列表:
//显示一个代表当前用户等级的图片,点击后进入CheckListView
struct UserLevelView: View {
    @State var userLevel: String = "r0"
    var body: some View {
        let title = "完成 app 使用体验,解锁奖励"
        let remarks = "奖励包括:佛学知识测试题,资料、佛学小游戏等"
        
        NavigationLink(
            destination: ChecklistView(
                title:title,
                tasks: TaskKit.tasks,
                remarks: remarks,
                rewards: TaskKit.rewards
            )
        ) {
            Image(userLevel)  //假设已经存在以用户的level命名的图片在assets
                .resizable()
                .foregroundColor(Color.blue)
                .frame(width:45,height: 45)
                .cornerRadius(20)
        }
        
        .onAppear(){
            let unlocked = RewardStore.shared.unlocked
            var maxUnlocked: String? {
                // 1. Set 转数组
                let sortedArray = unlocked.sorted()
                // 2. 取最后一个元素(升序排序后最后一个是最大的)
                return sortedArray.last
            }
            userLevel = maxUnlocked ?? "r0"
        }
    }
}

(示例)

包文件说明

TaskKit 配置应用的初始化入口
AppTask 定义应用中需要引导用户完成的任务
Reward 定义完成任务后可以获得的奖励
RewardStore 封装了奖励的加载和保存
TaskStore 封装了任务的完成、查询等逻辑
EventCenter 封装了事件的发送、订阅逻辑,定义了事件的多种类型
RewardEngine 封装了奖励的解锁逻辑,解锁奖励,并通知外部app
TaskEngine 封装了任务的完成逻辑,完成任务后更新TaskProgress,并计算是否解锁奖励
CheckListView   封装了任务和奖励的展示逻辑,外部app可以基于此view展示任务列表

About

为用户设置 app 的引导完成任务,并记录用户完成情况,解锁奖励

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages