Jump to content

Search the Community

Showing results for tags 'ios'.



More search options

  • Search By Tags

    Type tags separated by commas.
  • Search By Author

Content Type


Forums

  • Bem-vindos ao Portugal-a-Programar
    • Sugestões, Críticas ou Dúvidas relativas ao P@P
    • Acerca do P@P
  • Comunidade a Trabalhar
    • Wiki P@P
    • Apresentação de Projectos de Programação
    • Downloads
  • Revista PROGRAMAR
    • Revista PROGRAMAR
  • Desenvolvimento Geral
    • C
    • C++
    • Java
    • Haskell
    • Pascal
    • Python
    • Bases de Dados
    • Visual Basic Clássico
    • Visual Basic for Applications (VBA)
    • Dispositivos Móveis
    • Outras Linguagens
  • Desenvolvimento Orientado para Web
    • PHP
    • HTML
    • CSS
    • Javascript
    • Outras Linguagens de WebDevelopment
    • Desenvolvimento Web
  • Desenvolvimento .NET
    • C#
    • Visual Basic .NET
    • ASP.NET
    • WPF & SilverLight
  • Software e Sistemas Operativos
    • Software de Produtividade
    • Sistemas Operativos
    • Apresentação de Software
  • Informática
    • Interfaces Visuais
    • Computação Gráfica
    • Algoritmia e Lógica
    • Segurança e Redes
    • Hardware
    • Electrónica
    • Automação Industrial
    • Matemática
    • Dúvidas e Discussão de Programação
    • Notícias de Tecnologia
  • Outras Áreas
    • Dúvidas Gerais
    • Discussão Geral
    • Eventos
    • Anúncios de Emprego
    • Tutoriais
    • Snippets / Armazém de Código
  • Arquivo Morto
    • Projectos Descontinuados
    • System Empires

Blogs

  • Blog dos Moderadores
  • Eventos
  • Notícias de Tecnologia
  • Blog do Staff
  • Revista PROGRAMAR
  • Projectos
  • Wiki

Categories

  • Revista PROGRAMAR
  • Tutoriais
  • Textos Académicos
  • Exercícios Académicos
    • Exercícios c/ Solução
    • Exercícios s/ Solução
  • Bibliotecas e Aplicações
  • Outros

Find results in...

Find results that contain...


Date Created

  • Start

    End


Last Updated

  • Start

    End


Filter by number of...

Found 41 results

  1. Título do Projecto: Zion Wars Última Versão: 1.0 Site Oficial: http://www.zionwars.com Screenshots: O Zion Wars é uma evolução do System Empires desenvolvida de raiz para dispositivos móveis. Nele os jogadores podem evoluir o seu território, aumentar a sua produção, a sua frota e combater outros jogadores. Características: Treina uma frota de naves e utiliza-as em território inimigo para ganhares grandes batalhas Personaliza a tua Nave Mãe e utiliza-a em batalha para aumentar a moral e poder da tua frota Aplica poderes em batalha e vira a maré a teu favor Defende a teu território com canhões e minas aéreas Testa a tua estratégia nos níveis das zonas de treino e no alvo diário Testa a tua defesa atacando o teu território em combate simulado Troca recursos em excesso por outros em falta no Mercado Download: iOS: https://itunes.apple.com/app/id1383423235 Android: https://play.google.com/store/apps/details?id=com.zionwars.game Comentários e sugestões são bem vindas 😀
  2. Boa noite, Pretendo certificar um software de facturação desenvolvido em IOS. Alguém tem código criado neste sentido? Ou indicar alguém qu3 me possa ajudar? Obrigado. Diogo (tlm 917112955)
  3. Boas, Estou a desenvolver uma aplicação em Xamarin (iOS) e estou com um problema relativamente ao tempo de vida da aplicação. Necessito que a aplicação que estou a desenvolver, corra no dispositivo durante vários dias (por exemplo 3, 4 ou mais). O problema está, no facto do utilizador executar outras aplicações no dispositivo, fazendo com que quando o mesmo, fica com pouca memória, vai matar aplicações, que estão a correr, de modo a iniciar as novas. Já consegui solucionar esta problema no Android, através dos serviços, e das sugestões disponibilizadas pelos utilizadores deste Fórum, que podem acompanhar no link http://www.portugal-a-programar.pt/forums/topic/74340-correr-aplicação-interminável/ No entanto, deparei-me com a mesma situação no iOS. Dado que, o que implementei no Android, não pode ser aplicado no iOS. Isto porque, não possui serviços, os quais possa utilizar da mesma forma, que no Android. Como tal, já tentei implementar a aplicação, como se de um GPS de trata-se (pois o iOS considera estas, como de alta prioridade), ou de uma aplicação Áudio, mas sem sucesso! Acontecendo o mesmo, a quando da pouca memória do dispositivo. Já li em alguns tópicos que falam, que o que pretendo fazer, no iOS em colocar uma aplicação a correr interminavelmente, não é possível no iOS. Assim sendo, gostaria de saber se alguém possui alguma outra sugestão, que possa ser útil na resolução deste problema? Ou se o que pretendo fazer, não é possível de realizar no iOS? Obrigado!
  4. Boas, sou novo em programar para iOS e estou a ter problemas com algo que aparentemente é simples, mas que me tem dado algumas dores. No fundo o que eu pretendo, é que o o Xcode replique a estrutura que está presente na pasta do projecto (Finder). Ou seja, para este exemplo pretendo criar uma pasta "viewcontrollers" para colocar lá o ficheiro "viewController.swift", e uma pasta "views" para colocar lá o ficheiro "Main.storyboard". vídeo com o problema: https://www.youtube.com/embed/q18sz7DC0sc?feature=oembed
  5. Boa tarde, Alguém usa o Delphi para desenvolver no OS X ? Estou a tentar iniciar uma aplicação, já tentei de tudo, segui os manuais que encontrei mas não estou a conseguir progredir. Tenho um MAC e o VirtualBOX com o windows 7. Instalei o PAServer, o Delphi faz a comunicação, mas quando tento compilar uma aplicação, o Delphi gera um erro e informa que não encontra o caminho no mac. Alguém pode ajudar-me? Obrigado. Secua
  6. Já tentei 1000 e 1 coisa e ainda não consegui arranjar uma maneira de chamar o meu web service e obter os resultados pretendidos. Alguém me sabe dizer qual a melhor maneira de fazer a ligação ao meu web-service e de chamar os meus métodos em swift2 com xcode 7? Obrigado
  7. A Apple anunciou que o Swift irá tornar-se open source até ao final deste ano. A empresa irá inclusive suportar o port para Linux. Pessoal que desenvolve em Windows terá que esperar por um port desenvolvido por terceiros. https://developer.apple.com/swift/blog/?id=29
  8. Saudações novamente, Bem tenho vindo a interessar-me mais pelos dispositivos móveis, pergunto se é possível programar Objective C (Aplicações iOS) nos SO Windows ou Linux. Qual é o IDE recomendado e open source? Cumprimentos, Pedro Cruz
  9. Há relativamente pouco tempo encontrei o seguinte site sobre boas práticas e técnicas avançadas em Objective-C. Considero a qualidade do material acima da média. http://www.objc.io
  10. joptech

    REST Client

    Estou a tentar criar uma aplicação móvel que recebe um array json e mostar o conteúdo numa listview. Estou a usar os componentes REST Client. Esta parte já está feita e funciona bem, embora não exactamente como queria. Queria 2 tabs e separar os dados por duas listviews de acordo com um filtro. Mas como tudo está ligado por livebindings não estou a conseguir. As duas listas são preenchidas automaticamente. Outra questão: como faço um insert a partir daqui? Quero selecionar um item da lista e inserir uns dados na bd.
  11. Segundo a ABI Research, as vendas de dispositivos Android caíram no trimestre que engloba o período do natal, que é tipicamente o periodo onde as vendas de smartphones aumentam drasticamente. O período aparenta ter sido completamente monopolizado pela Apple, com as vendas a aumentarem 90% face aos 3 meses anteriores, tendo a empresa obtido o maior trimestre de sempre alguma vez conseguido por uma empresa listada na bolsa. O facto da Samsung ter continuado a queda também não ajudou aos números das vendas de dispositivos Android. A empresa tem apresentado dificuldades nas vendas que lhe custaram 64% dos lucros e 22% da facturação nos últimos 12 meses. Fonte: https://www.abiresearch.com/press/4q-2014-smartphone-os-results-android-smartphone-s
  12. KTachyon

    Usar CocoaPods com Swift

    Fica aqui um artigo que explica como se utilizam CocoaPods com Swift. No fundo é a mesma forma que torna possível utilizar Objective-C e Swift no mesmo projecto. https://medium.com/@kirualex/cocoapods-with-swift-e6f8ba8f0afc
  13. KTachyon

    Swift Toolbox

    Para quem já anda a desenvolver em Swift, fica aqui um site que agrega várias bibliotecas que podem ser úteis: http://www.swifttoolbox.io
  14. KTachyon

    Revista Programar para iOS

    Titulo do Projecto: Revista Programar para iOS Última Versão: 0.1a Site Oficial: https://bitbucket.org/KTachyon/revistaprogramar Discussão de desenvolvimento: https://www.portugal-a-programar.pt/topic/67293-revista-programar-ios/ Líder do Projecto: KTachyon (Tiago Matos) Membros Actuais do Projecto: KTachyon Screenshots: Descrição do Projecto: Revista Programar para iPhone.
  15. epolozero

    Livros grátis

    Lista de livros gratuitos sobre: Android: https://github.com/vhf/free-programming-books/blob/master/free-programming-books.md#android Windows Phone: https://github.com/vhf/free-programming-books/blob/master/free-programming-books.md#windows-phone iOS: https://github.com/vhf/free-programming-books/blob/master/free-programming-books.md#ios
  16. Boas pessoal. Tenho um problema do qual estou a frustrar. Eventualmente alguém me pode ajudar porque é algo bastante especifico. Tou a criar um APP com PhoneGap. Neste momento estou a tentar interligar a APP com o facebook. Apos uma luta grande consegui que não houvesse erros e até mesmo que ao carregar no BTN de login me salte o PopUp para pedir permissões (Popup nativo do dispositivo). O problema é que quando carrego OK nada acontece.. Agora eu tenho estes botões (para teste): Login - Pede permissoes depois nada acontece. Me - Da-me o erro que primeiro tenho de fazer login. E da uma oAuth Exception. Get Login - Returns 'Not logged in' normal... Logout - .. facebookWallPost - Chama a janela nativa e neste caso pede-me para fazer login dentro dessa janela. friendstory - Pede para carregar no login e depois no Me para dar fetch aos dados. Quanto as configuraçõe: config.xml: <gap:plugin name="com.phonegap.plugins.facebookconnect" version="0.4.0"> <param name="APP_ID" value="899133160113324" /> <param name="APP_NAME" value="titlurile-zilei" /> </gap:plugin> index.html - FB.init try { FB.init({ appId: "899133160113324", nativeInterface: CDV.FB, useCachedDialogs: false }); } catch (e) { alert(e); } Relativamente as configurações da APP: - Nos settings adicionei a plataforma IOS com o Bundle ID igual ao que esta na minha config : com.phonegap.zilei - A APP NÃO esta em SandBox. So basicamente não consigo que o login seja feito. Logicamente não posso ter a certeza se tenho tudo bem configurado no entanto há que referir que esse popup que pede as permissoes é enviado pelo facebook por isso alguma ligação há Se alguem me poder ajudar ficava eternamente agradecido. Cheers!
  17. KTachyon

    Revista Programar @ iOS

    Estava sem nada para fazer hoje e decidi gastar uma horita a fazer uma app muito simples para aceder às edições da revista em iOS. O resultado pode ser encontrado em: https://bitbucket.org/KTachyon/revistaprogramar Não tive que escrever mais do que 100 linhas de código e fiz algumas experiências com a UI para tentar ver o que se adequava melhor. TODO: - Cache - Guardar PDFs e capacidade de apagar PDFs guardados - Corrigir o inset dos PDFs - Tratamento de falhas de rede Screenshots:
  18. Bom dia comunidade P@P! Vamos desenvolver uma discussão saudável acerca do desenvolvimento móvel entre os sistemas operativos mais usados para smartphones (iOS, Android, Windows Phone)... Para já só tive a oportunidade de desenvolver para Android, mas gostava de desenvolver para os outros dois. Não gosto muito de desenvolver o front-end porque o android não é drag and drop como o iOS ou Windows Phone como eu vejo em tutoriais ou videos. E vocês?! Qual o tipo de smartphone mais gostam de desenvolver e porquê?
  19. Estava a dar uma vista de olhos pelas bibliotecas 3rd party de iOS que apareceram recentemente e descobri a PromiseKit. As Promises são uma forma de programação assíncrona (não bloqueante) que existe nalgumas linguagens de programação e que têm sido recentemente integradas em linguagens como o Javascript. A vantagem das promises é permitir criar uma cadeia de operações que acontecem assim que o resultado da operação anterior é obtido e isto é feito no código de forma espacialmente próxima, facilitando a legibilidade do código. A vantagem relativamente a estratégias como utilizar simplesmente o Grand Central Dispatch (Libdispatch) é o facto de não serem criadas "montanhas mágicas" (magic mountains, que é outra fora de chamar aquilo que na página do PromiseKit é designado por rightward-drift). Outras vantagens aparentam ser os mecanismos de error handling e agregação de múltiplas operações assíncronas. Ainda não experimentei utilizar a biblioteca, mas virei a fazê-lo assim que tiver algum tempo para tal. Apesar de ainda não estar numa versão final, já aparenta vir a tornar-se numa ferramenta extremamente útil para futuros projectos que possa vir a desenvolver.
  20. Objection é uma framework de injecção de dependências (Dependency Injection - DI) cujo estilo pode ser comparado ao do Guice em Java. Para quem não conhece, o Guice é uma framework de injecção de dependências baseada em anotações que permitem injectar as dependências directamente nos contrutores, quando os objectos são instanciados. Isto funciona em cascata, ou seja, um objecto que tenho outros objectos que sejam inicializados utilizando dependências do Guice serão também automaticamente instanciados com as suas dependências. Em Objective-C não existem anotações, mas a Objection utiliza uma ideia semelhante à dos interceptores do Java, utilizando method swizzling para adicionar esta funcionalidade em run time. Desta forma, utilizando algumas preprocessor macros, é possível simular um conjunto de "anotações" que têm o mesmo efeito que no Guice. Por exemplo, imaginemos um serviço de Localização (LocationService) que tem como objectivo registar eventos de entradas e saídas de regiões que estão registadas num serviço de Regiões (RegionService) num serviço de Eventos (EventService). Este serviços são singletons, ou seja, não deve ser instanciado mais que uma vez. A Objection framework permite que isto seja feito de uma forma simples e pouco verbosa: @interface LocationService () <CLLocationManagerDelegate, LocationServiceInterface> { CLLocationManager *_locationManager; } @property (nonatomic) id<RegionServiceInterface> regionService; @property (nonatomic) id<EventServiceInterface> eventService; @end @implementation LocationService objection_register_singleton(LocationService) objection_requires_sel(@selector(regionService), @selector(eventService)) @synthesize regionService; @synthesize eventService; - (void)awakeFromObjection { // Registo de regiões no serviço, provenientes do serviço de regiões (após injecção de dependências) } // Restantes methodos delegados do CLLocationManager @end Estes serviços são instanciados tendo por base o protocolo que têm que cumprir (neste caso, os RegionServiceInterface e EventServiceInterface), mas podem ser instanciados de várias outras formas. A configuração de um módulo para o exemplo anterior também é relativamente simples: @implementation BaseServicesModule - (void) configure { [self bindBlock:^id(JSObjectionInjector *context) { return [context getObject:[RegionService class]]; } toProtocol:@protocol(RegionServiceInterface)]; [self bindBlock:^id(JSObjectionInjector *context) { return [context getObject:[EventService class]]; } toProtocol:@protocol(EventServiceInterface)]; [self bindBlock:^id(JSObjectionInjector *context) { return [context getObject:[LocationService class]]; } toProtocol:@protocol(LocationServiceInterface)]; } @end E a criação do injector: JSObjectionInjector *injector = [JSObjection createInjector:[baseServicesModule new]]; [JSObjection setDefaultInjector:injector]; Simples, rápido e eficaz. Se tiverem dúvidas, estejam à vontade para perguntar.
  21. Não vou fazer um tópico sobre Dependency Injection (DI) ou falar a fundo sobre uma framework de DI em Objective-C/iOS, até porque já escrevi um tópico enorme hoje e não estou com vontade de escrever um novo testamento (no pun intended), vou apenas deixar uma primeira ideia sobre uma framework que utilizo e uma solução para a utilizar com XIBs e Storyboards (como está no título do tópico). Não sei exactamente qual é a framework mais popular de DI, mas aquela que me parece que está a ser mais pushed parece ser a Typhoon. No entanto eu não consigo gostar da framework e tenho andado a utilizar a Objection. Basicamente, para quem conhece a Guice, a Objection deverá ser algo familiar e bastante contida em termos de quantidade de código. Penso que um problema que é capaz de afectar alguns utilizadores desta framework é a incapacidade de injectar propriedades em controladores dos XIBs e dos Storyboards. Como esses utilizam um ciclo de inicialização alternativo, o sistema de injecção não irá funcionar correctamente (ou, simplesmente, não irá funcionar). Para resolver esse problema, existe uma categoria que resolve isto de forma muito simples: UIViewController+Objection.h #import <UIKit/UIViewController.h> @interface UIViewController (Objection) @end UIViewController+Objection.m #import "UIViewController+Objection.h" @implementation UIViewController (Objection) - (void) awakeFromNib { [[JSObjection defaultInjector] injectDependencies:self]; } @end Basta depois adicionar o import da categoria ao *-Prefix.pch do projecto: #ifdef __OBJC__ //... #import "UIViewController+Objection.h" //... #endif Mas isto não resolve todos os problemas dos Storyboards e XIBs, pois é perfeitamente possível adicionar objectos comuns que fazem alguma coisa (como DataSources ou Delegates de algum componente). A solução é semelhante, sendo necessário passar o processo de inicialização pós injecção para o método awakeFromObjection. Em muitas situações nem será necessário implementar uma categoria, bastando criar uma subclasse do NSObject que trata de implementar o comportamento necessário: NibObject.h #import <Foundation/Foundation.h> @interface NibObject : NSObject @end NibObject.m #import "NibObject.h" @implementation NibObject - (void) awakeFromNib { [[JSObjection defaultInjector] injectDependencies:self]; } @end Happy coding!
  22. Para quem tem que testar aplicações iOS no terreno é necessário ter ferramentas fiáveis que permitam apresentar dados acerca da operação da aplicação em tempo real. Este tópico tem como objectivo apresentar algumas alternativas utilizando por base o CocoaLumberjack. Basicamente, o CocoaLumberjack é uma framework de logging simples e eficiente que permite configurar vários adaptadores para distribuir os logs para qualquer sítio, desde o standard output, ficheiros, bases de dados, até APIs em serviços remotos. O CocoaLumberjack pode ser "instalado" no projecto através de CocoaPods, ou simplesmente adicionado ao projecto. A configuração inicial é bastante simples. Como um logger deve ser utilizado extensivamente ao longo de todas as classes que vão ser desenvolvidas, é comum importar globalmente. Para tal, no XCode, em cada projecto, existe um ficheiro *-Prefix.pch onde o * é o nome do vosso projecto. Nesse ficheiro devem adicionar: #import "DDLog.h" static const int ddLogLevel = LOG_LEVEL_VERBOSE; O ddLogLevel indica o nível de detalhe que queres que seja registado nos logs. Existem os seguintes níveis: LOG_FLAG_ERROR LOG_FLAG_WARN LOG_FLAG_INFO LOG_FLAG_DEBUG LOG_FLAG_VERBOSE Cada nível irá registar os logs com o seu nível ou acima. Em ambientes de produção, por exemplo, pode ser adequado colocar esta variável a LOG_FLAG_ERROR ou LOG_FLAG_WARN. Para se poderem registar logs com o CocoaLumberjack, é necessário addicionar Loggers, que, na realidade, são adaptadores para distribuir os logs por diferentes outputs. É comum fazê-lo no AppDelegate.m, mas não existe nenhum inconveniente em adicioná-lo ao main.m: #import <UIKit/UIKit.h> #import "DDTTYLogger.h" #import "AppDelegate.h" int main(int argc, char * argv[]) { @autoreleasepool { [DDLog addLogger:[DDTTYLogger sharedInstance]]; return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); } } O DDTTYLogger é o logger mais simples de perceber. Faz exactamente o mesmo que o NSLog(). Para registar alguma coisa no log, é necessário utilizar um dos métodos do CocoaLumberjack: DDLogVerbose(@"Meh... You probably won't read this"); DDLogDebug(@"Value of a is %@", a); DDLogInfo(@"INFO: You should know this."); DDLogWarn(@"WARNING: You left the door open!"); DDLogError(@"ERROR: Demons are loose!!!"); Agora, a parte realmente interessante. Existem dois serviços remotos para onde é interessante enviar os logs. Um por uma questão de captar a informação relativa a um crash da app e outro que simplesmente irá reter todos os dados que lhe forem enviados e que permitem averiguar problemas que não causam crashes, mas que têm que ser resolvidas. O primeiro é o Crashlytics[/tt], do Twitter, que é uma framework que captura a informação sobre as causas dos crashes de uma app, bem como os últimos logs que contextualizam o crash da aplicação. É fornecido um instalador que indica todos os passos necessários à sua instalação e integração com os projectos em que queiram utilizar a framework. O adaptador para enviar os logs para o Crashlitycs pode ser encontrado em https://github.com/TechSmith/CrashlyticsLumberjack. O segundo é o Parse, do Facebook, que é uma plataforma que fornece uma série de serviços, um dos quais uma base de dados remota que é relativamente simples de integrar no iOS. O serviço tem todas as instruções necessárias à instalação, mas também é possível fazer a instalação através de CocoaPods. Também existe um adaptador disponível algures, mas eu optei por escrever o meu próprio adaptador: PMParseLogger.h: #import "DDLog.h" @interface PMParseLogger : DDAbstractLogger <DDLogger> + (id)sharedInstance; @end PMParseLogger.m: #import "PMParseLogger.h" #import <Parse/Parse.h> @implementation PMParseLogger static PMParseLogger *sharedLogger; + (void)initialize { static BOOL initialized = NO; if (!initialized) { initialized = YES; sharedLogger = [PMParseLogger new]; } } + (id)sharedInstance { return sharedLogger; } - (id)init { if (sharedLogger != nil) { return nil; } if (self = [super init]) { [Parse setApplicationId:@"parse_application_id_here" // TODO: Inserir credenciais do Parse clientKey:@"parse_client_key_here"]; } return self; } - (NSDateFormatter *)dateFormatter { static NSDateFormatter *dateFormatter; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ dateFormatter = [NSDateFormatter new]; [dateFormatter setFormatterBehavior:NSDateFormatterBehavior10_4]; [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss:SSS"]; }); return dateFormatter; } - (void)logMessage:(DDLogMessage *)aLogMessage { NSString *logMsg = aLogMessage->logMsg; if(formatter){ logMsg = [formatter formatLogMessage:aLogMessage]; } if (logMsg) { NSString *logLevel; switch (aLogMessage->logFlag) { case LOG_FLAG_ERROR : logLevel = @"ERR"; break; case LOG_FLAG_WARN : logLevel = @"WRN"; break; case LOG_FLAG_INFO : logLevel = @"INF"; break; case LOG_FLAG_DEBUG : logLevel = @"DEB"; break; case LOG_FLAG_VERBOSE : logLevel = @"VRB"; break; default : logLevel = @"DEF"; break; } PFObject *obj = [PFObject objectWithClassName:@"PMParseLogger"]; [obj setObject:logMsg forKey:@"message"]; [obj setObject:[[uIDevice currentDevice] name] forKey:@"device"]; [obj setObject:[[NSString stringWithUTF8String: aLogMessage->file] lastPathComponent] forKey:@"file"]; [obj setObject:[NSString stringWithUTF8String:aLogMessage->function] forKey:@"function"]; [obj setObject:[[NSNumber numberWithInt:aLogMessage->lineNumber] stringValue] forKey:@"line"]; [obj setObject:logLevel forKey:@"level"]; [obj saveEventually]; } } - (NSString *)loggerName { return @"com.pminds.PMParseLogger"; } @end Penso que a implementação é relativamente simples de ler, mas se houverem dúvidas, podem contactar. Idealmente as credenciais do Parse não seriam feitas aqui, mas por uma questão de contenção do código aqui coloquei-o directamente na inicialização do adaptador. Caso não tencionem utilizar o Parse para mais nada, a implementação que apresentei deverá servir perfeitamente. Não se esqueçam de colocar as credenciais das vossas contas do Parse onde coloquei o 'TODO'. Ao adicionarem estes dois adaptadores ao vosso projecto, o vosso main.m deverá ficar da seguinte forma: #import <UIKit/UIKit.h> #import <CrashlyticsLumberjack/CrashlyticsLogger.h> #import "DDTTYLogger.h" #import "PMParseLogger.h" #import "AppDelegate.h" int main(int argc, char * argv[]) { @autoreleasepool { [DDLog addLogger:[DDTTYLogger sharedInstance]]; [DDLog addLogger:[CrashlyticsLogger sharedInstance]]; [DDLog addLogger:[PMParseLogger sharedInstance]]; return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); } } Desta forma já terão, pelo menos um local onde serão registados todos os logs remotamente. Existe, no entanto, outra alternativa mais directa (mais local) de registar os logs. Chama-se NSLogger e está disponível em https://github.com/atelierdumobile/NSLogger. E existe também um adaptador para o CocoaLumberjack em https://github.com/steipete/NSLogger-CocoaLumberjack-connector. O NSLogger é um logger que faz imensa coisa, mas a funcionalidade que acho mais interessante é a de fazer broadcast via Bonjour para os dispositivos que estejam à escuta. O próprio projecto já trás aplicações para Mac OS X e iPad que ficam à escuta e apresentam os logs em tempo real. O NSLogger também suporta Android, com o JMmDNS para suportar a comunicação com Bonjour. Bonus: Apesar de não estar no branch principal do NSLogger, existe ainda mais uma coisa que o NSLogger suporta que o torna excelente para fazer testes mesmo em tempo real, no terreno, utilizando um iPad como suporte. É possível fazer o NSLogger comunicar via Bluetooth: https://github.com/atelierdumobile/NSLogger/tree/bluetooth No entanto, para tal, é necessário criar um adaptador alternativo para suportar este meio de comunicação (para além de ter que se fazer a integração manual do NSLogger no projecto, visto que o que se encontra no CocoaPods é apenas o que se encontra no master do GitHub). O adapter que implementei e que podem utilizar é o seguinte: PMNSLoggerLogger.h: #import "DDLog.h" @interface PMNSLoggerLogger : DDAbstractLogger <DDLogger> - (id)initBonjourLoggerWithBuffer:(BOOL)buffer SSL:(BOOL)ssl; - (id)initBluetoothLoggerWithBuffer:(BOOL)buffer SSL:(BOOL)ssl; @end #import "PMNSLoggerLogger.h" #import "LoggerClient.h" @interface PMNSLoggerLogger () { Logger *_logger; } @end @implementation PMNSLoggerLogger - (id)initBonjourLoggerWithBuffer:(BOOL)buffer SSL:(BOOL)ssl { self = [super init]; if (self) { int options = kLoggerOption_BrowseBonjour | kLoggerOption_BrowseOnlyLocalDomain | [self buildOptionsForBuffer:buffer SSL:ssl]; [self setupLoggerWithOptions:options]; } return self; } - (id)initBluetoothLoggerWithBuffer:(BOOL)buffer SSL:(BOOL)ssl { self = [super init]; if (self) { int options = kLoggerOption_LogToBluetoothConnection | [self buildOptionsForBuffer:buffer SSL:ssl]; [self setupLoggerWithOptions:options]; } return self; } - (void)setupLoggerWithOptions:(int)options { _logger = LoggerInit(); LoggerSetOptions(_logger, options); LoggerStart(_logger); } - (int)buildOptionsForBuffer:(BOOL)buffer SSL:(BOOL)ssl { int options = 0; if (ssl) { options |= kLoggerOption_UseSSL; } if (buffer) { options |= kLoggerOption_BufferLogsUntilConnection; } return options; } - (void)logMessage:(DDLogMessage *)logMessage { NSString *logMsg = logMessage->logMsg; if (formatter) { // formatting is supported but not encouraged! logMsg = [formatter formatLogMessage:logMessage]; } if (logMsg) { int nsloggerLogLevel; switch (logMessage->logFlag) { // NSLogger log levels start a 0, the bigger the number, // the more specific / detailed the trace is meant to be case LOG_FLAG_ERROR : nsloggerLogLevel = 0; break; case LOG_FLAG_WARN : nsloggerLogLevel = 1; break; case LOG_FLAG_INFO : nsloggerLogLevel = 2; break; case LOG_FLAG_DEBUG : nsloggerLogLevel = 3; break; case LOG_FLAG_VERBOSE : nsloggerLogLevel = 4; break; default : nsloggerLogLevel = 3; break; } LogMessageToF(_logger, logMessage->file, logMessage->lineNumber, logMessage->function, [logMessage fileName], nsloggerLogLevel, @"%@", logMsg); } } - (void)flush { LoggerFlush(_logger, NO); } - (NSString *)loggerName { return @"com.pminds.PMNSLoggerLogger"; } @end E, para o utilizarem, o vosso main.m deverá ser qualquer coisa como: #import <UIKit/UIKit.h> #import <CrashlyticsLumberjack/CrashlyticsLogger.h> #import "DDTTYLogger.h" #import "PMParseLogger.h" #import "PMNSLoggerLogger.h" #import "AppDelegate.h" int main(int argc, char * argv[]) { @autoreleasepool { [DDLog addLogger:[DDTTYLogger sharedInstance]]; [DDLog addLogger:[CrashlyticsLogger sharedInstance]]; [DDLog addLogger:[PMParseLogger sharedInstance]]; [DDLog addLogger:[[PMNSLoggerLogger alloc] initBonjourLoggerWithBuffer:YES SSL:YES]]; [DDLog addLogger:[[PMNSLoggerLogger alloc] initBluetoothLoggerWithBuffer:YES SSL:YES]]; return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); } } Atenção que a aplicação de iPad não está adequada a usar dois interfaces (Bonjour e Bluetooth), por isso, se tencionam estar na mesma rede a utilizar um iPad para receber os logs, devem desactivar o logger Bluetooth e deixar apenas o Bonjour. Nota final: O CocoaLumberjack funciona com um plugin para o XCode chamado XCodeColors, que permite que os logs com diferentes níveis apareçam no output com diferentes cores, o que torna a leitura dos logs bastante mais agradáveis. Especialmente porque é possível definir as cores que se pretendem para os diferentes níveis da seguinte forma: [[DDTTYLogger sharedInstance] setColorsEnabled:YES]; [[DDTTYLogger sharedInstance] setForegroundColor:[uIColor greenColor] backgroundColor:nil forFlag:LOG_FLAG_INFO]; Infelizmente o suporte para cores no NSLogger é fraquito, especialmente no iPad onde não existe suporte de todo na aplicação que existe no repositório. No entanto, eu já gastei algum tempo a fazer algumas alterações ao projecto para conseguir distinguir os níveis de logging no iPad de forma simples e color coded. O resultado não é perfeito, mas já é perfeitamente adequado para testes no terreno com um iPad. Se alguém quiser utilizar, ou dar continuidade às alterações que eu estive a fazer, contactem-me a declarar o interesse que eu irei arranjar alguma forma de disponibilizar o código (se bem que acho que o ideal será re-escrever a aplicação do zero).
  23. Boas, Estou a tentar criar uma app para iOS que encontre todos os sensor tags na região e que devolva o valor RSSI (BLE) de cada um para uma variável. Alguém conhece/tem um template para o efeito? muito obrigado!
  24. Bem, esta dúvida pode ser muito simples mas ainda não arranjei solução para isto. Eu tenho uma parte de contactos numa aplicação "minha" que consiste num view controller composto por uma table view em que cada célula tem um título (exemplo site da empresa) e um sub título (www.sitedaempresa.com). Numa primeira versão da aplicação estas células eram meramente informativas (sem qualquer tipo de acção), contudo eu gostava que, ao carregar na célula, esta servisse como hiperligação...isto é, eu carregava na célula do site e imediatamente abria-me a hiperligação no explorador pré-definido, carregava no nº de telefone da empresa e conseguisse ligar directamente...etc. Alguém me pode elucidar sobre esta questão? Desde já obrigado. ps: Se não souberem como ajudar, tentem orientar-me em palavras/termos-chave para pesquisar e abordar melhor o assunto (do que procurei ainda não consegui resolver o que pretendia).
  25. Fonte: http://www.wired.com/threatlevel/2014/02/gotofail/
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.