Como lidar com um esquema de URL padrão

Eu quero construir suporte a URI (ou esquema de URL) no meu aplicativo.

Eu faço um LSSetDefaultHandlerForURLScheme() no meu + (void)initialize e eu configurei os esquemas de URL específicos também no meu info.plist . Então eu tenho esquemas de URL sem o Apple Script ou o Apple Events .

Quando eu chamo myScheme: no meu navegador favorito, o sistema ativa meu aplicativo.

O problema é como lidar com os esquemas quando eles são chamados. Ou melhor dito: Como posso definir o que meu aplicativo deve fazer quando myScheme: é chamado.

Existe um método especial que eu tenho que implementar ou eu tenho que registrar um em algum lugar?

Como você está mencionando o AppleScript, suponho que você esteja trabalhando no Mac OS X.

Uma maneira simples de registrar e usar um esquema de URL personalizado é definir o esquema em seu .plist:

 CFBundleURLTypes   CFBundleURLName URLHandlerTestApp CFBundleURLSchemes  urlHandlerTestApp    

Para registrar o esquema, coloque isso na boot do seu AppDelegate:

 [[NSAppleEventManager sharedAppleEventManager] setEventHandler:self andSelector:@selector(handleURLEvent:withReplyEvent:) forEventClass:kInternetEventClass andEventID:kAEGetURL]; 

Sempre que seu aplicativo é ativado por meio de um esquema de URL, o seletor definido é chamado.

Um stub para o método de manipulação de events, que mostra como obter a string de URL:

 - (void)handleURLEvent:(NSAppleEventDescriptor*)event withReplyEvent:(NSAppleEventDescriptor*)replyEvent { NSString* url = [[event paramDescriptorForKeyword:keyDirectObject] stringValue]; NSLog(@"%@", url); } 

Documentação da Apple: Instalando um manipulador de URL Get

Atualização Acabei de notar um problema para aplicativos em área restrita que instalam o manipulador de events em applicationDidFinishLaunching: Com o sandbox ativado, o método do manipulador não é chamado quando o aplicativo é iniciado, clicando em uma URL que usa o esquema personalizado. Instalando o manipulador um pouco antes, em applicationWillFinishLaunching: :, o método é chamado como esperado:

 - (void)applicationWillFinishLaunching:(NSNotification *)aNotification { [[NSAppleEventManager sharedAppleEventManager] setEventHandler:self andSelector:@selector(handleURLEvent:withReplyEvent:) forEventClass:kInternetEventClass andEventID:kAEGetURL]; } - (void)handleURLEvent:(NSAppleEventDescriptor*)event withReplyEvent:(NSAppleEventDescriptor*)replyEvent { NSString* url = [[event paramDescriptorForKeyword:keyDirectObject] stringValue]; NSLog(@"%@", url); } 

No iPhone, a maneira mais fácil de lidar com a ativação do esquema de URL é implementar o application:handleOpenURL: – Documentation

Todos os créditos devem ir para weichsel e kch

Estou adicionando código swift (2.2 / 3.0) para sua conveniência

 func applicationWillFinishLaunching(_ notification: Notification) { NSAppleEventManager.shared().setEventHandler(self, andSelector: #selector(self.handleGetURL(event:reply:)), forEventClass: UInt32(kInternetEventClass), andEventID: UInt32(kAEGetURL) ) } func handleGetURL(event: NSAppleEventDescriptor, reply:NSAppleEventDescriptor) { if let urlString = event.paramDescriptor(forKeyword: keyDirectObject)?.stringValue { print("got urlString \(urlString)") } } 

O problema é como lidar com os esquemas quando eles são chamados.

É aí que entram os events da Apple. Quando o Launch Services deseja que seu aplicativo abra um URL, ele envia ao seu aplicativo um evento kAEGetURL / kAEGetURL .

O Cocoa Scripting Guide usa essa mesma tarefa como um exemplo de instalação de um manipulador de events .

Você pode definir o comando “get URL” em uma terminologia de script SDEF e implementar o método correspondente. Por exemplo, o SDEF do Terminal contém a seguinte definição de comando para manipular URLs

  

e declara que o aplicativo responde a ele:

       

A class TTApplication (uma subclass de NSApplication) define o método:

 - (void)handleGetURLScriptCommand:(NSScriptCommand *)command { … } 
Intereting Posts