Você não pode, e quanto mais as pessoas entenderem isso, e quanto mais entenderem, melhor para o mundo.
O código que é executado em um dispositivo sob o controle do usuário não pode ser controlado. Os smartphones podem ser desbloqueados. Os decodificadores podem ser quebrados. Os navegadores comuns nem tentam impedir o acesso ao código JavaScript. Se você tem algo que vale a pena roubar ou abusar, um atacante determinado será capaz de fazer isso, a menos que você valide tudo o que você aprecia do lado do servidor.
A ofuscação é de muito pouca ajuda; o tipo de oponente que você atrairá assim que algo remotamente financeiro estiver envolvido, lê linguagem assembly como anúncios classificados. A criptografia não pode ajudá-lo, porque o dispositivo que protegeria a chave é o mesmo dispositivo que você tem que assumir que está quebrado. Existem muitas contramedidas aparentemente óbvias que não funcionam, por razões semelhantes.
Infelizmente, esta é uma verdade muito inconveniente. O mundo está cheio de pequenos operadores que pensam que podem de alguma forma contornar o quebrantamento fundamental da confiança remota, simplesmente porque seria tão bom se pudéssemos supor que o nosso código ser executado da maneira que assumimos. E sim, isso tornaria tudo tão mais fácil que nem é engraçado. Mas desejar não o faz, e esperar que você seja o único biscoito esperto que pode evitar o desconforto só vai queimar você e seus clientes. Portanto, entenda que a Internet é território inimigo, inclua esse custo adicional em suas estimativas e você ficará bem.
Dito isso, é claro que existe uma defesa em profundidade. Ofuscar seu JavaScript não adia um atacante determinado, mas pode adiar alguns invasores menos determinados. Se seus ativos valerem o suficiente para proteger, mas não a qualquer custo, qualquer uma dessas medidas poderá agregar valor comercial ao seu sistema; simplesmente não pode ser perfeito. Contanto que você esteja totalmente ciente do trade-off que está fazendo, essa pode ser uma estratégia razoável.