Come posso cambiare l'ora e il fuso orario nel simulatore iPhone ?
Come posso cambiare l'ora e il fuso orario nel simulatore iPhone ?
Risposte:
Immagino che usi il fuso orario del tuo sistema, quindi cambiare la TZ nelle Preferenze di Sistema probabilmente farebbe il trucco
Riavvia il simulatore dopo aver modificato le preferenze di data e ora del sistema e vedrai le modifiche riflesse. Ha funzionato per me.
Sarebbe utile se Apple fornisse una "Data simulazione" in quanto forniva un menu "Simula posizione". Quello che faccio è impostare un punto di interruzione immediatamente dopo aver ottenuto la data (salvandola in una variabile) e quindi modificare il valore. O semplicemente modifica il punto in cui controllo la modifica della data e la restituisco vera.
Allo scopo di fare uno screenshot, Apple ha finalmente reso possibile la sostituzione del tempo sulla barra di stato del simulatore iOS (dal Xcode 11 ) usando lo strumento simctl :
xcrun simctl status_bar "iPhone Xs" override --time "21:08"
Ecco una soluzione disponibile almeno da iOS 13 e Xcode 11. (non testato con le versioni precedenti)
Per impostazione predefinita, iOS Simulator mostra a che ora è il tuo Mac, tuttavia, puoi utilizzare la riga di comando di Xcode per sovrascriverla con questo comando nel terminale:
xcrun simctl status_bar "iPhone 11 Pro Max" override --time '9:41'
Sostituisci il nome del simulatore con il dispositivo che desideri modificare.
Per la barra di stato hai queste sostituzioni:
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.
Il tempo può essere qualsiasi stringa. Ma se vuoi che il dispositivo mostri la data dovrai usare il formato ISO . Ad esempio, una stringa di data ISO valida sarebbe "2007-01-09T10: 41: 00 + 01: 00"
Altrimenti puoi usare il parametro time come stringa e mostrerà tutto ciò che ci passi.
Grazie al post originale di Paul Hudson Ecco il link !
Puoi impostare la TZ
variabile d'ambiente in uno schema Xcode per impostare il fuso orario solo per quell'app.
È possibile utilizzare UTC
, PST
, EST
, così come i nomi di fuso orario place-based, come America/Los_Angeles
. Non è ben documentato, ma sospetto che qualsiasi nome di fuso orario dovrebbe funzionare.
Non è ben documentato, ma la fonte è un rappresentante del supporto per gli sviluppatori Apple sui forum degli sviluppatori .
Quando ho cambiato il fuso orario, ho trovato il modo più semplice per farlo facendo clic sull'orologio nella barra dei menu. E quindi selezionando "Apri preferenze data e ora", quindi seleziona la scheda Fuso orario.
In alternativa Preferenze di Sistema -> Data e ora e selezionare la scheda Fuso orario.
Solo un puntatore per chiunque non sappia come muoversi su OSX.
Questo è un vecchio thread ma è il più vicino alla mia domanda. Devo simulare il fuso orario per l'Europa, questo metodo funziona per me. Vai a "TimeZone" tocca invece di "Data e ora". Deseleziona la casella "Imposta fuso orario automaticamente utilizzando la posizione corrente" e fai scorrere la barra rettangolare verticale (con il punto blu su di essa) per simulare l'ora del sistema.
Ho proposto una soluzione automatica al problema di modifica del tempo che include lo sfreccio del metodo hacky: https://stackoverflow.com/a/34793193/829338 . Presumo che dovrebbe funzionare anche per modificare il fuso orario di conseguenza.
Avevo bisogno di testare la mia app automaticamente, il che richiedeva una modifica del tempo di sistema. Ho fatto, quello che Tom ha suggerito: felice metodo hacky frizzante.
A scopo dimostrativo, cambio solo [NSDate date]
ma non [NSDate dateWithTimeIntervalSince1970:]
.
Innanzitutto è necessario creare il metodo di classe che funge da nuova [data NSDate]. L'ho implementato per spostare semplicemente il tempo di una differenza di tempo costante.
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];
}
Finora, abbastanza facile. Ora arriva la parte divertente. Otteniamo i metodi da entrambe le classi e scambiamo l'implementazione (ha funzionato per me in AppDelegate, ma non nella mia classe UITests). Per questo dovrai importare 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);
Il mio server di build è UTC e alcuni dei miei test di unità avevano bisogno che il fuso orario fosse PST. Utilizzando una categoria su NSTimeZone puoi sovrascrivere l'implementazione di Apple per utilizzare il tuo codice. Funziona anche per progetti rapidi.
//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
Dopo aver modificato le preferenze di data e ora del sistema, ho dovuto scegliere Hardware
> Reset All Content And Settings
.
Solo questo ha funzionato per me nella versione 10.3 (SimulatorApp-880.5 CoreSimulator-681.5.4).