I talk with my girlfriend most days. Sometimes multiple times a day. We're in a long distance relationship and, at times, completely different time zones. One habit we wanted to pick up was being able to see each other at any time.
For this to work, we need to be able to auto answer each others calls. One of us could be busy working, but we still wanted to be able to see each other. After days of exploring how to make this happen, I come up with some solutions:
Being the nerd I am, the third option sounded the most fun! From all my research, however, I was amazed no one had implemented a feature so simple into their product. Each of these options have their own drawbacks.
Eventually, I stumbled upon the magic bullet - FaceTime has an option built in to auto answer (defaults write com.apple.FaceTime AutoAcceptInvitesFrom -array-add [email protected]
). It "works", but it comes with even more issues. For example, when you receive a call there is a black overlay over the video call which makes visibility difficult. On a second test, we discovered that it rings infinitely. Well, so much for that.
At this point, we gave up and Keyue needed to sleep. I decided to continue research the following day when she was at work (my night time) and discovered some people had written an AppleScript for this years ago. I stayed up until 4am trying to create a new AppleScript, hacking away in a forgiving syntax I had no idea how to use without the use of Google.
Let's start by opening the "Script Editor" application. Copy and paste the following code into the editor, changing the caller id check to your desired caller. This the caller that is shown next to the profile image and accept button during ringing. For me, Keyue Bao is a contact so I can use her name. If they aren't a contact, you'll need to type the specific email or phone number here.
set contacts to {"Keyue Bao"}
repeat
repeat while application "FaceTime" is running
tell application "System Events"
tell process "FaceTime"
set acceptButton to a reference to (button "Accept" of window 1)
if acceptButton exists then
set callerId to value of static text 2 of window 1
if contacts contains callerId then
click acceptButton
end if
end if
end tell
end tell
delay 2
end repeat
delay 5
end repeat
The script runs on an infinite loop. There is a delay of 5 seconds when the application is closed and 2 seconds when the application is open. It attempts to select the "answer" button on the screen and, if it exists, it checks the caller id and clicks answer. Pretty simple.
Next we want to export the script for execution. Navigate to File -> Export
and save it somewhere you can remember it. For me, it was as Documents/Scripts/facetime-auto-answer
. You need this path for the next step.
Let's create a Launchd script to handle execution on computer start up. Navigate to ~/Library/LaunchAgents
using Terminal (open Terminal and enter cd ~/Library/LaunchAgents
). After that, that's add our file (below) as com.blakeembrey.facetime-auto-answer.plist
(just vi com.blakeembrey.facetime-auto-answer.plist
and hit i
to switch to insert mode).
<?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>Label</key>
<string>com.blakeembrey.FaceTimeAutoAnswer</string>
<key>Program</key>
<string>/usr/bin/osascript</string>
<key>ProgramArguments</key>
<array>
<string>osascript</string>
<string>/Users/blakeembrey/Scripts/facetime-auto-answer.scpt</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>KeepAlive</key>
<true/>
</dict>
</plist>
Make sure you adjust the argument above to the correct path from the export step. Once it's correct, exit back to the terminal (Esc
, :wq
, Enter
) and make Launchd pick up the new script without rebooting.
launchctl load -w com.blakeembrey.facetime-auto-answer.plist
You'll need to accept the accessibility dialog (open system preferences and enable access). We can quickly check that the script is running by entering launchctl list | grep facetime-auto-answer
. And we're done.
FaceTime is really nice for video chatting. It disables automatically when you're in a different window (I regularly use up to 6 windows during a work day for different tasks) and the interface is very simple to use. The video quality is great and, when the call drops temporarily it will automatically join the call again (with the video still enabled - looking at you Skype!). On top of that, it has a low CPU footprint, especially compared with Skype.
However, there's a couple of major issues with it. First off, it makes the rest of the computer quieter which makes it difficult to work or do anything else while on the call. For example, we can't really watch a movie together (audio is dimmed). The second is a feature request. I would love the "floating" window feature from Skype.
And we're done. I'm going to tweak the same script to auto answer Skype next. Hopefully this comes built in with future versions of video chat clients. It's such a basic feature that it's exclusion makes me ponder the disconnect between the teams creating the software and reality.
Questions? Find me on Twitter or open an issue.