TaskTick - macOS 原生定时任务管理工具 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
gefangshuai
V2EX    分享创造

TaskTick - macOS 原生定时任务管理工具

  •  
  •   gefangshuai 5 天前 650 次点击

    TaskTick 是一款 macOS 原生定时任务管理应用,用 SwiftUI + SwiftData 开发,完全替代 crontab 和 launchd 的手动配置。

    主要特点:

    • 菜单栏常驻,后台静默运行
    • 灵活调度:日期、时间、重复周期,类似「提醒事项」的直觉设置
    • 支持 Bash 、Python 、Ruby 、Node.js 等脚本执行
    • 自动记录执行日志( stdout/stderr 、退出码、耗时)
    • 任务成功/失败时推送 macOS 原生通知
    • 支持一键导入系统 crontab
    • 中英双语界面
    • 支持 Homebrew 安装:brew tap lifedever/tap && brew install --cask task-tick
    • 开源免费( GPL-3.0 )

    TaskTick Screenshot

    第 1 条附言    4 天前

    已增加模板功能:

    14 条回复    2026-03-17 14:23:31 +08:00
    gap
        1
    gap  
       4 天前 via iPhone
    感觉会有用,感谢
    gefangshuai
        2
    gefangshuai  
    OP
       4 天前
    @gap #1 谢谢支持
    dcncy
        3
    dcncy  
       4 天前
    在 M1 MacOS15 的设备上启动直接崩溃。日志有点大,我分多次贴出来。

    -------------------------------------
    Translated Report (Full Report Below)
    -------------------------------------

    Process: TaskTick [76245]
    Path: /Applications/TaskTick.app/Contents/MacOS/TaskTick
    Identifier: com.lifedever.TaskTick
    Version: 1.0.7 (202603160728)
    Code Type: ARM-64 (Native)
    Parent Process: launchd [1]
    User ID: 501

    Date/Time: 2026-03-16 17:02:54.4420 +0800
    OS Version: macOS 15.7.4 (24G517)
    Report Version: 12
    Anonymous UUID: E2849EFF-E2BA-9FE0-E1AA-BDDF7FF71FE1


    Time Awake Since Boot: 740000 seconds

    System Integrity Protection: enabled

    Crashed Thread: 0 Dispatch queue: com.apple.main-thread

    Exception Type: EXC_BREAKPOINT (SIGTRAP)
    Exception Codes: 0x0000000000000001, 0x00000001b02711f8

    Termination Reason: Namespace SIGNAL, Code 5 Trace/BPT trap: 5
    Terminating Process: exc handler [76245]

    Thread 0 Crashed:: Dispatch queue: com.apple.main-thread
    0 libswiftCore.dylib 0x1b02711f8 _assertionFailure(_:_:file:line:flags:) + 176
    1 TaskTick 0x104f104c4 closure #1 in variable initialization expression of static NSBundle.module + 612
    2 TaskTick 0x104f10250 one-time initialization function for module + 12
    3 libdispatch.dylib 0x19e8d185c _dispatch_client_callout + 16
    4 libdispatch.dylib 0x19e8baa28 _dispatch_once_callout + 32
    5 TaskTick 0x104e88dec specialized static L10n.findBundle(for:) + 1088
    6 TaskTick 0x104e88708 closure #1 in variable initialization expression of static L10n._bundle + 248
    7 TaskTick 0x104e88600 one-time initialization function for _bundle + 12
    8 libdispatch.dylib 0x19e8d185c _dispatch_client_callout + 16
    9 libdispatch.dylib 0x19e8baa28 _dispatch_once_callout + 32
    10 TaskTick 0x104efa99c TaskTickApp.body.getter + 4592
    11 SwiftUI 0x1cfd58b3c partial apply for closure #1 in AppBodyAccessor.updateBody(of:changed:) + 44
    12 SwiftUICore 0x205a1cc10 BodyAccessor.setBody(_:) + 1204
    13 SwiftUI 0x1cfd57450 AppBodyAccessor.updateBody(of:changed:) + 152
    14 SwiftUICore 0x205a1f300 closure #1 in DynamicBody.updateValue() + 600
    15 SwiftUICore 0x205a1ed2c DynamicBody.updateValue() + 928
    16 SwiftUICore 0x205aac998 partial apply for implicit cloure #1 in closure #1 in closure #1 in Attribute.init<A>(_:) + 32
    17 AttributeGraph 0x1cffe9728 AG::Graph::UpdateStack::update() + 524
    18 AttributeGraph 0x1cffe9f94 AG::Graph::update_attribute(AG::data::ptr<AG::Node>, unsigned int) + 420
    19 AttributeGraph 0x1cfff17b0 AG::Graph::value_ref(AG::AttributeID, unsigned int, AGSwiftMetadata const*, unsigned char&) + 272
    20 AttributeGraph 0x1d0008bb8 AGGraphGetValue + 308
    21 SwiftUI 0x1cf83bd34 static MenuBarExtraStyleModifier._makeInputs(modifier:inputs:) + 248
    22 SwiftUI 0x1cf07b01c static _SceneModifier<>._makeScene(modifier:inputs:body:) + 320
    23 SwiftUI 0x1cf07bc6c static ModifiedContent<>._makeScene(scene:inputs:) + 544
    24 SwiftUI 0x1cf07bddc closure #2 in static ModifiedContent<>._makeScene(scene:inputs:) + 304
    25 SwiftUI 0x1cf07c684 static _SceneModifier_Content._makeScene(scene:inputs:) + 396
    26 SwiftUI 0x1cf07bddc closure #2 in static ModifiedContent<>._makeScene(scene:inputs:) + 304
    27 SwiftUI 0x1cf07b03c static _SceneModifier<>._makeScene(modifier:inputs:body:) + 352
    28 SwiftUI 0x1cf07bc6c static ModifiedContent<>._makeScene(scene:inputs:) + 544
    29 SwiftUI 0x1cf07b52c static _SceneModifier._makeScene(modifier:inputs:body:) + 764
    30 SwiftUI 0x1cf07bc6c static ModifiedContent<>._makeScene(scene:inputs:) + 544
    31 SwiftUI 0x1cf6380b8 _TupleScene.MakeList.visit<A>(type:) + 444
    32 SwiftUI 0x1cf823a1c TypeConformance<>.visitType<A>(visitor:) + 120
    33 SwiftUI 0x1cf637a1c static _TupleScene._makeScene(scene:inputs:) + 1596
    34 SwiftUI 0x1cfd569fc closure #1 in AppGraph.init<A>(app:) + 936
    35 SwiftUI 0x1cfd57138 closure #1 in AppGraph.instantiateOutputs() + 952
    36 SwiftUI 0x1cfd56be8 AppGraph.instantiateOutputs() + 380
    37 SwiftUICore 0x205bf3604 GraphHost.instantiate() + 224
    38 SwiftUI 0x1ced5d7bc closure #1 in closure #1 in runApp<A>(_:) + 80
    39 SwiftUICore 0x205a23c1c static Update.dispatchImmediately<A>(reason:_:) + 316
    40 SwiftUI 0x1ced5d748 closure #1 in runApp<A>(_:) + 236
    41 SwiftUI 0x1ced5d648 runApp<A>(_:) + 92
    42 SwiftUI 0x1cf0be5c0 static App.main() + 224
    43 TaskTick 0x104f000d4 TaskTick_main + 64
    44 dyld 0x19e6ceb98 start + 6076

    Thread 1:
    0 libsystem_pthread.dylib 0x19ea6ab6c start_wqthread + 0

    Thread 2:
    0 libsystem_pthread.dylib 0x19ea6ab6c start_wqthread + 0


    Thread 0 crashed with ARM Thread State (64-bit):
    x0: 0x0000000152d05a08 x1: 0x0000000200000003 x2: 0xfffffffffffffff0 x3: 0x0000600001228830
    x4: 0x0000600001228800 x5: 0x0000000000000013 x6: 0x0000000000000020 x7: 0x0000000000000000
    x8: 0xfffffffe00000000 x9: 0x0000000200000003 x10: 0x0000000000000003 x11: 0x0000000000000780
    x12: 0x00000000000007fb x13: 0x00000000000007fd x14: 0x000000008781d809 x15: 0x000000008761d00a
    x16: 0x0000000087800000 x17: 0x0000000000000009 x18: 0x0000000000000000 x19: 0x4000600000e3db30
    x20: 0x000000016af89d70 x21: 0xc000000000000033 x22: 0x00006000038048c0 x23: 0x0000000104f1d9c0
    x24: 0xd00000000000007e x25: 0x0000000104f40000 x26: 0x0000000104f49000 x27: 0x000000015480dff0
    x28: 0x000000020dfe6980 fp: 0x000000016af89d10 lr: 0x00000001b02711f8
    sp: 0x000000016af89c90 pc: 0x00000001b02711f8 cpsr: 0x60001000
    far: 0x0000000000000000 esr: 0xf2000001 (Breakpoint) brk 1
    dcncy
        4
    dcncy  
       4 天前
    Binary Images:
    0x104e70000 - 0x104f3ffff com.lifedever.TaskTick (1.0.7) <f883cc7f-1c6d-3000-b1e2-bcccca292627> /Applications/TaskTick.app/Contents/MacOS/TaskTick
    0x105328000 - 0x105333fff libobjc-trampolines.dylib (*) <9a87f143-aa9d-3c46-b2e8-b3fb9215e33e> /usr/lib/libobjc-trampolines.dylib
    0x1b023d000 - 0x1b07abf3f libswiftCore.dylib (*) <93a84760-9028-3a6f-aca6-087a0fdd9d9f> /usr/lib/swift/libswiftCore.dylib
    0x19e8b6000 - 0x19e8fc75f libdispatch.dylib (*) <63a54ce1-2ab6-3673-82e4-d8489d811475> /usr/lib/system/libdispatch.dylib
    0x1ce8b7000 - 0x1cffde41f com.apple.SwiftUI (6.5.4) <20a22d4f-7c44-3b84-929a-b83cb311c984> /System/Library/Frameworks/SwiftUI.framework/Versions/A/SwiftUI
    0x205594000 - 0x20615619f com.apple.SwiftUICore (6.5.4) <73b037d1-2d43-374b-a87c-79e26b7ad6b0> /System/Library/Frameworks/SwiftUICore.framework/Versions/A/SwiftUICore
    0x1cffdf000 - 0x1d0021d9f com.apple.AttributeGraph (6.5.1) <536bbee2-bada-3d4c-961e-22e7601aeca7> /System/Library/PrivateFrameworks/AttributeGraph.framework/Versions/A/AttributeGraph
    0x19e6c8000 - 0x19e76357b dyld (*) <057e5157-4105-3787-b549-e605eb246448> /usr/lib/dyld
    0x0 - 0xffffffffffffffff ??? (*) <00000000-0000-0000-0000-000000000000> ???
    0x19ea69000 - 0x19ea75a77 libsystem_pthread.dylib (*) <c0519bf8-8fc4-3222-a4a7-d98af817277c> /usr/lib/system/libsystem_pthread.dylib

    External Modification Summary:
    Calls made by other processes targeting this process:
    task_for_pid: 0
    thread_create: 0
    thread_set_state: 0
    Calls made by this process:
    task_for_pid: 0
    thread_create: 0
    thread_set_state: 0
    Calls made by all processes on this machine:
    task_for_pid: 0
    thread_create: 0
    thread_set_state: 0

    VM Region Summary:
    ReadOnly portion of Libraries: Total=1.2G resident=0K(0%) swapped_out_or_unallocated=1.2G(100%)
    Writable regions: Total=718.4M written=385K(0%) resident=385K(0%) swapped_out=0K(0%) unallocated=718.0M(100%)

    VIRTUAL REGION
    REGION TYPE SIZE COUNT (non-coalesced)
    =========== ======= =======
    Activity Tracing 256K 1
    AttributeGraph Data 1024K 1
    ColorSync 16K 1
    CoreGraphics 16K 1
    Foundation 16K 1
    Kernel Alloc Once 32K 1
    MALLOC 707.5M 43
    MALLOC guard page 384K 24
    SQLite page cache 128K 1
    STACK GUARD 56.0M 3
    Stack 9264K 3
    VM_ALLOCATE 32K 2
    __AUTH 2075K 292
    __AUTH_CONST 36.9M 471
    __CTF 824 1
    __DATA 10.1M 452
    __DATA_CONST 17.8M 477
    __DATA_DIRTY 1027K 138
    __FONT_DATA 2352 1
    __INFO_FILTER 8 1
    __LINKEDIT 618.6M 3
    __OBJC_RO 61.4M 1
    __OBJC_RW 2397K 1
    __TEXT 575.9M 494
    __TPRO_CONST 128K 2
    mapped file 57.8M 12
    page table in kernel 385K 1
    shared memory 1376K 13
    =========== ======= =======
    TOTAL 2.1G 2442



    -----------
    Full Report
    -----------

    {"app_name":"TaskTick","timestamp":"2026-03-16 17:02:54.00 +0800","app_version":"1.0.7","slice_uuid":"f883cc7f-1c6d-3000-b1e2-bcccca292627","build_version":"202603160728","platform":1,"bundleID":"com.lifedever.TaskTick","share_with_app_devs":0,"is_first_party":0,"bug_type":"309","os_version":"macOS 15.7.4 (24G517)","roots_installed":0,"name":"TaskTick","incident_id":"01C14076-A28C-41B9-8610-AB71BA0D93D5"}
    {
    "uptime" : 740000,
    "procRole" : "Foreground",
    "version" : 2,
    "userID" : 501,
    "deployVersion" : 210,
    "modelCode" : "Macmini9,1",
    "coalitionID" : 59796,
    "osVersion" : {
    "train" : "macOS 15.7.4",
    "build" : "24G517",
    "releaseType" : "User"
    },
    "captureTime" : "2026-03-16 17:02:54.4420 +0800",
    "codeSigningMonitor" : 1,
    "incident" : "01C14076-A28C-41B9-8610-AB71BA0D93D5",
    "pid" : 76245,
    "translated" : false,
    "cpuType" : "ARM-64",
    "roots_installed" : 0,
    "bug_type" : "309",
    "procLaunch" : "2026-03-16 17:02:54.3407 +0800",
    "procStartAbsTime" : 17887001665419,
    "procExitAbsTime" : 17887004082221,
    "procName" : "TaskTick",
    "procPath" : "\/Applications\/TaskTick.app\/Contents\/MacOS\/TaskTick",
    "bundleInfo" : {"CFBundleShortVersionString":"1.0.7","CFBundleVersion":"202603160728","CFBundleIdentifier":"com.lifedever.TaskTick"},
    "storeInfo" : {"deviceIdentifierForVendor":"FD15E1D5-6069-54F4-8468-E4CB7DB4710E","thirdParty":true},
    "parentProc" : "launchd",
    "parentPid" : 1,
    "coalitionName" : "com.lifedever.TaskTick",
    "crashReporterKey" : "E2849EFF-E2BA-9FE0-E1AA-BDDF7FF71FE1",
    "appleIntelligenceStatus" : {"state":"unavailable","reasons":["regionIneligible","selectedSiriLanguageIneligible","countryLocationIneligible"]},
    "codeSigningID" : "com.lifedever.TaskTick",
    "codeSigningTeamID" : "",
    "codeSigningFlags" : 570425857,
    "codeSigningValidationCategory" : 10,
    "codeSigningTrustLevel" : 4294967295,
    "codeSigningAuxiliaryInfo" : 0,
    "instructionByteStream" : {"beforePC":"IAAg1MEF+LfpAwC54gMDquMDBKrkAwWq5QMGquYDB6rnAwiqIwMAlA==","atPC":"IAAg1CgAgFKJEoBS6BMAuekHAPlIAIBS6AMAOcAnAJAAkByRwycAkA=="},
    "bootSessionUUID" : "64CB501C-6A43-40B3-8730-6EA521836CCB",
    "sip" : "enabled",
    "exception" : {"codes":"0x0000000000000001, 0x00000001b02711f8","rawCodes":[1,7250317816],"type":"EXC_BREAKPOINT","signal":"SIGTRAP"},
    "termination" : {"flags":0,"code":5,"namespace":"SIGNAL","indicator":"Trace\/BPT trap: 5","byProc":"exc handler","byPid":76245},
    "os_fault" : {"process":"TaskTick"},
    "extMods" : {"caller":{"thread_create":0,"thread_set_state":0,"task_for_pid":0},"system":{"thread_create":0,"thread_set_state":0,"task_for_pid":0},"targeted":{"thread_create":0,"thread_set_state":0,"task_for_pid":0},"warnings":0},
    "faultingThread" : 0,
    "threads" :
    dcncy
        5
    dcncy  
       4 天前
    有点太多了,先不贴了。
    gefangshuai
        6
    gefangshuai  
    OP
       4 天前
    @dcncy #5 请问 App 版本号是哪个版本?
    刚开始确实有操作系统兼容性问题导致的闪退,后来优化后用户反馈解决了: https://github.com/lifedever/TaskTick/issues/1
    gefangshuai
        7
    gefangshuai  
    OP
       4 天前
    @dcncy #5 感谢反馈,已经看到版本号了,1.1.0 版本应该是解决了,建议升级试一下。
    dcncy
        8
    dcncy  
       4 天前
    @gefangshuai #6 我使用 homebrew 安装的,是 1.0.7 版本。已从 github 下载 1.1.0 版本,确实可以了。有劳了
    dcncy
        9
    dcncy  
       4 天前
    调度机制能否添加一个:系统启动后执行 ?
    gefangshuai
        10
    gefangshuai  
    OP
       4 天前
    @dcncy #9 是指不打开 App 就能自动后台运行吗?开机就能自动运行?不依赖于 App 是否打开吗?
    OliverDD
        11
    OliverDD  
       4 天前
    反馈下前端问题。暗黑模式“下载”和“star”按钮都是白色底色看不见
    gefangshuai
        12
    gefangshuai  
    OP
       4 天前
    @OliverDD #11 收到,谢谢反馈
    Astralume
        13
    Astralume  
       3 天前
    好东西,点赞!
    gefangshuai
        14
    gefangshuai  
    OP
       3 天前 via iPhone
    @Astralume 感谢
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1371 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 22ms UTC 17:15 PVG 01:15 LAX 10:15 JFK 13:15
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86