Ingressos no pulso
Rodrigo Borges Desenvolvedor mobile @ Ingresse
Levando festas e ingressos para o Apple Watch
•Startup de tecnologia aplicada a eventos fundada em Manaus/AM
•Facilitar a compra e venda de ingressos online
•Software móvel completo de vendas e monitoramento de entrada
•25 milhões de reais processados em vendas em 2014
•400 eventos cadastrados em um mês (novembro de 2014)
Ingresse
• Manauara
• Formado em Ciência da Computação (UFAM)
• Mestrado em Computação Ubíqua (UFMG)
• Desenvolvedor mobile na Ingresse (Android & iOS)
Rodrigo Borges Soares @rdgborges [email protected] hUps://br.linkedin.com/in/rdgborges
Ingresse no Apple Watch
• Visualização de QR-‐Codes dos ingressos do usuário
• Visualização de informações dos próximos eventos na cidade
• Notificações para rápido acesso aos ingressos e eventos
App Ingresse e Apple Watch
• A app Ingresse utiliza quase todos os recursos que o Apple Watch tem a oferecer, como Handoff, notificações, Glance, App Groups, etc.
Desenvolvendo para o Apple Watch
• Um app para Apple Watch é uma Extension de uma app para iPhone
• App Extensions é um recurso lançado no iOS 8
• Widgets na central de notificações, teclados customizados, compartilhamento em redes sociais e… relógios!
Navegação entre telas
• Page based: Telas não possuem necessariamente relação entre si
• Hierarchical: Relação hierárquica entre telas do aplicativo
Navegação hierárquica
[self pushControllerWithName:@"eventDetails" context:eventId];
- (void) awakeWithContext:(id)context { NSManagedObjectID *objectID = (NSManagedObjectID*) context;
NSManagedObject *eventObject = [managedObjectContext objectWithID:objectID];
// ...
}
• Chama a próxima tela do aplicativo
• Na nova tela
Navegação hierárquica
• awakeWithContext: Carregar os dados necessários e construir sua interface
•willActivate: Atualizar interface quando ela for mostrada novamente para o usuário (Por exemplo, quando tela ativar)
App Groups: Compartilhamento de dados
• Como acessar os dados do app principal no Apple Watch?
• Com App Groups, os dados são salvos em um contêiner que pode ser acessado tanto do app para iPhone quanto do Apple Watch
• Vale para NSUserDefaults e também para CoreData!
App Groups: Compartilhamento de dados
• NSUserDefaults
NSUserDefaults *userDefaults = [[NSUserDefaults alloc] initWithSuiteName:@"group.ingresse"];
NSURL *appGroupsURL = [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:@"group.ingresse"];
NSURL *storeURL = [appGroupsURL URLByAppendingPathComponent:@"ingresse.sqlite"];
[persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]
• CoreData
Notificações
• A lógica para mostrar notificações é baseada no contexto do usuário
• Notificações Estáticas e Dinâmicas
• Limiar de tempo para carregar notificações dinâmicas
Notificações
- (void) didReceiveLocalNotification:(UILocalNotification*) localNotification withCompletion:(void (^)(WKUserNotificationInterfaceType)) completionHandler { NSString *eventId = [localNotification.userInfo objectForKey:@"eventId"]; }
- (void) didReceiveRemoteNotification:(NSDictionary*) remoteNotification withCompletion:(void (^)(WKUserNotificationInterfaceType)) completionHandler { NSString *eventId = [remoteNotification objectForKey:@"eventId"]; }
• Na NotificationController:
Glance
• Glances são telas que mostram conteúdo relevante das apps instaladas no Watch
• O conteúdo deve ser rápido e fácil de ler
• Ao clicar na Glance, usuário é levado para a primeira tela do aplicativo
Handoff
• Continuidade: permite que ações mais complexas sejam continuadas no iPhone
• Sem necessidade de botão “Abrir no iPhone”
• Desenvolvedor deve declarar o contexto de navegação para a app principal
• Na InterfaceController:
Handoff
- (void) willActivate { [self updateUserActivity:@"com.ingresse.event.details" userInfo:@{@"eventId": eventId} webpageURL:nil]; }
• Declarar um array com nome “NSUserActivityTypes" no .plist da app principal
• Adicionar os identificadores das atividades no array (Exemplo: “com.ingresse.event.details”)
• Na AppDelegate do app principal:
Handoff
- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray *restorableObjects))restorationHandler { NSDictionary *userInfo = userActivity.userInfo; NSString *activityType = userActivity.activityType;
NSString *eventId = [userInfo objectForKey:@"eventId"]; if ([activityType isEqualToString:@"com.ingresse.event.details"]) {
} return YES; }
Apple Watch drops
• É uma boa prática informar ao usuário para abrir o iPhone para ver mais informações (Handoff). Nada de botão “Abrir no iPhone”!
• Tanto Glances quanto notificações podem ser testadas utilizando o simulador do Xcode
• Os números de Version e Build devem ser os mesmos na app principal e na app para o Apple Watch
• Não esqueça de migrar seus dados para o armazenamento compartilhado ao utilizar App Groups
Referências
• WatchKit (Apple Developer). Seção sobre o Apple Watch do site de desenvolvedores da Apple. https://developer.apple.com/watchkit/
• Ingressos no pulso (Medium). https://medium.com/@rdgborges/ingressos-‐no-‐pulso-‐5b0b43162709
• Watch Aware: Base de dados de apps para Apple Watch publicadas na App Store (e onde eu fiz a imagem legal do primeiro slide ☺). http://watchaware.com/
That’s all folks!
Rodrigo Borges Desenvolvedor mobile @rdgborges [email protected] hUps://br.linkedin.com/in/rdgborges
Rodrigo Maués Designer de UX e desenvolvedor mobile @rdgmaues [email protected] hUps://br.linkedin.com/in/rdgmaues
Marcelo Bissuh Gerente de projetos @bissuh [email protected] hUps://br.linkedin.com/in/bissuh