V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
gefangshuai
V2EX  ›  分享创造

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

  •  
  •   gefangshuai · 3 天前 · 612 次点击

    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 条附言  ·  3 天前

    已增加模板功能:

    14 条回复    2026-03-17 14:23:31 +08:00
    gap
        1
    gap  
       3 天前 via iPhone
    感觉会有用,感谢🙏
    gefangshuai
        2
    gefangshuai  
    OP
       3 天前
    @gap #1 谢谢支持
    dcncy
        3
    dcncy  
       2 天前
    在 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 closure #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  
       2 天前
    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  
       2 天前
    有点太多了,先不贴了。
    gefangshuai
        6
    gefangshuai  
    OP
       2 天前
    @dcncy #5 请问 App 版本号是哪个版本?
    刚开始确实有操作系统兼容性问题导致的闪退,后来优化后用户反馈解决了: https://github.com/lifedever/TaskTick/issues/1
    gefangshuai
        7
    gefangshuai  
    OP
       2 天前
    @dcncy #5 感谢反馈,已经看到版本号了,1.1.0 版本应该是解决了,建议升级试一下。
    dcncy
        8
    dcncy  
       2 天前
    @gefangshuai #6 我使用 homebrew 安装的,是 1.0.7 版本。已从 github 下载 1.1.0 版本,确实可以了。有劳了
    dcncy
        9
    dcncy  
       2 天前
    调度机制能否添加一个:系统启动后执行 ?
    gefangshuai
        10
    gefangshuai  
    OP
       2 天前
    @dcncy #9 是指不打开 App 就能自动后台运行吗?开机就能自动运行?不依赖于 App 是否打开吗?
    OliverDD
        11
    OliverDD  
       2 天前
    反馈下前端问题。暗黑模式“下载”和“star”按钮都是白色底色看不见
    gefangshuai
        12
    gefangshuai  
    OP
       2 天前
    @OliverDD #11 收到,谢谢反馈
    Astralume
        13
    Astralume  
       2 天前
    好东西,点赞!
    gefangshuai
        14
    gefangshuai  
    OP
       2 天前 via iPhone
    @Astralume 感谢
    关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   Solana   ·   5375 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 08:57 · PVG 16:57 · LAX 01:57 · JFK 04:57
    ♥ Do have faith in what you're doing.