Note: I'm assuming that by "asynchronous" you mean "do this whether or not the user is logged in and running the application at 9:30 am".
The right way to do this is to register a call with launchd that handles the appropriate work for your application. When and how you do this is somewhat flexible. If you're using a
.pkg-type installation script you can register the helper on installation. Or you can register on first run of your application, perhaps after the user has provided sufficient configuration information for the helper app to do it's job.
The Daemons and Services guide delves in to how to do this in great detail. I recommend reading that. And for a description of plist properties that launchd looks at see this manual page.
As a very high-level example, let's assume your helper application can be found in your package under
MyPackage.app/Contents/SharedSupport/bin/myhelper. Here's a
plist file that would launch it every day at 9:30 am and 9:30 pm on the machine:
<?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">
<!-- This label needs to be unique to the system -->
<!-- Toggle to true to prevent it from running -->
<!-- This is the full path to the helper application -->
<!-- This is an array of string arguments to pass in to the app when it's called -->
<!-- This works much like cron to state when the job should be run -->
<!-- Run at 9:30 am -->
<!-- Run at 9:30 pm -->
Save that in
/Library/LaunchAgents/com.mycompany.mypackage.myhelper.plist on your machine and then type:
sudo launchctl load /Library/LaunchAgents/com.mycompany.mypackage.myhelper.plist
To register it right away with
launchd. On reboot it should register automatically. See the launchctl man page for more information on using it to interface with launchd.