From dd1c9fc4c531f1aceaa6d64bbee919ec464655b7 Mon Sep 17 00:00:00 2001
From: Ariver <shanghai3168@gmail.com>
Date: Tue, 09 Jun 2026 20:09:32 +0800
Subject: [PATCH] Release 7.8.26 helper app filtering

---
 src/Apptag/DataLayer.swift |   30 ++++++++++++++++++++++++------
 1 files changed, 24 insertions(+), 6 deletions(-)

diff --git a/src/Apptag/DataLayer.swift b/src/Apptag/DataLayer.swift
index d6cd436..ccbec1a 100644
--- a/src/Apptag/DataLayer.swift
+++ b/src/Apptag/DataLayer.swift
@@ -334,7 +334,7 @@
             }
         }
 
-        return deduplicated(apps).sorted {
+        return deduplicated(apps.filter { !isInternalHelperAppPath($0.path) }).sorted {
             $0.name.localizedStandardCompare($1.name) == .orderedAscending
         }
     }
@@ -363,10 +363,10 @@
         guard url.pathExtension.lowercased() == "app" else { return }
 
         let displayURL = url.standardizedFileURL
-        guard !isNestedInsideAppBundle(displayURL) else { return }
+        guard !isInternalHelperAppPath(displayURL) else { return }
 
         let resolvedURL = displayURL.resolvingSymlinksInPath().standardizedFileURL
-        guard !isNestedInsideAppBundle(resolvedURL) else { return }
+        guard !isInternalHelperAppPath(resolvedURL) else { return }
         guard seenResolvedPaths.insert(resolvedURL.path).inserted else { return }
 
         let bundle = Bundle(url: displayURL) ?? Bundle(url: resolvedURL)
@@ -624,11 +624,29 @@
     }
 
     static func isNestedInsideAppBundle(_ url: URL) -> Bool {
-        let components = url.standardizedFileURL.pathComponents
-        guard let lastAppIndex = components.lastIndex(where: { $0.lowercased().hasSuffix(".app") }) else {
+        isNestedInsideAppBundlePath(url.standardizedFileURL.path)
+    }
+
+    static func isInternalHelperAppPath(_ url: URL) -> Bool {
+        let path = url.standardizedFileURL.path
+        let lowercasedPath = path.lowercased()
+        return isNestedInsideAppBundlePath(path)
+            || lowercasedPath.contains("/contents/helpers/")
+            || lowercasedPath.contains("/contents/xpcservices/")
+            || lowercasedPath.contains("/wrapper/")
+    }
+
+    private static func isNestedInsideAppBundlePath(_ path: String) -> Bool {
+        let lowercasedPath = path.lowercased()
+        guard lowercasedPath.hasSuffix(".app") else { return false }
+        let components = lowercasedPath.split(separator: "/", omittingEmptySubsequences: true)
+        guard let lastAppIndex = components.lastIndex(where: { $0.hasSuffix(".app") }) else {
             return false
         }
-        return components[..<lastAppIndex].contains { $0.lowercased().hasSuffix(".app") }
+        if components[..<lastAppIndex].contains(where: { $0.hasSuffix(".app") }) {
+            return true
+        }
+        return lowercasedPath.range(of: ".app/", options: .caseInsensitive) != nil
     }
 
     private static func deduplicated(_ apps: [AppInfo]) -> [AppInfo] {

--
Gitblit v1.9.3