Seu adorável mac não se limpa bem quando você instala e exclui um navegador. Considere o seguinte código:
- (void)setUpExternalBrowsers {
browsers = CFBridgingRelease(LSCopyAllHandlersForURLScheme(CFSTR("https")));
for (int i = 0; i < [browsers count]; i++ ) {
NSDictionary *row = [browsers objectAtIndex:i];
NSString *path = [[NSWorkspace sharedWorkspace] absolutePathForAppBundleWithIdentifier:[NSString stringWithFormat:@"%@", row]];
NSString *appName = [[path componentsSeparatedByString:@"/"] lastObject];
NSString *name = [appName stringByReplacingOccurrencesOfString:@".app" withString:@""];
[otherBrowsers addItemWithTitle:name];
}
}
Parece bom certo? Pegue uma lista de aplicativos instalados que respondem https
e, em seguida, adicione-os ao nosso MutableArray. O problema é o usuário que instalou seu aplicativo e, em seguida, excluiu o Great WebBrowser de Mike, mas o Mac OS X deixou alguns resíduos que fazem parecer que o aplicativo de Mike ainda está instalado.
Quando este método for executado, você irá disparar uma exceção não capturada e seu aplicativo fará uma viagem unilateral para crashville.
Para ajudar o Mac OS X a fazer a coisa certa, simplesmente instancie o gerenciador de arquivos e use-o para verificar se um executável realmente está onde o MacOS X pensa que está.
- (void)setUpExternalBrowsers {
browsers = CFBridgingRelease(LSCopyAllHandlersForURLScheme(CFSTR("https")));
NSFileManager *fileManager = [NSFileManager defaultManager];
for (int i = 0; i < [browsers count]; i++ ) {
NSDictionary *row = [browsers objectAtIndex:i];
NSString *path = [[NSWorkspace sharedWorkspace] absolutePathForAppBundleWithIdentifier:[NSString stringWithFormat:@"%@", row]];
if ([fileManager fileExistsAtPath:path]) {
NSString *appName = [[path componentsSeparatedByString:@"/"] lastObject];
NSString *name = [appName stringByReplacingOccurrencesOfString:@".app" withString:@""];
[otherBrowsers addItemWithTitle:name];
}
}
}
Mole-mole.