Как изменить время и часовой пояс в симуляторе 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 предоставила «Имитацию даты», поскольку они предоставили меню «Имитировать местоположение». Что я делаю, так это устанавливаю точку останова сразу после получения даты (сохраняя ее в переменной), а затем изменяю значение. Или просто измените место, где я проверяю изменение даты, и сделайте его верным.


Чтобы сделать это лучше, ответьте: как его изменить? Вы добавляете к нему интервал? Вы можете поделиться кодом?
— 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).

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.