Como altero a hora e o fuso horário no simulador do iPhone ?
Como altero a hora e o fuso horário no simulador do iPhone ?
Respostas:
Acho que ele usa o fuso horário do sistema, portanto, alterar a TZ nas Preferências do Sistema provavelmente faria o truque
Reinicie o Simulador depois de alterar as preferências de data e hora do sistema e você verá as alterações refletidas. Funcionou para mim.
Seria útil se a Apple fornecesse uma "Data de simulação", pois eles forneciam um menu "Simular local". O que faço é definir um ponto de interrupção imediatamente após obter a data (salvando-a em uma variável) e depois modificar o valor. Ou apenas modifique o local em que verifico uma alteração de data e a faço retornar.
Com o objetivo de tirar uma captura de tela, a Apple finalmente tornou possível substituir o tempo na barra de status do simulador iOS (desde o Xcode 11 ) usando a ferramenta simctl :
xcrun simctl status_bar "iPhone Xs" override --time "21:08"
Aqui está uma solução disponível no iOS 13 e Xcode 11, pelo menos. (não testou com versões anteriores)
Por padrão, o iOS Simulator mostra a qualquer hora no seu Mac; no entanto, você pode usar a linha de comando do Xcode para substituí-la por este comando no terminal:
xcrun simctl status_bar "iPhone 11 Pro Max" override --time '9:41'
Substitua o nome do simulador pelo dispositivo que você deseja alterar.
Para a barra de status, você tem essas substituições:
You may specify any combination of these flags (at least one is required):
--time <string>
Set the date or time to a fixed value.
If the string is a valid ISO date string it will also set the date on relevant devices.
--dataNetwork <dataNetworkType>
If specified must be one of 'wifi', '3g', '4g', 'lte', 'lte-a', or 'lte+'.
--wifiMode <mode>
If specified must be one of 'searching', 'failed', or 'active'.
--wifiBars <int>
If specified must be 0-3.
--cellularMode <mode>
If specified must be one of 'notSupported', 'searching', 'failed', or 'active'.
--cellularBars <int>
If specified must be 0-4.
--batteryState <state>
If specified must be one of 'charging', 'charged', or 'discharging'.
--batteryLevel <int>
If specified must be 0-100.
O horário pode ser qualquer sequência. Mas se você quiser que o dispositivo mostre a data, precisará usar o formato ISO . Por exemplo, uma sequência de datas ISO válida seria '2007-01-09T10: 41: 00 + 01: 00'
Caso contrário, você pode usar o parâmetro time como uma string e ele exibirá o que você passar nele.
Com agradecimentos ao post original de Paul Hudson Aqui está o link !
Ao alterar o fuso horário, achei a maneira mais fácil de fazer isso clicando no relógio na barra de menus. E, em seguida, selecione "Abrir preferências de data e hora" e selecione a guia Fuso horário.
Como alternativa, Preferências do sistema -> Data e hora e selecione a guia Fuso horário.
Apenas um ponteiro para quem não conhece o OSX.
Este é um tópico antigo, mas é o mais próximo da minha pergunta. Eu preciso simular o fuso horário na Europa, esse método funciona para mim. Vá para o toque em 'Fuso horário' em vez do toque em 'Data e hora'. Desmarque a caixa 'Definir fuso horário automaticamente usando o local atual' e deslize a barra retangular vertical (com um ponto azul) para simular a hora do sistema.
Você pode definir a TZ
variável de ambiente em um esquema Xcode para definir o fuso horário apenas para esse aplicativo.
Você pode usar UTC
, PST
, EST
, bem como nomes de fuso horário de base local, tais como America/Los_Angeles
. Não está bem documentado, mas suspeito que qualquer nome de fuso horário deva funcionar.
Não está bem documentado, mas a fonte é um representante de suporte ao desenvolvedor da Apple nos fóruns de desenvolvedores .
Propus uma solução automática para o problema de alterar o tempo que inclui o swizzling do método hacky: https://stackoverflow.com/a/34793193/829338 . Suponho que também funcione para alterar o fuso horário de acordo.
Eu precisava testar meu aplicativo automaticamente, o que exigia a alteração do horário do sistema. Eu fiz, o que Tom sugeriu: método hacky feliz swizzling.
Para fins demonstrativos, apenas mudo, [NSDate date]
mas não [NSDate dateWithTimeIntervalSince1970:]
.
Primeiro, você precisa criar seu método de classe que serve como a nova [data do NSDate]. Eu o implementei para simplesmente mudar o tempo por uma constante diferença de tempo.
int timeDifference = 60*60*24; //shift by one day
NSDate* (* original)(Class,SEL) = nil;
+(NSDate*)date{
NSDate* date = original([NSDate class], @selector(date));
return [date dateByAddingTimeInterval:timeDifference];
}
Até agora, muito fácil. Agora vem a parte divertida. Obtemos os métodos das duas classes e da implementação do Exchange (funcionou para mim no AppDelegate, mas não na minha classe UITests). Para isso, você precisará importar objc/runtime.h
.
Method originalMethod = class_getClassMethod([NSDate class], @selector(date));
Method newMethod = class_getClassMethod([self class], @selector(date));
//save the implementation of NSDate to use it later
original = (NSDate* (*)(Class,SEL)) [NSDate methodForSelector:@selector(date)];
//happy swapping
method_exchangeImplementations(originalMethod, newMethod);
Meu servidor de compilação é UTC e alguns dos meus testes de unidade precisavam que o fuso horário fosse PST. Usando uma categoria no NSTimeZone, você pode substituir a implementação da Apple para usar seu código. Também funciona para projetos rápidos também.
//NSTimeZone+DefaultTimeZone.h
#import <Foundation/Foundation.h>
@interface NSTimeZone (DefaultTimeZone)
+(NSTimeZone *)defaultTimeZone;
@end
//NSTimeZone+DefaultTimeZone.m
#import "NSTimeZone+DefaultTimeZone.h"
@implementation NSTimeZone (DefaultTimeZone)
+(NSTimeZone *)defaultTimeZone
{
return [NSTimeZone timeZoneWithName:@"America/Los_Angeles"];
}
@end
Depois de alterar as preferências de data e hora do sistema, tive que escolher Hardware
> Reset All Content And Settings
.
Somente isso funcionou para mim na versão 10.3 (SimulatorApp-880.5 CoreSimulator-681.5.4).