Jak zatrzymać uruchamianie aplikacji podczas logowania?

6

Stworzyłem aplikację, która uruchamia się przy logowaniu przy użyciu SMLoginItemSetEnabled. Oto kod, którego używa. Moje pytanie brzmi: jak ręcznie usunąć tę aplikację z uruchamiania podczas logowania ?

Aplikacja nie wyświetla się w „Elementach logowania”, lub /Library/LaunchAgents, /Library/LaunchDaemonslub w folderach /Users/username/Library/LaunchAgentslub /Users/username/Library/LaunchDaemons. Rozejrzałem się /Library/Preferencesi PreferecePanesnic nie znalazłem. Aplikacja ładuje się przy logowaniu.

Tarandeep Gill
źródło
jeśli usuniesz aplikację (z dysku), co mówi konsola?
Martin Marconcini,
Jeśli usunę aplikację (nawet jeśli nie jest uruchomiona), mogę przenieść ją do Kosza, ale gdy spróbuję opróżnić Kosz, nie usunie aplikacji.
Tarandeep Gill
Czy kiedykolwiek znalazłeś rozwiązanie tego problemu? Zastanawiam się to samo.
Klaas,
Wygląda na to, że niektóre są wymienione tutaj: /var/db/com.apple.xpc.launchd/disabled.$UID.plist
Klaas

Odpowiedzi:

2

Powinieneś być w stanie zatrzymać i usunąć pomocnika z launchdlinii poleceń. Otwórz Terminal.app i zrób

launchctl list | grep -i com.your.helper

Po znalezieniu Job_label w trzeciej kolumnie możesz uruchomić

sudo launchctl stop com.your.helper
sudo launchctl remove com.your.helper

Podręcznik do launchctlmożna znaleźć tutaj

forquare
źródło
0

A jeśli dodałeś go z pomocnikiem, tak jak powiedziałeś, to powinieneś być w stanie zobaczyć go na liście (myślę).

Popatrz na to:

-(BOOL)appIsPresentInLoginItems
{
    NSString *bundleID = @"com.madebynotion.myLoginHelper";
    NSArray * jobDicts = nil;
    jobDicts = (NSArray *)SMCopyAllJobDictionaries( kSMDomainUserLaunchd );
    // Note: Sandbox issue when using SMJobCopyDictionary()

    if ( (jobDicts != nil) && [jobDicts count] > 0 ) {

        BOOL bOnDemand = NO;

        for ( NSDictionary * job in jobDicts ) {

            if ( [bundleID isEqualToString:[job objectForKey:@"Label"]] ) {
                bOnDemand = [[job objectForKey:@"OnDemand"] boolValue];
                break;
            } 
        }

        CFRelease((CFDictionaryRef)jobDicts); jobDicts = nil;
        return bOnDemand;

    } 
    return NO;
}

źródło: http://blog.mcohen.me/2012/01/12/login-items-in-the-sandbox/

Martin Marconcini
źródło
1
Dzięki za odpowiedź Martin. Ale szukam sposobu, aby usunąć go ręcznie (bez użycia programu). Gdzie plik PList jest przechowywany w systemie?
Tarandeep Gill
Żaden problem. Powodem, dla którego dodałem kod, jest sprawdzenie, co robi. Może musi znajdować się w katalogu sanboxed twojej aplikacji… ale nigdy o tym nie myślałem. Rzucę okiem ”
Martin Marconcini,
0

Elementy logowania są przechowywane w ~ / Library / Preferences / com.apple.loginitems.plist i można nimi zarządzać ręcznie w Preferencjach systemowych -> Użytkownicy i grupy -> konto użytkownika na pasku bocznym -> zakładka Elementy logowania.

Gordon Davisson
źródło
To jest problem. Aplikacja nie wyświetla się na karcie Elementy logowania i nie jest wymieniona w ~/Library/Preferences/com.apple.loginitems.plistżadnym z nich!
Tarandeep Gill
0

Jeśli usunę aplikację (nawet jeśli nie jest uruchomiona), mogę przenieść ją do Kosza, ale gdy spróbuję opróżnić Kosz, nie usunie aplikacji.

Gdy znajduje się w koszu, uruchom ponownie komputer Mac w trybie pojedynczego użytkownika (zacznij, przytrzymując cmd+ s): otworzy się to w oknie Terminal, uruchom

sudo rm -Rf ~/.Trash/*

i naciśnij enter, a następnie uruchom ponownie normalnie.

LexS
źródło
0

Możesz zatrzymać uruchomienie elementu za pomocą .launchctl disable gui/$UID/bundle-id

Jeśli nie znasz identyfikatora pakietu, możesz go znaleźć, pisząc launchctl list. Spowoduje to wyświetlenie listy wszystkich procesów uruchomionych przez użytkownika wraz z ich identyfikatorami PID w pierwszej kolumnie. Więc jeśli widziałeś to:

$ launchctl list
-   0   com.apple.SafariHistoryServiceAgent
277 0   com.apple.Finder
-   0   com.apple.quicklook
-   0   com.apple.parentalcontrols.check
[…]
189 0   com.example.ExampleDaemon
-   0   com.apple.java.InstallOnDemand

… Możesz użyć Monitora aktywności, aby potwierdzić, że identyfikator PID niepożądanej aplikacji to 189, co stanowi identyfikator jej pakietu com.example.ExampleDaemon. Następnie:

launchctl disable gui/$UID/com.example.ExampleDaemon

to jest to! Na dysku jest nadal zapisany element logowania, po prostu wyłączony. Jeśli chcesz go wyczyścić lub po prostu chcesz dowiedzieć się więcej, czytaj dalej.


Wbrew intuicji (ale zabawnie?) Lista jest zapisywana tutaj:

/var/db/com.apple.xpc.launchd/disabled.$UID.plist

Ten plik będzie wyglądał mniej więcej tak:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>com.example.ExampleDaemon</key>
    <false/>
</dict>
</plist>

Tak, falseoznacza to, że aplikacja o tym identyfikatorze pakietu powinna zostać uruchomiona podczas uruchamiania. Po uruchomieniu launchctl disableThe falsezmieni się true. (O ile mi wiadomo, uruchomione nie zapisuje od razu tych plików, więc możesz tego nie zobaczyć, dopóki nie uruchomisz ponownie.) Za pomocą tego polecenia możesz zobaczyć wyłączone elementy:

launchctl print-disabled gui/$UID

Jest tam także kilka dodatkowych informacji o każdym zapisanym tutaj elemencie logowania, ale usunięcie go nie powstrzyma uruchomienia elementu:

/var/db/com.apple.xpc.launchd/loginitems.$UID.plist

Wszelkie zmiany wprowadzone podczas działania systemu zostaną zastąpione po wyłączeniu / ponownym uruchomieniu. O ile wiem, jedynym sposobem na całkowite usunięcie elementu disabled.$UID.plistjest ponowne uruchomienie w trybie pojedynczego użytkownika i dokonanie tam edycji. Nawet bez uruchomienia launchctl disableusunięcie key/ falsepary z tego pliku powstrzymuje aplikację przed uruchomieniem przy logowaniu. W tej odpowiedzi nie dołączę instrukcji dotyczących edycji tych plików w trybie pojedynczego użytkownika.

s4y
źródło