Как изменить время и часовой пояс в симуляторе iPhone?

152

Как изменить время и часовой пояс в симуляторе iPhone ?

Рахул Вьяс
источник
изменить Системное время и дату - не решение. Это влияет на все приложения Mac, включая временные метки xcode. Правильное поведение состоит в том, что любое изменение местоположения симулятора должно приводить к изменению времени и часового пояса. Все остальное - только временное решение. Надеюсь, что Apple исправит это как можно скорее
Руди

Ответы:

216

Я предполагаю, что он использует ваш системный часовой пояс, поэтому изменение TZ в системных настройках, вероятно, поможет

Снимок экрана для описания

двойное шасси
источник
1
Хм ... У меня на симуляторе нет этой опции. На моем телефоне он находится в разделе «Настройки» -> «Основные» -> «Дата и время». В моем симуляторе раздела «Дата и время» не существует.
Vito Andolini
8
Ох ... измените это в системных настройках вашего компьютера, а не в настройках симулятора. Правильно. Это сработало!
Vito Andolini
2
одна проблема в том, что время симулятора обновляется после 2 минут изменения системного времени. любой метод, который одновременно изменяет время симулятора ....
AsifHabib
1
Я изменил время Mac, и время симулятора не изменилось, я проверял, сделал ли я правильные шаги, время симулятора изменилось. Поэтому я пришел к выводу, что время симулятора обновляется через 10–15 секунд, но для меня это нормально. @JPK Я не знаю, в чем проблема вашей системы, лучше всего распечатать полные журналы учета рабочего времени и проверить, в чем проблема.
AsifHabib
2
Измените системное время Mac, затем перезапустите симулятор.
Джон Вонг
42

После изменения настроек системной даты и времени перезапустите симулятор, и вы увидите отраженные изменения. У меня это сработало.

Вишал Шах
источник
180
Ужасное решение (со стороны Apple, а не ваш ответ). Это именно то, что симулятор должен уметь делать в качестве безопасной альтернативы фактическому изменению системного времени и потенциально нарушению работы вашего компьютера.
devios1 05
4
@devios, это как никогда верно с er Watch
льюис
@ Lewis42, что ты имеешь в виду?
Юлиан Онофрей
3
@lulian просто то, что есть новое устройство для определения времени, но вам все равно придется возиться, чтобы проверить часовые пояса. это был брошенный комментарий, я расстраивался! :)
lewis
Совершенно верно, @ Lewis42. Возникновение системного времени на телефоне действительно портит такие вещи, как данные о движении на Apple Watch. Делает тестирование проблематичным, если вам важны данные на часах.
Джеймс Уайт
37

Было бы полезно, если бы Apple предоставила «Имитацию даты», поскольку они предоставили меню «Имитировать местоположение». Что я делаю, так это устанавливаю точку останова сразу после получения даты (сохраняя ее в переменной), а затем изменяю значение. Или просто измените место, где я проверяю изменение даты, и сделайте его верным.

LevinsonTechnologies
источник
Чтобы сделать это лучше, ответьте: как его изменить? Вы добавляете к нему интервал? Вы можете поделиться кодом?
Honey
1
Вы можете сделать это сейчас, здесь stackoverflow.com/a/62155632/2025766 вы можете узнать, как это сделать
Феде Хензе,
21

Вы можете установить TZпеременную среды в схеме Xcode, чтобы установить часовой пояс только для этого приложения.

Управлять схемами

Вы можете использовать UTC, PST, EST, а также место на основе имен часовых поясов , такие как America/Los_Angeles. Это плохо документировано, но я подозреваю, что любое имя часового пояса должно работать.

Это плохо документировано, но источником является представитель службы поддержки разработчиков Apple на форумах разработчиков .

грабители
источник
4
Почему это отклонено? На самом деле это было единственное, что у меня сработало.
Джейкоб Роде,
3
Это действительно чистое решение. Это также замечательно, если вы хотите протестировать несколько разных часовых поясов: добавьте настройку TZ для каждого из них, но не забудьте выбирать только один за раз. Я просто добавил Америку / Чикаго, Европу / Стамбул, Азию / Гонконг и Тихий океан / Гонолулу, чтобы получить ассортимент, чтобы я мог отследить ошибку, зависящую от часового пояса. Это НЕ будет работать, если вам нужно делать снимки экрана или работать с несколькими приложениями, но это очень быстрый способ переключения между несколькими часовыми поясами для тестирования одного приложения.
Хэл Мюллер
13

Чтобы сделать снимок экрана, Apple наконец-то сделала возможным переопределение времени в строке состояния симулятора iOS (начиная с Xcode 11 ) с помощью инструмента simctl :

xcrun simctl status_bar "iPhone Xs" override --time "21:08"
тадиджа
источник
9
Я думаю, что это только переопределение строки состояния (для скриншота). Но это не повлияет на результат API времени / даты.
Roun
9

Вот решение, доступное как минимум для iOS 13 и Xcode 11. (не тестировал с предыдущими версиями)

По умолчанию симулятор iOS показывает любое время на вашем Mac, однако вы можете использовать командную строку Xcode, чтобы переопределить это с помощью этой команды в терминале:

xcrun simctl status_bar "iPhone 11 Pro Max" override --time '9:41'

Замените имя симулятора на устройство, которое вы хотите изменить.

скриншот времени iPhone

Для строки состояния у вас есть следующие переопределения:

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.

Время может быть любой строкой. Но если вы хотите, чтобы устройство отображало дату, вам необходимо использовать формат ISO . Например, допустимая строка даты ISO будет '2007-01-09T10: 41: 00 + 01: 00'.

В противном случае вы можете использовать параметр времени как строку, и он будет отображать все, что вы в нем передаете.

Благодаря оригинальному сообщению Пола Хадсона. Вот ссылка !

множество
источник
1
Очень хорошая возможность, но не позволяет реально изменить часовой пояс для тестирования функциональности приложения в другом часовом поясе. При использовании, например, xcrun simctl status_bar «iPad Pro (11 дюймов)» override --time '2020-01-12T10: 41: 00-06: 00' он преобразует это время в мой текущий часовой пояс CET и устанавливает время симулятора iOS на 5 : 41pm
randomcontrol
1
Для объяснения: я хотел бы проверить, как мое приложение реагирует, если пользователь переходит в другой часовой пояс.
randomcontrol
Вы правы, это влияет только на строку состояния, я только что сделал тестовую распечатку текущего времени на экране, и это не изменило системное время моделируемого устройства, только отображение вверху. Я отредактировал свой пост, чтобы отразить это. Спасибо
толпы
5

При изменении часового пояса я обнаружил, что самый простой способ сделать это - щелкнуть часы в строке меню. Затем выберите «Открыть настройки даты и времени», затем выберите вкладку «Часовой пояс».

Или же Системные настройки -> Дата и время и выберите вкладку Часовой пояс.

Просто указатель для тех, кто не разбирается в OSX.

Лассе
источник
7
Это не ответ, поэтому это должен быть комментарий. Число разработчиков iOS, которые не разбираются в OS X, равно нулю.
phatmann
5

Это старая ветка, но она ближе всего к моему вопросу. Мне нужно смоделировать часовой пояс для Европы, этот метод работает для меня. Перейти к «Часовой пояс» нажмите вместо «Дата и время». Снимите флажок «Установить часовой пояс автоматически с использованием текущего местоположения» и сдвиньте вертикальную прямоугольную полосу (с синей точкой), чтобы смоделировать системное время.

введите описание изображения здесь

Оми
источник
2

Я предложил автоматическое решение проблемы изменения времени, которое включает хакерский метод swizzling: https://stackoverflow.com/a/34793193/829338 . Я предполагаю, что это также должно работать для изменения часового пояса соответственно.


Мне нужно было автоматически протестировать мое приложение, что потребовало изменения системного времени. Я сделал то, что посоветовал Том: веселый хакерский метод swizzling.

В демонстрационных целях меняю только, [NSDate date]но не [NSDate dateWithTimeIntervalSince1970:].

Сначала вам нужно создать метод класса, который будет служить новой [NSDate date]. Я реализовал это, чтобы просто сдвинуть время на постоянную timeDifference.

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];
}

Пока все довольно просто. Теперь самое интересное. Мы получаем методы из обоих классов и обмениваемся реализацией (у меня это сработало в AppDelegate, но не в моем классе UITests). Для этого вам нужно будет импортировать 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);
Себастьян Ходжас
источник
IIRC это не сработает для тестирования локальных уведомлений.
Стив Мозер
1

Мой сервер сборки - это UTC, и некоторые из моих модульных тестов требовали, чтобы часовой пояс был PST. Используя категорию в NSTimeZone, вы можете переопределить реализацию Apple, чтобы использовать свой код. Также работает для быстрых проектов.

//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
одиф
источник
0

После изменения настроек системной даты и времени мне пришлось выбрать Hardware> Reset All Content And Settings.
Только это сработало для меня в версии 10.3 (SimulatorApp-880.5 CoreSimulator-681.5.4).

Евгений Каркан
источник