{"id":50801764,"url":"https://github.com/jaywcjlove/MyAppListKit","last_synced_at":"2026-06-30T03:00:35.636Z","repository":{"id":264904376,"uuid":"894633938","full_name":"jaywcjlove/MyAppListKit","owner":"jaywcjlove","description":"Encapsulation of My Personal App List","archived":false,"fork":false,"pushed_at":"2026-05-29T08:57:18.000Z","size":189,"stargazers_count":13,"open_issues_count":0,"forks_count":2,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-05-29T10:24:06.582Z","etag":null,"topics":["ios","ios-swift","jaywcjlove","macos","swift","swift-app","swift-package","swift-package-manager","swiftui","swiftui-app","swiftui-application"],"latest_commit_sha":null,"homepage":"","language":"Swift","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/jaywcjlove.png","metadata":{"files":{"readme":"README-zh.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null},"funding":{"github":["jaywcjlove"]}},"created_at":"2024-11-26T17:47:06.000Z","updated_at":"2026-05-29T08:56:37.000Z","dependencies_parsed_at":"2024-12-14T12:25:49.428Z","dependency_job_id":"8294ed88-c5f5-407a-b86d-6b5f625434a3","html_url":"https://github.com/jaywcjlove/MyAppListKit","commit_stats":null,"previous_names":["jaywcjlove/myapplistkit"],"tags_count":93,"template":false,"template_full_name":null,"purl":"pkg:github/jaywcjlove/MyAppListKit","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jaywcjlove%2FMyAppListKit","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jaywcjlove%2FMyAppListKit/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jaywcjlove%2FMyAppListKit/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jaywcjlove%2FMyAppListKit/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jaywcjlove","download_url":"https://codeload.github.com/jaywcjlove/MyAppListKit/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jaywcjlove%2FMyAppListKit/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34950330,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-30T02:00:05.919Z","response_time":92,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ios","ios-swift","jaywcjlove","macos","swift","swift-app","swift-package","swift-package-manager","swiftui","swiftui-app","swiftui-application"],"created_at":"2026-06-12T21:00:28.530Z","updated_at":"2026-06-30T03:00:35.631Z","avatar_url":"https://github.com/jaywcjlove.png","language":"Swift","funding_links":["https://github.com/sponsors/jaywcjlove"],"categories":["Utilities and Extensions"],"sub_categories":[],"readme":"\u003cp align=\"right\"\u003e\n\u003ca href=\"./README.md\"\u003eEnglish\u003c/a\u003e\n\u003c/p\u003e\n\n\u003cdiv markdown=\"1\"\u003e\n  \u003csup\u003e使用\u003ca href=\"https://wangchujiang.com/#/app\" target=\"_blank\"\u003e我的应用\u003c/a\u003e，也是对我的\u003ca href=\"https://wangchujiang.com/#/sponsor\" target=\"_blank\"\u003e支持\u003c/a\u003e：\u003c/sup\u003e\n  \u003cbr\u003e\n  \u003ca target=\"_blank\" href=\"https://jaywcjlove.github.io/maslink/?id=6766860898\" title=\"Zipora: Zip/RAR/7Z Unarchiver\"\u003e\u003cimg alt=\"Zipora: Zip/RAR/7Z Unarchiver\" height=\"52\" src=\"https://wangchujiang.com/appicon/zipora.png\"\u003e\u003c/a\u003e\n  \u003ca target=\"_blank\" href=\"https://jaywcjlove.github.io/maslink/?id=6758053530\" title=\"Scap: Screenshot \u0026 Markup Edit for macOS\"\u003e\u003cimg alt=\"Scap: Screenshot \u0026 Markup Edit\" height=\"52\" src=\"https://wangchujiang.com/appicon/scap.png\"\u003e\u003c/a\u003e\n  \u003ca target=\"_blank\" href=\"https://jaywcjlove.github.io/maslink/?id=6757317079\" title=\"Screen Test for macOS\"\u003e\u003cimg alt=\"Screen Test\" height=\"52\" src=\"https://wangchujiang.com/appicon/screen-test.png\"\u003e\u003c/a\u003e\n  \u003ca target=\"_blank\" href=\"https://jaywcjlove.github.io/maslink/?id=6755948110\" title=\"Deskmark for macOS\"\u003e\u003cimg alt=\"Deskmark\" height=\"52\" src=\"https://wangchujiang.com/appicon/deskmark.png\"\u003e\u003c/a\u003e\n  \u003ca target=\"_blank\" href=\"https://jaywcjlove.github.io/maslink/?id=6500434773\" title=\"Keyzer for macOS\"\u003e\u003cimg alt=\"Keyzer\" height=\"52\" src=\"https://wangchujiang.com/appicon/keyzer.png\"\u003e\u003c/a\u003e\n  \u003ca target=\"_blank\" href=\"https://github.com/jaywcjlove/vidwall-hub\" title=\"Vidwall Hub for macOS\"\u003e\u003cimg alt=\"Vidwall Hub\" height=\"52\" src=\"https://wangchujiang.com/appicon/vidwall-hub.png\"\u003e\u003c/a\u003e\n  \u003ca target=\"_blank\" href=\"https://jaywcjlove.github.io/maslink/?id=6752624705\" title=\"VidCrop for macOS\"\u003e\u003cimg alt=\"VidCrop\" height=\"52\" src=\"https://wangchujiang.com/appicon/vidcrop.png\"\u003e\u003c/a\u003e\n  \u003ca target=\"_blank\" href=\"https://jaywcjlove.github.io/maslink/?id=6747587746\" title=\"Vidwall for macOS\"\u003e\u003cimg alt=\"Vidwall\" height=\"52\" src=\"https://wangchujiang.com/appicon/vidwall.png\"\u003e\u003c/a\u003e\n  \u003ca target=\"_blank\" href=\"https://wangchujiang.com/mousio-hint/\" title=\"Mousio Hint for macOS\"\u003e\u003cimg alt=\"Mousio Hint\" height=\"52\" src=\"https://wangchujiang.com/appicon/mousio-hint.png\"\u003e\u003c/a\u003e\n  \u003ca target=\"_blank\" href=\"https://jaywcjlove.github.io/maslink/?id=6746747327\" title=\"Mousio for macOS\"\u003e\u003cimg alt=\"Mousio\" height=\"52\" src=\"https://wangchujiang.com/appicon/mousio.png\"\u003e\u003c/a\u003e\n  \u003ca target=\"_blank\" href=\"https://jaywcjlove.github.io/maslink/?id=6745227444\" title=\"Musicer for macOS\"\u003e\u003cimg alt=\"Musicer\" height=\"52\" src=\"https://wangchujiang.com/appicon/musicer.png\"\u003e\u003c/a\u003e\n  \u003ca target=\"_blank\" href=\"https://jaywcjlove.github.io/maslink/?id=6743841447\" title=\"Audioer for macOS\"\u003e\u003cimg alt=\"Audioer\" height=\"52\" src=\"https://wangchujiang.com/appicon/audioer.png\"\u003e\u003c/a\u003e\n  \u003ca target=\"_blank\" href=\"https://jaywcjlove.github.io/maslink/?id=6744690194\" title=\"FileSentinel for macOS\"\u003e\u003cimg alt=\"FileSentinel\" height=\"52\" src=\"https://wangchujiang.com/appicon/file-sentinel.png\"\u003e\u003c/a\u003e\n  \u003ca target=\"_blank\" href=\"https://jaywcjlove.github.io/maslink/?id=6743495172\" title=\"FocusCursor for macOS\"\u003e\u003cimg alt=\"FocusCursor\" height=\"52\" src=\"https://wangchujiang.com/appicon/focus-cursor.png\"\u003e\u003c/a\u003e\n  \u003ca target=\"_blank\" href=\"https://jaywcjlove.github.io/maslink/?id=6742680573\" title=\"Videoer for macOS\"\u003e\u003cimg alt=\"Videoer\" height=\"52\" src=\"https://wangchujiang.com/appicon/videoer.png\"\u003e\u003c/a\u003e\n  \u003ca target=\"_blank\" href=\"https://jaywcjlove.github.io/maslink/?id=6740425504\" title=\"KeyClicker for macOS\"\u003e\u003cimg alt=\"KeyClicker\" height=\"52\" src=\"https://wangchujiang.com/appicon/key-clicker.png\"\u003e\u003c/a\u003e\n  \u003ca target=\"_blank\" href=\"https://jaywcjlove.github.io/maslink/?id=6739052447\" title=\"DayBar for macOS\"\u003e\u003cimg alt=\"DayBar\" height=\"52\" src=\"https://wangchujiang.com/appicon/daybar.png\"\u003e\u003c/a\u003e\n  \u003ca target=\"_blank\" href=\"https://jaywcjlove.github.io/maslink/?id=6739444407\" title=\"Iconed for macOS\"\u003e\u003cimg alt=\"Iconed\" height=\"52\" src=\"https://wangchujiang.com/appicon/iconed.png\"\u003e\u003c/a\u003e\n  \u003ca target=\"_blank\" href=\"https://jaywcjlove.github.io/maslink/?id=6737160756\" title=\"Menuist for macOS\"\u003e\u003cimg alt=\"Menuist\" height=\"52\" src=\"https://wangchujiang.com/appicon/rightmenu-master.png\"\u003e\u003c/a\u003e\n  \u003ca target=\"_blank\" href=\"https://jaywcjlove.github.io/maslink/?id=6723903021\" title=\"Paste Quick for macOS\"\u003e\u003cimg alt=\"Quick RSS\" height=\"52\" src=\"https://wangchujiang.com/appicon/paste-quick.png\"\u003e\u003c/a\u003e\n  \u003ca target=\"_blank\" href=\"https://jaywcjlove.github.io/maslink/?id=6670696072\u0026platform=mac\" title=\"Quick RSS for macOS/iOS\"\u003e\u003cimg alt=\"Quick RSS\" height=\"52\" src=\"https://wangchujiang.com/appicon/quick-rss.png\"\u003e\u003c/a\u003e\n  \u003ca target=\"_blank\" href=\"https://jaywcjlove.github.io/maslink/?id=6670167443\" title=\"Web Serve for macOS\"\u003e\u003cimg alt=\"Web Serve\" height=\"52\" src=\"https://wangchujiang.com/appicon/web-serve.png\"\u003e\u003c/a\u003e\n  \u003ca target=\"_blank\" href=\"https://jaywcjlove.github.io/maslink/?id=6503953628\u0026platform=mac\" title=\"Copybook Generator for macOS/iOS\"\u003e\u003cimg alt=\"Copybook Generator\" height=\"52\" src=\"https://wangchujiang.com/appicon/copybook-generator.png\"\u003e\u003c/a\u003e\n  \u003ca target=\"_blank\" href=\"https://jaywcjlove.github.io/maslink/?id=6471227008\u0026platform=mac\" title=\"DevTutor for macOS/iOS\"\u003e\u003cimg alt=\"DevTutor for SwiftUI\" height=\"52\" src=\"https://wangchujiang.com/appicon/devtutor.png\"\u003e\u003c/a\u003e\n  \u003ca target=\"_blank\" href=\"https://jaywcjlove.github.io/maslink/?id=6479819388\u0026platform=mac\" title=\"RegexMate for macOS/iOS\"\u003e\u003cimg alt=\"RegexMate\" height=\"52\" src=\"https://wangchujiang.com/appicon/regex-mate.png\"\u003e\u003c/a\u003e\n  \u003ca target=\"_blank\" href=\"https://jaywcjlove.github.io/maslink/?id=6479194014\u0026platform=mac\" title=\"Time Passage for macOS/iOS\"\u003e\u003cimg alt=\"Time Passage\" height=\"52\" src=\"https://wangchujiang.com/appicon/time-passage.png\"\u003e\u003c/a\u003e\n  \u003ca target=\"_blank\" href=\"https://jaywcjlove.github.io/maslink/?id=6478772538\" title=\"IconizeFolder for macOS\"\u003e\u003cimg alt=\"Iconize Folder\" height=\"52\" src=\"https://wangchujiang.com/appicon/iconize-folder.png\"\u003e\u003c/a\u003e\n  \u003ca target=\"_blank\" href=\"https://jaywcjlove.github.io/maslink/?id=6478511402\u0026platform=mac\" title=\"Textsound Saver for macOS/iOS\"\u003e\u003cimg alt=\"Textsound Saver\" height=\"52\" src=\"https://wangchujiang.com/appicon/textsound-saver.png\"\u003e\u003c/a\u003e\n  \u003ca target=\"_blank\" href=\"https://jaywcjlove.github.io/maslink/?id=6476924627\" title=\"Create Custom Symbols for macOS\"\u003e\u003cimg alt=\"Create Custom Symbols\" height=\"52\" src=\"https://wangchujiang.com/appicon/create-custom-symbols.png\"\u003e\u003c/a\u003e\n  \u003ca target=\"_blank\" href=\"https://jaywcjlove.github.io/maslink/?id=6476452351\" title=\"DevHub for macOS\"\u003e\u003cimg alt=\"DevHub\" height=\"52\" src=\"https://wangchujiang.com/appicon/devhub.png\"\u003e\u003c/a\u003e\n  \u003ca target=\"_blank\" href=\"https://jaywcjlove.github.io/maslink/?id=6476400184\" title=\"Resume Revise for macOS\"\u003e\u003cimg alt=\"Resume Revise\" height=\"52\" src=\"https://wangchujiang.com/appicon/resume-revise.png\"\u003e\u003c/a\u003e\n  \u003ca target=\"_blank\" href=\"https://jaywcjlove.github.io/maslink/?id=6472593276\" title=\"Palette Genius for macOS\"\u003e\u003cimg alt=\"Palette Genius\" height=\"52\" src=\"https://wangchujiang.com/appicon/palette-genius.png\"\u003e\u003c/a\u003e\n  \u003ca target=\"_blank\" href=\"https://jaywcjlove.github.io/maslink/?id=6470879005\" title=\"Symbol Scribe for macOS\"\u003e\u003cimg alt=\"Symbol Scribe\" height=\"52\" src=\"https://wangchujiang.com/appicon/symbol-scribe.png\"\u003e\u003c/a\u003e\n\u003c/div\u003e\n\u003chr\u003e\n\nMyAppListKit\n===\n\n[![Buy me a coffee](https://img.shields.io/badge/Buy_Me_a_Coffee-ffdd00?logo=buy-me-a-coffee\u0026logoColor=black)](https://jaywcjlove.github.io/#/sponsor)\n[![Follow On X](https://img.shields.io/badge/Follow%20on%20X-333333?logo=x\u0026logoColor=white)](https://x.com/jaywcjlove)\n![SwiftUI](https://img.shields.io/badge/SwiftUI-007AFF?logo=swift\u0026logoColor=white)\n[![Follow On X](https://img.shields.io/badge/Follow%20on%20X-333333?logo=x\u0026logoColor=white)](https://x.com/jaywcjlove)\n\n用于展示应用列表、打开 App Store 链接、发送反馈和获取应用图标的 SwiftUI 工具。个人应用数据已拆分到可选的 `MyAppListKitApps` product。\n\n欢迎下载 [DevTutor](https://jaywcjlove.github.io/maslink/?id=6471227008\u0026platform=mac)，这是一款旨在帮助开发者快速使用 SwiftUI 构建出色应用的速查手册应用。\n\n\u003cp\u003e\n  \u003ca target=\"_blank\" href=\"https://jaywcjlove.github.io/maslink/?id=6471227008\u0026platform=mac\" title=\"DevTutor for SwiftUI AppStore\"\u003e\u003cimg alt=\"DevTutor for SwiftUI AppStore\" src=\"https://jaywcjlove.github.io/sb/download/macos.svg\" height=\"51\"\u003e\n  \u003c/a\u003e\n\u003c/p\u003e\n\n## 安装\n\n你可以将 MyAppListKit 添加到 Xcode 项目中，作为一个包依赖。\n\n1. 在 Xcode 的菜单栏中选择「File \u003e Add Packages…」\n2. 在「Search or Enter Package URL」字段中输入：  \n   `https://github.com/jaywcjlove/MyAppListKit`\n3. 将 `MyAppListKit` 链接到你的应用目标（Target）\n4. 如果需要使用内置的个人应用列表，同时链接 `MyAppListKitApps`\n\n或者在你的 `Package.swift` 文件中添加以下内容：\n\n```swift\n.package(url: \"https://github.com/jaywcjlove/MyAppListKit\", branch: \"main\")\n```\n\n也可以参考 [Xcode 添加依赖包的官方文档](https://developer.apple.com/documentation/xcode/adding_package_dependencies_to_your_app)。\n\n## 使用方法\n\n```swift\nimport MyAppListKit\nimport MyAppListKitApps\n\nList {\n    // 遍历我的应用列表\n    ForEach(MyAppListApps.apps(), id: \\.appId) { app in\n        Button(app.name, action: {\n            app.openApp() // 打开应用（如果已安装）\n            // 或者使用静态方法打开应用（根据 appId 或 App Store ID）\n            MyAppList.openApp(appId: app.appId, appstoreId: app.appstoreId)\n        })\n    }\n}\n\n// 显示“更多我的应用”按钮\nButton(\"More Apps by Me\") {\n    MyAppList.openURL(url: URL(string: MyAppListApps.appsByMe)!) // 打开我的所有应用页面（自定义 URL）\n    // 或使用封装的方法打开\n    MyAppListApps.openAppsByMe()\n}\n\n// 获取一个应用（如 DevHub）相关的信息和操作方法\nMyAppListApps.appDevHub          // -\u003e AppData 实例，包含应用信息\nMyAppListApps.appDevHub.storeURL // -\u003e 应用在 App Store 的链接（URL 类型）\n                             // 例如：macappstore://apps.apple.com/app/id6476452351\n\nMyAppListApps.appDevHub.appStoreWriteReview  // -\u003e App Store 评论链接\n// 例如：macappstore://apps.apple.com/app/id6476452351?action=write-review\n\nMyAppListApps.appDevHub.openURL()            // 在浏览器中打开应用页面\nMyAppListApps.appDevHub.openWriteReviewURL() // 在浏览器中打开写评论页面\nMyAppListApps.appDevHub.openApp()            // 打开本地应用，或跳转到 App Store 下载页面\nMyAppListApps.appDevHub.openWriteReviewURL() // 同上，主要用于引导用户写评论\n```\n\n返回与指定 Bundle Identifier 关联的默认应用的 URL。\n\n```swift\nMyAppListApps.appDevHub.appURL()\n```\n\n## 迁移说明\n\n个人应用数据已从 `MyAppListKit` 移动到可选的 `MyAppListKitApps` product。\n\n1. 对使用内置个人应用列表的 target 增加 `MyAppListKitApps` 依赖。\n2. 在代码中增加 `import MyAppListKitApps`。\n3. 将 `MyAppList.appDevHub`、`MyAppList.allApps`、`MyAppList.apps()`、`MyAppList.appsByMe`、`MyAppList.openAppsByMe()` 替换为对应的 `MyAppListApps.*` API。\n4. 可复用视图需要显式传入数据：`MoreAppsView(apps: MyAppListApps.apps(), appsByMeURL: MyAppListApps.appsByMe)`、`MoreAppsMenuView(apps: MyAppListApps.apps(), appsByMeURL: MyAppListApps.appsByMe)` 或 `MoreAppsCommandMenus(apps: MyAppListApps.apps(), appsByMeURL: MyAppListApps.appsByMe)`。\n\n`MyAppListKit` 现在保持通用。如果你维护自己的应用列表，继续使用 `MyAppList.AppData`，并把自己的 `[MyAppList.AppData]` 传给这些视图即可。\n\n检查应用是否已安装。\n\n```swift\nMyAppList.isAppInstalled(appId: \"com.wangchujiang.vidwall\")\n```\n\n获取应用图标\n\n```swift\nMyAppList.getAppIcon() // 获取应用商店图标\n// 通过 bundleIdentifier 获取图标（如果本地安装了应用）\nMyAppList.getAppIcon(forId: \"com.wangchujiang.vidwall\") \n// 通过 bundleIdentifier 获取图标，如果本地不存在，则返回 App Store 图标\nMyAppList.getAppIcon(forId: \"com.wangchujiang.vidwall\", defaultAppStore: true) \n// 通过 bundleIdentifier 获取图标，如果本地不存在，则根据 appstoreId 从 App Store 获取图标\nMyAppList.getAppIcon(forId: \"com.wangchujiang.vidwall\", appstoreId: \"6747587746\") \n// 直接通过 App Store 的应用 ID 获取图标\nMyAppList.fetchAppIconFromAppStore(appId: \"6747587746\") \n```\n\n本地化字符串的区域设置\n\n```swift\nString.localized(\"Confirm \\\"\\(data.title)\\\" data\", locale: \"zh\")\nString.localized(\"Confirm Deletion\", locale: \"zh\")\nString.localized(\"Confirm Deletion\", locale: Locale(identifier: \"zh\"))\n```\n\n获取依赖包本地国际化字符串\n\n```swift\nString.localized(key: \"my_other_apps\", locale: \"zh\")\n```\n\n## 示例菜单\n\n```swift\nimport SwiftUI\nimport MyAppListKit\nimport MyAppListKitApps\n\nextension Locale {\n    /// 获取系统首选语言的 Locale，忽略应用的区域设置\n    /// 这用于确保 MyAppListKit 组件始终使用系统语言而不是应用区域设置\n    static var systemPreferred: Locale {\n        Locale(identifier: Locale.preferredLanguages.first ?? \"en\")\n    }\n}\n\nstruct CommandMenus: Commands {\n    var body: some Commands {\n        CommandMenu(String.localized(key: \"more_tools\", locale: Locale.systemPreferred)) {\n            MoreAppsView(apps: MyAppListApps.apps(), appsByMeURL: MyAppListApps.appsByMe)\n                .environment(\\.locale, Locale.systemPreferred)\n        }\n        CommandGroup(replacing: .systemServices) {}\n        CommandGroup(after: CommandGroupPlacement.appInfo) {\n            Divider()\n            MyAppCheckForUpdatesView(app: MyAppListApps.appIconizeFolder)\n                .environment(\\.locale, Locale.systemPreferred)\n            Divider()\n            CommandGroupView()\n        }\n        CommandGroup(replacing: CommandGroupPlacement.help) {\n            MyAppCheckForUpdatesView(app: MyAppListApps.appIconizeFolder)\n                .environment(\\.locale, Locale.systemPreferred)\n            Divider()\n            CommandGroupView()\n        }\n    }\n}\n\nstruct CommandGroupView: View {\n    var body: some View {\n        Group {\n            ButtonWebsite(app: MyAppListApps.appIconizeFolder)\n            ButtonRateApp(app: MyAppListApps.appIconizeFolder)\n            ButtonSendFeedback(app: MyAppListApps.appIconizeFolder)\n            \n            MoreAppsMenuView(apps: MyAppListApps.apps(), appsByMeURL: MyAppListApps.appsByMe)\n            \n            Divider()\n            CommandAppButton(app: MyAppListApps.appIconed)\n            CommandAppButton(app: MyAppListApps.appCreateCustomSymbols)\n            CommandAppButton(app: MyAppListApps.appPaletteGenius)\n            CommandAppButton(app: MyAppListApps.appDevHub)\n            Divider()\n        }\n        .environment(\\.locale, Locale.systemPreferred)\n    }\n}\n\nstruct CommandAppButton: View {\n    let app: MyAppList.AppData\n    var body: some View {\n        Button(action: {\n            app.openApp()\n        }, label: {\n            HStack {\n                MoreAppsIcon(appId: app.appId, appstoreId: app.appstoreId)\n                let text: String = \" - \"\n                Text(app.name) +\n                Text(text).foregroundStyle(Color.secondary) +\n                Text(String.localized(key: app.desc ?? \"\", bundle: app.descBundle, locale: Locale.systemPreferred))\n                    .foregroundStyle(Color.secondary).font(.system(size: 10))\n            }\n        })\n    }\n}\n```\n\n## MyAppCheckForUpdatesView\n\n```swift\nimport MyAppListKit\nimport MyAppListKitApps\n\nstruct ContentView: View {\n    var body: some View {\n        MyAppCheckForUpdatesView(app: MyAppListApps.appIconed)\n                    \n        MyAppCheckForUpdatesView(app: MyAppListApps.appIconed) { label in\n            HStack {\n                Text(label)\n                Spacer()\n                Image(systemName: \"chevron.right\")\n            }\n        }\n        .frame(maxWidth: .infinity)\n        .buttonStyle(.link)\n    }\n}\n```\n\n## MoreAppsView\n\n在菜单中显示我的应用。\n\n```swift\nstruct CommandMenus: Commands {\n    var body: some Commands {\n        //CommandMenu(\"More Tools\") {\n        //    MoreAppsView(apps: MyAppListApps.apps(), appsByMeURL: MyAppListApps.appsByMe)\n        //}\n        MoreAppsCommandMenus(apps: MyAppListApps.apps(), appsByMeURL: MyAppListApps.appsByMe)\n        MoreAppsCommandMenus(apps: MyAppListApps.apps(), appsByMeURL: MyAppListApps.appsByMe) {\n            Group {\n                // ....\n            }\n        }\n        CommandGroup(replacing: CommandGroupPlacement.help) {\n            MoreAppsMenuView(apps: MyAppListApps.apps(), appsByMeURL: MyAppListApps.appsByMe)\n        }\n    }\n}\n```\n\n## ButtonRateApp \u0026 ButtonSendFeedback\n\n用于引导用户前往 App Store 评分/评论应用的按钮。点击后会打开当前应用在 App Store 的“撰写评论”页面。\n\n```swift\nstruct CommandMenus: Commands {\n    var body: some Commands {\n        CommandGroup(replacing: CommandGroupPlacement.help) {\n            ButtonWebsite(app: MyAppListApps.appRegexMate)\n            ButtonRateApp(app: MyAppListApps.appRegexMate)\n            Divider()\n            ButtonSendFeedback(app: MyAppListApps.appRegexMate)\n        }\n    }\n}\n```\n\n\n## MoreAppsCommandMenus\n\n```swift\nimport MyAppListKit\nimport MyAppListKitApps\n\n@main\nstruct IconizeFolderApp: App {\n    var body: some Scene {\n        return Window(\"\", id: \"MainWindow\") {\n            ContentView()\n        }\n        .commands {\n            MoreAppsCommandMenus(apps: MyAppListApps.apps(), appsByMeURL: MyAppListApps.appsByMe)\n        }\n    }\n\n}\n```\n\n## 我的应用列表\n\n```swift\nlet locale: Locale = Locale(identifier: Locale.preferredLanguages.first ?? \"en\")\n\nForEach(MyAppListApps.apps(), id: \\.appId) { app in\n    Button(action: {\n        MyAppList.openApp(appId: app.appId, appstoreId: app.appstoreId)\n    }, label: {\n        Label(title: {\n            VStack(alignment: .leading) {\n                Text(app.name).font(.system(size: 12))\n                    .multilineTextAlignment(.leading)\n                if let desc = app.desc {\n                    Text(String.localized(key: desc, bundle: app.descBundle, locale: locale))\n                        .lineLimit(nil)\n                        .fixedSize(horizontal: false, vertical: true)\n                        .foregroundStyle(Color.secondary)\n                        .font(.system(size: 10))\n                        .multilineTextAlignment(.leading)\n                        .lineSpacing(0)\n                        .frame(maxWidth: .infinity, alignment: .leading)\n                }\n            }\n            .frame(maxWidth: .infinity, alignment: .leading)\n        }, icon: {\n            MoreAppsIcon(appId: app.appId, appstoreId: app.appstoreId)\n        })\n    })\n    .buttonStyle(.link)\n}\n```\n\n## 许可证\n\n本项目采用 MIT 许可证授权。\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjaywcjlove%2FMyAppListKit","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjaywcjlove%2FMyAppListKit","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjaywcjlove%2FMyAppListKit/lists"}