A working implementation of push notifications involves many things, such as:
- Keeping track of Device IDs (web service for the device to contact, database to store the IDs)
- Storing metadata associated with each Device ID (ie. so you can refer to a device by a username or a group of devices by a tag)
- Keeping track of which devices have been deactivated (which happens if the user turns of notifications)
- Clearing out bad Device IDs
- Actually forming the raw request to send the message to Apple's servers
- Some sort of service/program to know when you need to send the notifications
Urban Airship takes care of 1-5 for you, which greatly simplifies the whole process. Yes, you if were just sending a message to one device, you could probably find a C# or python or Objective-C library to connect to Apple and form the message but as soon as you need to keep track of a large number of devices, Urban Airship provides a service for free (if under 1 million pushes a month) to take a lot of work off your shoulders.
(And this is just for the basic push service for iPhone, as this is the only service I have used)
To answer your other question, you do still need some 'server' or program to know when to push (#6). I, for example, monitor twitter with a python program for keywords and send out notifications when I see those. My program is not concerned with the details of how to send notifications, the Urban Airship library I use takes care of the interaction with Urban Airship and Apple.