Push notification setup is long and complex but generally has following process. Don't forget to read documentation of relevant kamailio modules for proper use.
1. The iOS app must send push notification parameters in SIP request e.g. SIP Register. In kamailio, when this request is received, you must extract them and save them in some db backend, e.g. MySQL, Redis etc.
2. For each income call, check if destination is offline and push parameters stored in db. If so, then you suspend the INVITE transaction using ASYNC or TSILO module and store transaction information in db.
3. Then using the push parameters stored in db, you send the push notification to device using CURL or HTTP client modules etc.
4. When device receives push notification, it must come online and send SIP register with push parameters. Kamailio again stores push parameters and checks if an INVITE transaction is waiting for the device. Retrieve the transaction, restore it and forward call to the device.
5. If device does not comes online upon receiving push notification and call times out or caller hangs up the call then you need to clean up transaction data stored in db. Similarly, you need to setup mechanism to purge push notification data after some time e.g. 7 or 10 days to ensure device push parameters remain up to date etc.
The iOS apps now need to implement CallKit for push notification capable calls, that adds some serious difficultly in processing such calls since they show fake call screen before the actual call is received by app and if callee is too quick to respond to call (answer or reject) then kamailio will never know and still send the real call (step 4 above) later on, so you will need to manage that too.