2016-07-18 4 views
0

이 AppleScript 유휴 타이머가 올바르게 실행되지 않는 이유는 무엇입니까?

특정 시간 (이 경우 시간이 xx : 03 : 24 일 때마다)으로 증가하는 타이머를 만들고 사용자가 입력 한 값에 도달하면 알림을 보냅니다. 일단 이렇게하면 증분을 재설정하고 수동으로 종료 할 때까지 반복합니다.

그러나이 코드는 가정 할 때 안정적으로 트리거되지 않습니다. 왜 누군가는 추측을합니까?

on quit 
    continue quit 
end quit 
tell application "Notifications Scripting" 
    set event handlers script path to (path to me) 
end tell 

global actions, newActions 

using terms from application "Notifications Scripting" 
    on notification activated 
     tell application "Safari" 
      activate 
      set winlist to every window 
      repeat with win in winlist 
       set numtabs to 0 
       try 
        set tablist to every tab of win 
        set numtabs to length of tablist 
       end try 
       if numtabs is greater than 0 then 
        repeat with t in tablist 

         if "fallenlondon.storynexus.com" is in (URL of t as string) then 
          tell application "System Events" 
           tell window id (id of win as integer) of application "Safari" to set current tab to tab (index of t as integer) 
          end tell 
         end if 
        end repeat 
       end if 
      end repeat 
     end tell 
    end notification activated 
end using terms from 

display dialog "How many actions do you want to build up before being notified?" default answer "1" 

set actions to (text returned of result) as number 
set newActions to 0 

on idle 
    if ((seconds of (current date)) = 24) and ((minutes of (current date)) mod 10 = 3) then 
     set newActions to (newActions + 1) 
     set delayTime to 540 
    else 
     set delayTime to 0.5 
    end if 

    if newActions ≥ actions then 
     if newActions = 1 then 
      tell application "Notifications Scripting" to display notification "Fallen London" message "You have " & newActions & " new action!" sound name "Glass" 
     else 
      tell application "Notifications Scripting" to display notification "Fallen London" message "You have " & newActions & " new actions!" sound name "Glass" 
     end if 
     set newActions to 0 
    end if 
    return delayTime 
end idle 
+0

트리거시기에 대해 자세히 알려주십시오. 트리거링은 일관성이 있습니까? – SunSparc

답변

0

귀하의 idle 구현이 안정적으로 작동한다고 기대하지 않습니다. 정밀 타이밍 메커니즘이 아닙니다. 현재 10 분 루프에서 1 초 창을 공격하려고 시도하고

if ((seconds of (current date)) = 24) and ((minutes of (current date)) mod 10 = 3) then 

, 당신은 그 창을 놓치면 당신이 얻을 때까지 다른 십분 수 있습니다 그러므로 다음과 같은 가정이 건전 다시 시도하십시오.

그것을 할 수있는 신뢰할 수있는 방법은 현재의 날짜가 날짜와 트리거가 않는 경우 후 지금 경우 다음 트리거 할 때, 주기적으로 확인 시간을 나타내는 날짜를 저장하는 것입니다 :

to nextTriggerDate() -- returns next xx:x3:23 date 
    set d to current date 
    set {d's minutes, d's seconds} to {((d's minutes) div 10 * 10) + 3, 23} 
    if d < (current date) then set d to d + 10 * minutes 
    d 
end nextTriggerDate 

property _triggerDate : nextTriggerDate() 


on idle 
    if (current date) > _triggerDate then 
     set _triggerDate to nextTriggerDate() 
     -- DO STUFF HERE... 
    end if 
    return 1 
end idle 

또는이 유형의 작업을 위해 특별히 고안된 AppleScript-ObjC 브릿지를 통해 NSTimer을 사용하거나 launchd 스크립트를 사용하여 체류 시간에 묶기를 원하지 않는 경우 AppleScript를 지정된 시간에 실행하도록 설정할 수 있습니다 -open 애플릿.

0

나는 코드에 대해 몇 가지 문제가 있다고 생각합니다.

먼저 유휴 이벤트마다 idle 핸들러 내의 코드 만 호출된다는 점에 유의해야합니다. 즉, 유휴 프로세스마다 스크립트 본문이 실행될 것으로 예상되는 경우에는 그렇지 않습니다. 당신이 stay open 스크립트로 위의 코드를 저장하면

당신이 "안녕하세요"다음은 "유휴 테스트를 얻을 것이다라고 한 대화를 얻을 수 있습니다 ... 예를 들어

on run 
    display dialog "hello!" giving up after 3 
end run 

on idle 
    display dialog "Idle test!" giving up after 3 
    return 5 
on idle 

을이 시도 ! " 메시지를 여러 번 반복합니다. 당신이 당신의 유휴 핸들러에서 호출 그것에서 사용자 정의 함수를 작성, 실행하는 idle 핸들러의 외부의 모든 코드를 기대한다면,이 문제를 해결하려면 "스테이 열기"

로 저장해야합니다.

on yourCustomFunction() 
    -- All the code you want to run prior when the idle function is called 
end yourCustomFunction 

on idle 
    yourCustomFunction() 
    -- any other additional code you want to run here 
    return 5 
end idle 

또 다른 점은 지적하고 싶습니다. tell application "Notifications Scripting"을 필요로하지 않으므로 아래 그림과 같이 display notification을 입력하면됩니다.

on idle 
    if ((seconds of (current date)) = 24) and ((minutes of (current date)) mod 10 = 3) then 
     set newActions to (newActions + 1) 
     set delayTime to 540 
    else 
     set delayTime to 0.5 
    end if 

    if newActions ≥ actions then 
     if newActions = 1 then 
      display notification "You have " & newActions & " new action!" with title "Fallen London" sound name "Glass" 
     else 
      display notification "You have " & newActions & " new actions!" with title "Fallen London" sound name "Glass" 
     end if 
     set newActions to 0 
    end if 
    return delayTime 
end idle 

마지막으로, 난 그냥없이 스크립트 코드를 작성하는 것보다 오히려 on run 핸들러를 추가하는 것이 좋습니다 것입니다.

+0

알림 스크립팅은 알림을 클릭 할 때 처리기를 실행할 수있는 특수한 응용 프로그램입니다. 그 행동은 그것 없이는 불가능합니다. – Saklad5

+0

유휴 처리기 외부의 코드는 실행 중에 실행되며 다시는 실행되지 않습니다. – Saklad5

+0

@ Saklad5 - 알았어, "Notifications Scripting"의 문법은 당신이 그걸 쓰고 싶다고 생각한 표시 공지와 비슷합니다. 유휴 처리기 외부의 코드에 관해서는, 내가 그것을 명확하게하기 위해'on run '으로 감쌀 것이 틀림 없다. – ThrowBackDewd