When I first became interested in the idea for the app, I quickly ran into the same limitations with CallKit. What my app, MyHumans, does is relay the call through a backend service which sends it to your phone via a VoIP call using CallKit. CallKit allows the incoming call to act nearly the same UI-wise as a normal incoming call. The backend service is then able to filter calls using salted hashes of numbers from your contacts.