Version: 2018.1
Preparing your application for In-App Purchases (IAP)
App thinning

Customising WWW requests on 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];

Next, we add a header field called “Secret” that provides some additional data. In a real game, this might be a value checked by the server to verify the source of the connection.

    [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);

The custom code is transparent to the use of the WWW class within Unity - no extra code needs to be added to the C# script.


Preparing your application for In-App Purchases (IAP)
App thinning