¿Cómo elimino la consulta (utilizada para los parameters GET) de una URL?

Estoy creando un pequeño service REST para autorizar a los usuarios a acceder a mi aplicación.

En un momento, el UIWebView que estoy usando para autorizar al usuario, irá a https://myautholink.com/login.php . Esta página envía una respuesta JSON con un token de autorización. Lo que pasa con esta página es que recibe algunos datos a través de GET a través de mi formulario de autorización. No puedo usar sesiones PHP porque llegas a esta página a través de:

header("location:https://myautholink.com/login.php?user_id=1&machine_id=machine_id&machine_name=machine_name&app_id=app_id"); 

Como la function de encabezado envía encabezados, no puedo hacer una session_start(); al mismo time.

Puedo get la URL de request de UIWebView sin problemas utilizando los methods de delegado:

 - (void)webViewDidFinishLoad:(UIWebView *)webView { NSURLRequest *request = [webView request]; NSLog(@"%@", [[request URL] relativeString]); if([[[request URL] absoluteString] isEqualToString:SPAtajosLoginLink]) { //Store auth token and dismiss auth web view. } } 

La cosa es que ninguno de los methods NSURL parece devolver el enlace "limpio" sin los parameters. He mirado todos los methods relacionados con url-string de NSURL:

 - (NSString *)absoluteString; - (NSString *)relativeString; // The relative portion of a URL. If baseURL is nil, or if the receiver is itself absolute, this is the same as absoluteString 

Pero absoluteString es siempre la URL completa con los parameters GET y relativeString es siempre nil.

Estoy rascándome la cabeza con esto y no puedo encontrar la solución. Cualquier ayuda será apreciada.

En lugar de meterse con su propia manipulación de cadenas, NSURLComponents a NSURLComponents :

 NSURLComponents *components = [NSURLComponents componentsWithURL:url]; components.query = nil; // remove the query components.fragments = nil; // probably want to strip this too for good measure url = [components URL]; 

En iOS 6 y versiones anteriores, puede incorporar KSURLComponents para lograr el mismo resultado.

Ejemplo: http://www.google.com:80/a/b/c;params?m=n&o=p#fragment

Utilice estos methods de NSURL:

  scheme: http host: www.google.com port: 80 path: /a/b/c relativePath: /a/b/c parameterString: params query: m=n&o=p fragment: fragment 

O bien, en iOS 7, compile una instancia de NSURLComponents, luego utilice el esquema de methods, usuario, contraseña, host, puerto, ruta, consulta, fragment, para extraer parte de la URL como cadenas. Luego vuelve a generar la URL base.

 NSString* baseURLString = [NSString stringWithFormat:@"%@://%@/%@", URL.scheme, ... NSURL *baseURL = [NSURL URLWithString:baseURLString]; 

Para actualizar esta respuesta para iOS 7 en adelante:

 NSURLComponents *components = [NSURLComponents componentsWithURL: url resolvingAgainstBaseURL: NO]; components.query = nil; // remove the query components.fragment = nil; // probably want to strip this too for good measure url = [components URL]; 

Tenga en count también que no hay propiedad 'fragments'. Es solo "fragment".

De lo contrario, este método es excelente. Mucho mejor que preocuparse por volver a armar la URL correctamente con manijas de cadena.