Estoy escribiendo una aplicación Cocoa, que usa NSURLs - Necesito eliminar la parte del fragmento de la URL (la parte #BLAH).Eliminando fragmento de url de NSURL
ejemplo: http://example.com/#blah debería terminar como http://example.com/
me encontré con algo de código en WebCore que parece hacerlo mediante el uso de la funcionalidad CFURL, pero nunca se encuentra la porción fragmento de la URL. He encapsulado en una categoría extensión:
-(NSURL *)urlByRemovingComponent:(CFURLComponentType)component {
CFRange fragRg = CFURLGetByteRangeForComponent((CFURLRef)self, component, NULL);
// Check to see if a fragment exists before decomposing the URL.
if (fragRg.location == kCFNotFound)
return self;
UInt8 *urlBytes, buffer[2048];
CFIndex numBytes = CFURLGetBytes((CFURLRef)self, buffer, 2048);
if (numBytes == -1) {
numBytes = CFURLGetBytes((CFURLRef)self, NULL, 0);
urlBytes = (UInt8 *)(malloc(numBytes));
CFURLGetBytes((CFURLRef)self, urlBytes, numBytes);
} else
urlBytes = buffer;
NSURL *result = (NSURL *)CFMakeCollectable(CFURLCreateWithBytes(NULL, urlBytes, fragRg.location - 1, kCFStringEncodingUTF8, NULL));
if (!result)
result = (NSURL *)CFMakeCollectable(CFURLCreateWithBytes(NULL, urlBytes, fragRg.location - 1, kCFStringEncodingISOLatin1, NULL));
if (urlBytes != buffer) free(urlBytes);
return result ? [result autorelease] : self;
}
-(NSURL *)urlByRemovingFragment {
return [self urlByRemovingComponent:kCFURLComponentFragment];
}
Esto se utiliza como tal:
NSURL *newUrl = [[NSURL URLWithString:@"http://example.com/#blah"] urlByRemovingFragment];
por desgracia, NEWURL termina siendo "http://example.com/#blah" porque la primera línea en urlByRemovingComponent siempre devuelve kCFNotFound
Estoy perplejo. ¿Hay una mejor manera de resolver esto?
Código de Trabajo, gracias a Nall
-(NSURL *)urlByRemovingFragment {
NSString *urlString = [self absoluteString];
// Find that last component in the string from the end to make sure to get the last one
NSRange fragmentRange = [urlString rangeOfString:@"#" options:NSBackwardsSearch];
if (fragmentRange.location != NSNotFound) {
// Chop the fragment.
NSString* newURLString = [urlString substringToIndex:fragmentRange.location];
return [NSURL URLWithString:newURLString];
} else {
return self;
}
}
cerca. aparentemente lastPathComponent devuelve el fragmento, y es un método NSString. He publicado el código final de la pregunta. – pixel
NSURL también tiene un lastPathComponent que no devuelve el fragmento, pero es 10.6+ http://developer.apple.com/mac/library/documentation/Cocoa/Reference/Foundation/Classes/NSURL_Class/Reference/Reference.html# // apple_ref/doc/uid/20000301-SW22 – nall
¿Qué pasa con url.fragment? – Sam