En XOne utilizamos en nuestros diseños múltiples herramientas que nos brindan la posibilidad de añadir bondades y funcionalidades a nuestras apps.

De esta forma se ha implementado también funciones que permiten habilitar y controlar el uso de SMS en las Apps XONe. Las funciones relacionados para el control de SMS son:

Uso y Control de SMS by XONe
smsService.send Envío de SMS
smsService.sendRetry Reintento de envío de SMS
smsService.requestPhoneNumber Verificación número de teléfono
smsService.requestSmsVerification Verificación de SMS
smsService.getAppSmsSignatureHashes Para simular ser el servidor que enviará los SMS de verificación


La diferencia entre smsService.send y smsService.sendRetry radica en que en smsService.send se envía el sms y si falla pues no se intenta más, simplemente falló el envío y con el smsService.sendRetry se crea un servicio que mantiene el envío del sms hasta completar el éxito.


Ejemplos:

const SMS_TEXT = "Su código de verificación XOne es: ";
 
function doSendSms() {
    if (!self.MAP_PHONE_NUMBER) {
        throw "Especifique un número de teléfono";
    }
    smsService.send(self.MAP_PHONE_NUMBER, self.MAP_TEXT);
}
 
function doSendSmsWithRetry() {
    if (!self.MAP_PHONE_NUMBER) {
        throw "Especifique un número de teléfono";
    }
    smsService.sendRetry(self.MAP_PHONE_NUMBER, self.MAP_TEXT);
}
 
/**
 * Con esto simulamos ser el servidor que enviará los SMS de verificación
 */
function doSendTestVerificationSms() {
    if (!self.MAP_PHONE_NUMBER) {
        throw "Especifique un número de teléfono";
    }
    let sHashes = smsService.getAppSmsSignatureHashes();
    smsService.send(self.MAP_PHONE_NUMBER, SMS_TEXT + "123456\n\n" + sHashes[0]);
}
 
/**
 * Puede devolver nulo si el usuario no lo ha dado. Controlar en ese caso que el
 * usuario lo introduzca.
 * 
 * Esto es solo una pista, no hay ninguna garantía de que sea el número real del
 * teléfono, luego no se debe usar en ningún proceso 100% automático, hay que
 * mostrárselo al usuario para que lo dé por bueno.
 */
function doRequestPhoneNumber() {
    self.MAP_PHONE_NUMBER = smsService.requestPhoneNumber();
    ui.refresh("MAP_PHONE_NUMBER");
}
 
function doRequestSmsVerification() {
    smsService.requestSmsVerification(onVerificationSmsReceived);
}
 
/**
 * Los valores posibles de sStatus son: "success"/"timeout"/"error"
 */
function onVerificationSmsReceived(sSms, sStatus) {
    if (sStatus != "success") {
        ui.showToast("Error al recibir SMS de verificación: " + sStatus);
        return; 
    }
    let nIndex = sSms.indexOf(SMS_TEXT);
    if (nIndex !== 0) {
        ui.showToast("El SMS no tiene el formato correcto");
        return; 
    }
    let sVerificationCode = sSms.substring(SMS_TEXT.length, SMS_TEXT.length + 6);
    // En la vida real, enviar esto a un servicio web y descartarlo
    ui.showToast("El código de verificación es: " + sVerificationCode);
}