2011-12-30 4 views
2

로그인 할 때 내 앱이 실행되도록 설정되는 경우가 있습니다. 로그인으로 인해 자동으로 시작되면 창을 표시하고 싶지 않습니다. 응용 프로그램은 사용자가 로그인 할 때 실행되는 상태 표시 줄 항목을 가지고 있지만 로그인 할 때마다 창 팝업을 원하지 않습니다. 응용 프로그램 시작시 이것이 자동 시작 이었음을 어떻게 알 수 있습니까? 창을 보이지 않게 할 수 있습니까?os x 앱이 로그인 항목으로 실행되었음을 감지 했습니까?

답변

2

프로세스가 시작되면 명령 줄 인수와 환경 변수가 입력됩니다. Dock에서 Alfred.app를 시작하고 로그인을 통해 살펴 보았습니다. 인수 나 환경에서 발사의 출처를 나타내는 것은 없었습니다.

로그인 할 때 응용 프로그램을 시작할 수있는 몇 가지 방법이 있습니다. 사용자의 시스템 환경 설정의 "로그인 항목"또는 라이브러리/LaunchAgent 중 하나의 LaunchAgent를 통해. "로그인 항목"은 시작할 때 실행할 항목을 추가하는 가장 사용자 친화적 인 방법이지만 나중에 도킹 또는 응용 프로그램 디렉터리에서 실행하는 것과 같습니다. 결과적으로 우리는이 방법을 통한 발사의 출처를 결정하기에 충분한 정보가 없습니다.

launchd을 사용하면 사용자의 ~/Library/LaunchAgents 디렉토리에 XML 파일을 지정하여 특정 명령 행 인수 세트로 프로그램을 시작할 수 있습니다.

<?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>Disabled</key> 
     <false/> 
     <key>KeepAlive</key> 
     <true/> 
     <key>Label</key> 
     <string>info.evanlong.apps.sandbox</string> 
     <key>ProgramArguments</key> 
     <array> 
      <string>/path/to/your/app</string> 
      <string>--this-started-via-login</string> 
     </array> 
</dict> 
</plist> 

프로세스에 대한 환경 변수 설정 기능을 포함하여 실행을위한 여러 가지 구성 옵션이 있습니다. launchd.plist 매뉴얼 페이지에서 찾을 수 있습니다.

  • 일부 영리와 함께 "로그인 항목"을 계속 사용

    1. launchd에 (조금 더 많은 작업 유지하고 지원) : 당신은 내가 몇 솔루션을 볼 수 있습니다 해결하고자하는 문제에 대한

      .

    옵션 2가 다른 앱의 작동 방식과 가장 잘 어울리는 방법이라고 생각합니다. 영리한 점은 응용 프로그램이 처음 실행될 때 주 창을 표시하지 않는다는 것입니다. 상태 표시 줄에 아이콘 만 표시하십시오. 응용 프로그램이 시작되면 실행중인 응용 프로그램은 응용 프로그램 위임에 applicationWillBecomeActive/applicationDidBecomeActive를 가져와야합니다. 첫 번째 출시 이후에 이런 일이 발생하면 애플리케이션 창을 표시하려고합니다. 유념/활성 콜백이 된 것은 애플리케이션이 처음 실행될 때 호출됩니다. 따라서 다음과 같이 확인해보십시오.

    static BOOL IS_FIRST_CALL = YES; 
    
    @implementation LWAppDelegate 
    
    @synthesize window = _window; 
    
    - (void)applicationDidFinishLaunching:(NSNotification *)aNotification { 
    } 
    
    - (void)applicationWillBecomeActive:(NSNotification *)notification { 
        if (IS_FIRST_CALL) { 
         NSLog(@"first call"); 
         IS_FIRST_CALL = NO; 
        } 
        else { 
         // Display the application window 
         NSLog(@"subsequent calls"); 
        } 
    } 
    @end