Як змінити час та часовий пояс у симуляторі iPhone?


144

Як змінити час та часовий пояс у тренажері iPhone ?


змінити час і дату системи - це не вирішення. Це впливає на всі програми Mac, включаючи позначки часу xcode. Правильна поведінка полягає в тому, що будь-яка зміна місця розташування симулятора повинна змінювати час та часовий пояс. Всі інші речі лише обхідні. Сподіваємось, що Apple виправить це якнайшвидше
Руді,

Відповіді:


214

Я здогадуюсь, що він використовує часовий пояс у вашій системі, тому зміна TZ в системних налаштуваннях, ймовірно, зробить свою справу

Знімок екрана для опису


1
Хм ... у мене на тренажері немає такої опції. У моєму телефоні це в розділі Налаштування -> Загальне -> Дата та час. На моєму тренажері не існує розділу "Дата і час".
Віто Андоліні

6
О ... змінити це в системних налаштуваннях машини, а не в налаштуваннях тренажера. Правильно. Це спрацювало!
Віто Андоліні

2
одна проблема в цьому, час симулятора оновлюється через 2 хвилини зміни системного часу. будь-який метод, який одночасно змінює час тренажера ....
AsifHabib

1
Я змінив час Mac і час тренажера не змінився, я перевіряв, чи робив я правильні кроки, змінився час тренажера. Тому я зробив висновок, що час тренажера оновлюється через 10-15 секунд, але це нормально для мене. @JPK Я не знаю проблеми вашої системи, найкращий спосіб - надрукувати повний журнал часу та перевірити, де проблема.
АсифХабіб

2
Змініть системний час Mac, а потім перезапустіть тренажер.
Джон Вонг

41

Перезавантажте симулятор після зміни налаштувань часу на системну дату, і ви побачите, що зміни відображаються. Це працювало для мене.


171
Жахливе рішення (з боку Apple, не ваша відповідь). Це саме та річ, яку повинен вміти робити тренажер, як безпечну альтернативу фактичній зміні системного часу та потенційному порушенню речей на вашому комп’ютері.
devios1

3
@devios це правдивіше, ніж будь-коли,  Дивіться
lewis

@ Lewis42, що ти маєш на увазі?
Юліан Онофрей

2
@lulian просто, що є новий пристрій для визначення часу, але вам все одно доведеться возитися так, щоб перевірити часові пояси. це був коментар викидання, я розчарувався! :)
lewis

Дуже вірно, @ Lewis42. Заплутавшись із системним часом на вашому телефоні, справді викручуються такі речі, як дані про рух на Apple Watch. Тестування робить проблематичним, якщо ви дбаєте про дані годинника.
Джеймс Вайт

35

Було б корисно, якби Apple надала "Моделювання дати", оскільки вони надали меню "Імітувати місце". Що я роблю, це встановити точку розриву відразу після отримання дати (збереження її в змінній), а потім змінити значення. Або просто змінити місце, де я перевіряю на зміну дати, і змусити його повернути справжнє.


Щоб зробити це кращою відповіддю: як ви модифікуєте це? Ви додаєте до нього інтервал? Чи можете ви поділитися яким-небудь кодом?
Мед

Ви можете це зробити зараз, тут stackoverflow.com/a/62155632/2025766 ви можете знайти, як це зробити
Fede Henze

10

Для того, щоб зробити знімок екрана, Apple, нарешті, дала можливість переосмислити час на панелі стану тренажера iOS (починаючи з Xcode 11 ) за допомогою інструмента simctl :

xcrun simctl status_bar "iPhone Xs" override --time "21:08"

5
Я думаю, що це лише перекриває панель стану (для екрана). Але це не вплине на результат API часу / дати.
Roun

8

Ось рішення, доступне як мінімум з iOS 13 та Xcode 11. (не тестувався з попередніми версіями)

За замовчуванням iOS Simulator показує, який час на вашому 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-дюймовий)" переосмислення - час "2020-01-12T10: 41: 00-06: 00", він перетворює цей час у мій поточний часовий пояс CET та встановлює час iOS-симулятора на 5 : 41pm
randomcontrol

1
Для пояснення: я хотів би перевірити, як реагує мій додаток, якщо користування подорожує в інший часовий пояс.
randomcontrol

Ви маєте рацію, це впливає лише на рядок стану, я щойно робив тестову роздруківку поточного часу на екрані, і це не змінило системний час модельованого пристрою лише на дисплеї вгорі. Я відредагував свою публікацію, щоб це відобразити. Спасибі
натовп

6

Ви можете встановити TZзмінну середовища в схемі Xcode, щоб встановити часовий пояс саме для цієї програми.

Управління схемами

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

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


3
Чому за цей голос проголосували? Це було єдине, що насправді працювало на мене.
Jacob Rohde

1
Це дійсно чисте рішення. Також чудово, якщо ви хочете протестувати кілька різних часових поясів: додайте налаштування TZ для кожного, але пам’ятайте, що вибираєте лише один. Я щойно додав Америку / Чикаго, Європу / Стамбул, Азію / Гонконг і Тихоокеанський / Гонолулу, щоб отримати асортимент, щоб я міг відслідковувати помилку, залежну від часового поясу. Це НЕ буде працювати, якщо вам потрібно робити знімки екрана або працювати з декількома додатками, але це дуже швидкий спосіб переключитися між кількома часовими поясами для тестування одного додатка.
Хал Мюллер

5

Змінюючи часовий пояс, я знайшов найпростіший спосіб це зробити, натиснувши годинник у меню. Потім виберіть "Відкрити налаштування дати та часу", а потім виберіть вкладку "Часова зона".

Крім того, Системні налаштування -> Дата та час та виберіть вкладку Часова зона.

Просто вказівник для тих, хто може не знати свого шляху навколо OSX.


6
Це не відповідь, тому це має бути коментар. Кількість розробників iOS, які не знають свого шляху навколо OS X, становить ... нуль.
phatmann

5

Це стара тема, але вона найближча до мого питання. Мені потрібно імітувати часовий пояс для Європи, цей метод працює для мене. Перейдіть до "TimeZone", а не "Date & Time". Зніміть прапорець "Встановити часовий пояс автоматично, використовуючи поточне місцеположення" та пересуньте вертикальну смугу прямокутника (із синьою крапкою на ньому), щоб імітувати ваш системний час.

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


2

Я запропонував автоматичне вирішення проблеми зміни часу, що включає в себе нескінченний метод шипування: https://stackoverflow.com/a/34793193/829338 . Я припускаю, що також слід працювати на зміну часового поясу відповідно.


Мені потрібно було тестувати свою програму автоматично, що вимагало зміни часу системи. Я зробив те, що запропонував Том: щасливий хекі-метод шиплять.

Для демонстраційних цілей я лише змінюю, [NSDate date]але ні [NSDate dateWithTimeIntervalSince1970:].

Спочатку вам потрібно створити метод свого класу, який слугуватиме новою [датою NSDate]. Я реалізував це, щоб просто зрушити час на постійну часову різницю.

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.