Un problema con el bloqueo de ejecución de la máquina real del paquete.

Un problema con el bloqueo de ejecución de la máquina real del paquete.

1. Descripción del problema

1.1. Entorno operativo

  • Versión del simulador: iPhone6 ​​&& 8.4 || 9.3
  • Versión de la máquina real: iPhone6p && 8.4
  • Certificado firmado: certificado emitido por la empresa, certificado de desarrollo personal

1.2. Antecedentes

Después de que la función de la aplicación se haya completado básicamente, debido a que la versión de iOS se usará para demostrar a los líderes, la empaqueté apresuradamente según las necesidades de la mañana.

1.3. Problema

Debido a que hubo un problema de que el paquete de compilación no pudo instalar el teléfono móvil 5c hace dos días (la arquitectura no coincide, / (ㄒ o ㄒ) / ~~), así que honestamente empaquetado con el archivo de certificado empresarial, empaquetado y cargado en el Sitio web de Dandelion, y luego usó Probar la instalación del escaneo 6p del teléfono móvil.

Después de que la instalación fue exitosa, hice clic en todas las funciones, pero al final encontré de repente que una función para abrir una página web reportaba un error 404, y varias funciones de página web abiertas en otra página simplemente fallaban y fallaban. Después de un rato en mi mente, rápidamente llevé la URL al navegador y la abrí, lo cual es normal. Luego use el simulador para ejecutar el punto de interrupción y descubrió que también es normal. ¡Es normal usar un certificado de desarrollador personal para depurar en una máquina real! !

2. Solución

2.1. Ideas

Debido a que es normal que se ejecute en el simulador y en el modo de depuración de la máquina real, comencé a sospechar que el problema radica en el certificado empresarial o en el paquete del archivo.

Así que probé otro paquete de archivo de certificado empresarial y descubrí que todavía existe el mismo problema. El problema no existe con el uso de paquetes de creación de certificados empresariales. Así que creo que el problema sigue estando en el empaquetado del archivo.

Revisé el registro de fallas del teléfono en Xcode y encontré una aplicación de terminación debido a una excepción no detectada ' NSInvalidArgumentException ', motivo: ' * setObjectForKey: el objeto no puede ser nulo (clave: nsrsbh) mensaje de error.

Y esta información nsrsbh solo tiene valor cuando la aplicación está conectada. Sin embargo, se puede acceder directamente a la función que tiene el problema de bloqueo sin necesidad de iniciar sesión.

Entonces, el problema final se encuentra en el siguiente código:

        GDWebURLParseType parseType;
        if ([extraInfo[@"parserType"] isEqualToString:@"tgc"]) {
            parseType = GDWebURLParseTypeTGC;
        } else if ([extraInfo[@"parserType"] isEqualToString:@"cl"]) {
            parseType = GDWebURLParseTypeCL;
        } else if ([extraInfo[@"parserType"] isEqualToString:@"lt"]) {
            parseType = GDWebURLParseTypeLT;
        }
        webUrl = [GDUtil parseWebURL:webUrl parseType:parseType];

La variable parseType es una variable enumerada,

typedef NS_ENUM(NSUInteger, GDWebURLParseType) {
    GDWebURLParseTypeLT,
    GDWebURLParseTypeCL,
    GDWebURLParseTypeTGC
};

El método + GDUtil parseWebURL: parseType: ensamblará la URL de acuerdo con los diferentes parseType. Cuando parseType es GDWebURLParseTypeLT, se utilizará la asignación de campo nsrsbh en la información de bloqueo anterior.

Desde este punto de vista, el problema radica en el valor predeterminado de parseType, que es un número aleatorio en el modo de simulación / depuración, mientras que es 0 en la máquina de archivo real, por lo que se ingresa la lógica del código que debe registrarse en el estado no registrado., Lo que conduce a un bloqueo.

2.2. Conclusión

Ahora que se ha localizado el problema, es fácil solucionarlo, solo es necesario asignar un valor inicial al tipo de enumeración.

GDWebURLParseType parseType = NSIntegerMax;

Después de la modificación, volver a archivar, empaquetar, instalar y ejecutar, todo está bien.

3. Razón

La razón de este problema no se ha investigado en profundidad, pero a partir de las reglas gramaticales normales, el valor inicial del tipo de enumeración definido globalmente es 0, que en este caso es GDWebURLParseTypeLT. Por lo tanto, se deben mantener buenos hábitos de codificación al codificar y se debe realizar la inicialización de variables.

Supongo que te gusta

Origin blog.csdn.net/jhq1990/article/details/51758367
Recomendado
Clasificación