Version: 2017.1
Preparando su aplicación para "In App Purchases" (Compras dentro de la aplicación)
App thinning

Personalizando Solicitudes WWW en iOS

Usted puede utilizar un plugin para remplazar el código predeterminado que Unity utiliza cuando maneja solicitudes con la clase WWW. Usted podría hacer esto, por ejemplo, para cambiar el comportamiento de caching por defecto, que caches lo básico del URL.

Ejemplo

El siguiente código (descrito en más detalla a continuación) desactiva el método por defecto de caching y agrega un campo de cabecera “secreto” a la solicitud en adición a la cabecera especificada desde el código script del juego.

    // Code placed at Plugins/iOS/CustomConnection.mm within the Assets folder.

    #include "Unity/WWWConnection.h"

    @interface UnityWWWCustomRequestProvider : UnityWWWRequestDefaultProvider
    {
    }
    + (NSMutableURLRequest*)allocRequestForHTTPMethod:(NSString*)method url:(NSURL*)url headers:(NSDictionary*)headers;
    @end

    @implementation UnityWWWCustomRequestProvider
    + (NSMutableURLRequest*)allocRequestForHTTPMethod:(NSString*)method url:(NSURL*)url headers:(NSDictionary*)headers
    {
        NSMutableURLRequest* request = [super allocRequestForHTTPMethod:method url:url headers:headers];

        // let's pretend for security reasons we dont want ANY cache nor cookies
        request.cachePolicy = NSURLRequestReloadIgnoringLocalCacheData;
        [request setHTTPShouldHandleCookies:NO];

        // let's pretend we want special secret info in header
        [request setValue:@"123456789"forHTTPHeaderField:@"Secret"];

        return request;
    }
    @end

    @interface UnityWWWCustomConnectionDelegate : UnityWWWConnectionDelegate
    {
    }
    @end

    @implementation UnityWWWCustomConnectionDelegate
    - (NSCachedURLResponse*)connection:(NSURLConnection*)connection willCacheResponse:(NSCachedURLResponse*)cachedResponse
    {
        // we dont want caching
        return nil;
    }
    - (void)connection:(NSURLConnection*)connection didReceiveResponse:(NSURLResponse*)response
    {
        // let's just print something here for test
        [super connection:connection didReceiveResponse:response];
        if([response isMemberOfClass:[NSHTTPURLResponse class]])
            ::printf_console("We've got response with status: %d\n", [(NSHTTPURLResponse*)response statusCode]);
    }
    @end

    IMPL_WWW_DELEGATE_SUBCLASS(UnityWWWCustomConnectionDelegate);
    IMPL_WWW_REQUEST_PROVIDER(UnityWWWCustomRequestProvider);

El código se desglosa de la siguiente manera. Primero, nosotros creamos una subclase de UnityWWWRequestDefaultProvider para proporcionar un objeto NSURLRequest modificado para la conexión. Otra opción es simplemente implementar el protocolo UnityWWWRequestProvider en la clase desde cero. Sin embargo, en este caso, nosotros queremos hacer uso del código existente de Unity.

    @interface UnityWWWCustomRequestProvider : UnityWWWRequestDefaultProvider
    {
    }
    + (NSMutableURLRequest*)allocRequestForHTTPMethod:(NSString*)method url:(NSURL*)url headers:(NSDictionary*)headers;
    @end

La “acción” sucede en allocRequestForHTTPMethod que comienza llamando el mismo método en la súper clase:

    @implementation UnityWWWCustomRequestProvider
    + (NSMutableURLRequest*)allocRequestForHTTPMethod:(NSString*)method url:(NSURL*)url headers:(NSDictionary*)headers
    {
        NSMutableURLRequest* request = [super allocRequestForHTTPMethod:method url:url headers:headers];

Desde ahí, nosotros desactivamos el caching de información predeterminada hecho por iOS y también desactivamos las cookies:

    request.cachePolicy = NSURLRequestReloadIgnoringLocalCacheData;
    [request setHTTPShouldHandleCookies:NO];

Ahora, nosotros agregamos un campo de cabecera llamado “Secret” que proporciona alguna información adicional. En un juego real, esto podría ser un valor revisado por el servidor para verificar la fuente de la conexión, digamos.

    [request setValue:@"123456789"forHTTPHeaderField:@"Secret"];

Habiendo creado la solicitud de manejo de clase personalizado, nosotros también necesitamos crear una subclase de UnityWWWConnectionDelegate para personalizar el manejo de conexión:

    @interface UnityWWWCustomConnectionDelegate : UnityWWWConnectionDelegate
    {
    }
    @end

Nosotros podemos desactivar el caching de información devolviendo un valor null del método connection:willCacheResponse: :

    - (NSCachedURLResponse*)connection:(NSURLConnection*)connection willCacheResponse:(NSCachedURLResponse*)cachedResponse
    {
        // we dont want caching
        return nil;
    }

Nosotros podemos manejar la conexión en sí misma desde connection:didReceiveResponse:, nosotros deberíamos llamar el mismo método en la súper clase para obtener la información. Aquí, nosotros simplemente devolvemos un mensaje a la consola cuando la conexión sucede pero usted puede implementar cualquier cosa que le guste aquí:

    - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
    {
        // let's just print something here for test
        [super connection:connection didReceiveResponse:response];
        if([response isMemberOfClass:[NSHTTPURLResponse class]])
            ::printf_console("We've got response with status: %d\n", [(NSHTTPURLResponse*)response statusCode]);
    }

Finalmente, nosotros registramos nuestro nuevo delegado de conexión y proveedor de solicitud con Unity para que sean llamados cuando una solicitud WWW sea invocada desde un script.

    IMPL_WWW_DELEGATE_SUBCLASS(UnityWWWCustomConnectionDelegate);
    IMPL_WWW_REQUEST_PROVIDER(UnityWWWCustomRequestProvider);

El código personalizado es transparente al uso de la clase WWW dentro de Unity - no se necesita que más código sea agregado al script C#/JS.

Preparando su aplicación para "In App Purchases" (Compras dentro de la aplicación)
App thinning