Consider EteSync as a solution. FOSS, can be self-hosted, available on multiple platforms, etc:
1. There is a CalDav/CardDav bridge which lets you use apps that don't implement the ETE protocol which is good because...
2. The iOS app is nigh unusable. It is painfully slow, requires manual syncing, and if your screen turns off in the middle of a sync, it may get killed by iOS forcing you to start the whole thing over again. Just set up the DAV bridge and use iOS's native DAV syncing.