Não deixe que aplicativos fantasmas travem seu aplicativo Mac.

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 httpse, 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.