Есть одна фундаментальная проблема, вся подпись будет на клиенте, а клиент всегда можно реверс-инженерить, так что сделать доступ только официальному клиенту не получится.
Однако, что получится, так это усложнить процесс получения доступа.
Например: Встроить в приложение публичный ключ и шифровать все данные с помощью него и на сервере с помощью приватного ключа расшифровывать.
Это поможет защититься от простого сниффинга запросов на сервер.
Что-бы усложнить получение публичного ключа, можно попытаться применить обфускацию, например с помощью, cocoapods-keys или подобных инструметнов.
Тем не менее, обфуцированные ключи тоже достаточно просто достать, нужно всего-лишь использовать дебаггер.