El servicio web de la API de Google Places con Swift devuelve el error 303

Estoy tratando de usar el servicio web de Google Places a través de iOS (usando swift). La razón por la que quiero hacerlo es que quiero permitir explorar lugares en un mapa, incluso si no están cerca (la única búsqueda permitida usando la biblioteca proporcionada por iOS). También necesito hacerlo mediante programación (ya que en un caso de uso quiero permitir navegar por el mapa, mientras que en otro caso de uso, quiero que los lugares sean constantes y no cambien según la cámara del mapa). No puedo usar el selector de lugares de iOS, ya que quiero que el mapa muestre información sobre los lugares en él (y en un caso de uso para no cambiar) ... (Si tiene una mejor idea de diseño para este problema, deje que yo sé..)

Cuando llamo al servicio web API de Google Places, aparece el error 303. En el servicio web API de Google no cuenta la llamada, por lo que supongo que falló, aunque 303 debería ser redirigido.

Construí una clase para comunicarme con el servicio web (guardo la dirección del servidor en la configuración). Esta clase también está estructurada para proporcionar los resultados de forma inmediata (y no en una devolución de llamada).

¿Por qué recibo un error en lugar de una redirección? ¿Hay alguna forma de manejarlo? ¿Alguna idea de qué puedo hacer para evitar la redirección?

¡¡Gracias!!

Aquí está (una plantilla) de mi código: reduje gran parte de mi lógica y dejé la llamada al servicio web (PlaceMarker es solo una clase que devuelvo, puede modificarlo a String):

class GooglePlacesWS : NSObject, NSURLConnectionDelegate, NSURLConnectionDataDelegate , URLSessionDelegate{

var DataReady : Bool!;
var Data : Foundation.Data!;
var opQueue : OperationQueue!;
var _responseData : NSMutableData!;
var error = false;

func getPlacesNear(_ point : CLLocationCoordinate2D, _ radius: Double)->[PlaceMarker]!
{
    var retVal  = [PlaceMarker]();

    var locationJson = ["location": String(format:"%f, %f",point.latitude,point.longitude), "key": “MyKey”];

    if (radius > 0){
        locationJson["raidus"] = String(format:"%d",Int(radius));
    }

    // Fires the request to the server
    var reply : String = HtmlToText(FireRequest(locationJson));
    if reply == "" { return nil}

    return retVal;
}

//MARK: Connection

var session : URLSession? = nil;
var dataTasks : URLSessionTask? = nil;

func sendRequestNew(_ request : URLRequest)
{
    DataReady = false;
    Data = nil;

    let task = session!.dataTask(with: request, completionHandler: {data, response,error in

        if (error != nil){

            NSLog("Error reading d,ata from web service: " + error!.localizedDescription);
            self.Data = nil;
            self.error = true;
            self.DataReady = true;
        }
        else{
            if (data != nil){
                self.Data = data;
                OSMemoryBarrier();
                self.DataReady = true;
            }
        }

    });
    task.resume();
    dataTasks = task;
}

// Changes a string to an HTML friendly tags (so the XML will transfer a string)
func textToHtml (_ htmlString : String) -> String
{
    var retHtml = htmlString;
    retHtml = retHtml.replacingOccurrences(of: "&",  with: "&");
    retHtml = retHtml.replacingOccurrences(of: "<",  with: "&lt;");
    retHtml = retHtml.replacingOccurrences(of: ">",  with: "&gt;");
    retHtml = retHtml.replacingOccurrences(of: "\"", with: "&quot;");
    retHtml = retHtml.replacingOccurrences(of: "'",  with: "&#039;");
    //retHtml = retHtml.stringByReplacingOccurrencesOfString("\n", withString: "<br>");
    return retHtml;
}

// Changes an HTML string to a regular xml (changes the & tags to actual signs)
func HtmlToText(_ textString : String)->String
{
    var retString: String = textString;
    retString = retString.replacingOccurrences(of: "&amp;",  with:"&");
    retString = retString.replacingOccurrences(of: "&lt;",  with:"<");
    retString = retString.replacingOccurrences(of: "&gt;",  with:">");
    retString = retString.replacingOccurrences(of: "&quot;", with:"\"");
    retString = retString.replacingOccurrences(of: "&#039;",  with:"'");
    retString = retString.replacingOccurrences(of: "<br>", with:"\n");
    return retString;
}


// Sends the request to the server
func FireRequest (_ query : [String:String]) ->String
{
    var retVal : String = "";

    do{
        // Builds the final URL request (adds the headers, and the WS addy)
        let config :UserDefaults = UserDefaults();
        //var myDict: NSDictionary?
        if let path : String = config.object(forKey: "googleServerAddy") as? String
        {
            let url = URL(string: path);
            //let theRequest = NSMutableURLRequest(url: url!);
            var request = URLRequest(url: url!);
            request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")
            request.httpMethod = "GET";
            request.httpBody = try JSONSerialization.data(withJSONObject: query, options: []);


            sendRequestNew(request);

            while (DataReady == false)
            {
                Thread.sleep(forTimeInterval: 0.01);
            }

            if (!error)
            {
                let result : Foundation.Data = Data!;

                // Reads the response...
                retVal = NSString(data: result, encoding:String.Encoding.utf8.rawValue)! as String;
            }
            else
            {
                retVal = "";
            }
        }
    }
    catch{

    }

    return retVal;
}


//MARK: NSURLConnection delegates
func connection(_ connection: NSURLConnection, willSend request: URLRequest, redirectResponse response: URLResponse?) -> URLRequest? {

    return request;
}


override init() {
    super.init();

    opQueue = OperationQueue();

    session = URLSession(configuration: URLSessionConfiguration.default, delegate: self, delegateQueue: opQueue);
    }
}

Respuestas a la pregunta(2)

Su respuesta a la pregunta