Comment changer l'heure et le fuseau horaire dans le simulateur iPhone ?
Comment changer l'heure et le fuseau horaire dans le simulateur iPhone ?
Réponses:
Je suppose qu'il utilise le fuseau horaire de votre système, donc changer le TZ dans les préférences système ferait probablement l'affaire
Redémarrez le simulateur après avoir modifié les préférences de date et d'heure du système et vous verrez les changements reflétés. Cela a fonctionné pour moi.
Il serait utile qu'Apple fournisse une "Simuler la date" car ils fournissent un menu "Simuler l'emplacement". Ce que je fais est de définir un point d'arrêt immédiatement après avoir obtenu la date (en l'enregistrant dans une variable), puis de modifier la valeur. Ou modifiez simplement l'endroit où je vérifie un changement de date et faites-le revenir vrai.
Dans le but de faire une capture d'écran, Apple a finalement permis de remplacer l'heure sur la barre d'état du simulateur iOS (depuis Xcode 11 ) en utilisant l' outil simctl :
xcrun simctl status_bar "iPhone Xs" override --time "21:08"
Voici une solution disponible depuis iOS 13 et Xcode 11 au moins. (n'a pas testé avec les versions précédentes)
Par défaut, le simulateur iOS montre quelle que soit l'heure sur votre Mac, cependant, vous pouvez utiliser la ligne de commande de Xcode pour remplacer cela avec cette commande dans le terminal:
xcrun simctl status_bar "iPhone 11 Pro Max" override --time '9:41'
Remplacez le nom du simulateur par le périphérique que vous souhaitez modifier.
Pour la barre d'état, vous avez ces remplacements:
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.
L'heure peut être n'importe quelle chaîne. Mais si vous souhaitez que l'appareil affiche la date, vous devrez utiliser le format ISO . Par exemple, une chaîne de date ISO valide serait «2007-01-09T10: 41: 00 + 01: 00»
Sinon, vous pouvez utiliser le paramètre time comme une chaîne et il affichera tout ce que vous lui passez.
Merci à l'article original de Paul Hudson Voici le lien !
Vous pouvez définir la TZ
variable d'environnement dans un schéma Xcode pour définir le fuseau horaire uniquement pour cette application.
Vous pouvez utiliser UTC
, PST
, EST
, ainsi que les noms des fuseaux horaires territorialisées tels que America/Los_Angeles
. Ce n'est pas bien documenté, mais je soupçonne que tout nom de fuseau horaire devrait fonctionner.
Ce n'est pas bien documenté, mais la source est un représentant du support Apple Developer sur les forums des développeurs .
Lors du changement de fuseau horaire, j'ai trouvé le moyen le plus simple de le faire en cliquant sur l'horloge dans la barre de menus. Et puis en sélectionnant "Ouvrir les préférences de date et d'heure" puis sélectionnez l'onglet Fuseau horaire.
Alternativement Préférences système -> Date et heure et sélectionnez l'onglet Fuseau horaire.
Juste un pointeur pour tous ceux qui ne connaissent peut-être pas OSX.
C'est un vieux fil mais il est le plus proche de ma question. J'ai besoin de simuler le fuseau horaire pour l'Europe, cette méthode fonctionne pour moi. Allez sur «TimeZone» au lieu de «Date et heure». Décochez la case «Définir automatiquement le fuseau horaire en utilisant l'emplacement actuel» et faites glisser la barre rectangulaire verticale (avec un point bleu dessus) pour simuler l'heure de votre système.
J'ai proposé une solution automatique au problème du changement d'heure qui inclut le swizzling de la méthode hacky: https://stackoverflow.com/a/34793193/829338 . Je suppose que cela devrait également fonctionner pour changer le fuseau horaire en conséquence.
J'avais besoin de tester mon application automatiquement, ce qui nécessitait de changer l'heure du système. Je l'ai fait, ce que Tom a suggéré: une bonne méthode de piratage.
À des fins de démonstration, je change seulement [NSDate date]
mais pas [NSDate dateWithTimeIntervalSince1970:]
.
Vous devez d'abord créer votre méthode de classe qui sert de nouvelle [date NSDate]. Je l'ai implémenté pour simplement décaler l'heure d'une différence de temps constante.
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];
}
Jusqu'ici, assez facile. Vient maintenant la partie amusante. Nous obtenons les méthodes à la fois des classes et de l'implémentation d'échange (cela a fonctionné pour moi dans AppDelegate, mais pas dans ma classe UITests). Pour cela, vous devrez importer 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);
Mon serveur de construction est UTC et certains de mes tests unitaires nécessitaient que le fuseau horaire soit PST. En utilisant une catégorie sur NSTimeZone, vous pouvez remplacer l'implémentation d'Apple pour utiliser votre code. Fonctionne également pour les projets rapides uniquement.
//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
Après avoir changé les préférences de date et d'heure du système, j'ai dû choisir Hardware
> Reset All Content And Settings
.
Seul cela a fonctionné pour moi dans la version 10.3 (SimulatorApp-880.5 CoreSimulator-681.5.4).