วิธีเปลี่ยนเวลาและเขตเวลาในโปรแกรมจำลอง iPhone


144

ฉันจะเปลี่ยนโซนเวลาและเวลาในตัวจำลองiPhone ได้อย่างไร


การเปลี่ยนเวลาและวันที่ของระบบไม่มีวิธีแก้ไข ที่ส่งผลกระทบต่อแอปพลิเคชัน Mac ทั้งหมดรวมถึงการประทับเวลา xcode พฤติกรรมที่ถูกต้องคือการเปลี่ยนแปลงใด ๆ ของตำแหน่ง Simulator ต้องเปลี่ยนโซนเวลาและเวลา สิ่งอื่น ๆ ทั้งหมดเป็นเพียงการแก้ปัญหา หวังว่า Apple จะแก้ไขปัญหานี้โดยเร็ว
ฤดี

คำตอบ:


214

ฉันเดาว่ามันใช้เขตเวลาระบบของคุณดังนั้นการเปลี่ยน TZ ในการตั้งค่าระบบน่าจะเป็นเคล็ดลับ

สกรีนช็อตสำหรับคำอธิบาย


1
อืม ... ฉันไม่มีตัวเลือกนี้ในโปรแกรมจำลองการของฉัน ในโทรศัพท์ของฉันอยู่ภายใต้การตั้งค่า -> ทั่วไป -> วันที่และเวลา ในโปรแกรมจำลองของฉันส่วนวันที่และเวลาไม่มีอยู่
Vito Andolini

6
โอ้ ... เปลี่ยนมันในการตั้งค่าระบบของเครื่องไม่ใช่การตั้งค่าของเครื่องจำลอง ขวา. นั่นได้ผล!
Vito Andolini

2
ปัญหาหนึ่งในเรื่องนี้เวลาของเครื่องมือจำลองจะได้รับการอัปเดตหลังจาก 2 นาทีของการเปลี่ยนเวลาของระบบ วิธีการใด ๆ ซึ่งการเปลี่ยนแปลงเวลาจำลองพร้อมกัน ....
AsifHabib

1
ฉันเปลี่ยนเวลาของ Mac และเวลาของการจำลองไม่ได้เปลี่ยนแปลงฉันกำลังตรวจสอบว่าฉันทำตามขั้นตอนถูกต้องเปลี่ยนเวลาของเครื่องมือจำลองแล้ว ดังนั้นฉันจึงสรุปว่าเวลาตัวจำลองได้รับการอัปเดตหลังจาก 10 ถึง 15 วินาที แต่มันก็ใช้ได้สำหรับฉัน @JPK ฉันไม่ทราบปัญหาของระบบของคุณวิธีที่ดีที่สุดคือการพิมพ์บันทึกเวลาที่สมบูรณ์และตรวจสอบว่ามีปัญหาอยู่ที่ไหน
AsifHabib

2
เปลี่ยนเวลาระบบของ mac จากนั้นรีสตาร์ทเครื่องจำลอง
John Wong

41

รีสตาร์ทเครื่องมือจำลองหลังจากเปลี่ยนการตั้งค่าเวลาวันที่ของระบบและคุณจะเห็นการเปลี่ยนแปลงที่แสดง มันใช้งานได้สำหรับฉัน


171
ทางออกที่น่ากลัว (ในส่วนของ Apple ไม่ใช่คำตอบของคุณ) นี่คือสิ่งที่ตัวจำลองควรทำเพื่อเป็นทางเลือกที่ปลอดภัยในการเปลี่ยนเวลาของระบบและอาจทำลายสิ่งต่าง ๆ บนคอมพิวเตอร์ของคุณ
devios1

3
@dios นี่มันยิ่งกว่าที่เคยกับ Watch
lewis

@ Lewis42 คุณหมายถึงอะไร
Iulian Onofrei

2
@lulian เพียงแค่มีอุปกรณ์ใหม่สำหรับบอกเวลา แต่คุณยังต้องยุ่งอยู่กับสิ่งนี้เพื่อทดสอบเขตเวลา มันเป็นการแสดงความคิดเห็นทิ้งฉันได้รับความผิดหวัง! :)
lewis

จริงมาก @ Lewis42 การยุ่งเกี่ยวกับเวลาของระบบบนโทรศัพท์ของคุณทำให้ข้อมูลต่างๆเช่นการเคลื่อนไหวบน Apple Watch ทำการทดสอบที่มีปัญหาหากคุณสนใจข้อมูลในนาฬิกา
James White

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'

มิฉะนั้นคุณสามารถใช้พารามิเตอร์เวลาเป็นสตริงและมันจะแสดงสิ่งที่คุณผ่านมัน

ด้วยการขอบคุณโพสต์ต้นฉบับโดย Paul Hudson นี่คือลิงค์ !


1
ความเป็นไปได้ที่ดีมาก แต่ไม่อนุญาตให้เปลี่ยนเขตเวลาสำหรับการทดสอบการทำงานของแอพในเขตเวลาอื่น เมื่อใช้เช่น xcrun simctl status_bar "iPad Pro (11 นิ้ว)" แทนที่ --time '2020-01-12T10: 41: 00-06: 00' มันจะแปลงเวลานั้นเป็นเขตเวลา CET ปัจจุบันของฉันและตั้งเวลา iOS จำลองเป็น 5 : 41pm
randomcontrol

1
สำหรับคำอธิบาย: ฉันต้องการทดสอบว่าแอปของฉันตอบสนองอย่างไรหากการใช้งานเดินทางไปยังเขตเวลาอื่น
randomcontrol

คุณถูกต้องสิ่งนี้มีผลกับแถบสถานะเท่านั้นฉันเพิ่งทดสอบการพิมพ์เวลาปัจจุบันบนหน้าจอและไม่เปลี่ยนเวลาของระบบของอุปกรณ์จำลองเท่านั้นที่แสดงอยู่ด้านบน ฉันแก้ไขโพสต์ของฉันเพื่อสะท้อนว่า ขอบคุณ
ฝูงชน

6

คุณสามารถตั้งค่าTZตัวแปรสภาพแวดล้อมใน Xcode Scheme เพื่อตั้งเขตเวลาสำหรับแอพนั้น

จัดการแบบแผน

คุณสามารถใช้UTC, PST, เช่นเดียวกับสถานที่ที่ใช้ชื่อเขตเวลาเช่นEST America/Los_Angelesมันไม่ได้เป็นเอกสารที่ดี แต่ฉันสงสัยใด ๆชื่อโซนเวลาควรจะทำงาน

มันไม่ได้เป็นเอกสารที่ดี แต่แหล่งที่มาเป็นฝ่ายสนับสนุนนักพัฒนาแอปเปิ้ลตัวแทนในฟอรั่นักพัฒนา


3
เหตุใดจึงลงคะแนนนี้ มันเป็นสิ่งเดียวที่ใช้ได้ผลกับฉันจริง ๆ
Jacob Rohde

1
นี่เป็นทางออกที่สะอาดจริงๆ นอกจากนี้ยังเป็นการดีหากคุณต้องการทดสอบโซนเวลาที่แตกต่างกันหลายรายการ: เพิ่มการตั้งค่า TZ สำหรับแต่ละโซน แต่อย่าลืมเลือกทีละครั้งเท่านั้น ฉันเพิ่งเพิ่มอเมริกา / ชิคาโก, ยุโรป / อิสตันบูล, เอเชีย / ฮ่องกง _Kong และแปซิฟิก / โฮโนลูลูเพื่อรับการแบ่งประเภทเพื่อให้ฉันสามารถติดตามข้อผิดพลาดขึ้นอยู่กับเขตเวลา สิ่งนี้จะไม่ทำงานหากคุณต้องการจับภาพหน้าจอหรือทำงานกับแอพหลายตัว แต่เป็นวิธีที่รวดเร็วในการสลับระหว่างเขตเวลาหลายแห่งเพื่อทดสอบแอพเดียว
Hal Mueller

5

เมื่อเปลี่ยนเขตเวลาฉันพบวิธีที่ง่ายที่สุดคือการคลิกที่นาฬิกาในแถบเมนู จากนั้นเลือก "การตั้งค่าวันที่และเวลาที่เปิด" จากนั้นเลือกแท็บโซนเวลา

อีกทางเลือกหนึ่งการตั้งค่าระบบ -> วันที่และเวลาและเลือกแท็บโซนเวลา

เพียงแค่ตัวชี้สำหรับทุกคนที่อาจไม่รู้จักทางรอบ OSX


6
นี่ไม่ใช่คำตอบดังนั้นควรเป็นความคิดเห็น จำนวนนักพัฒนา iOS ที่ไม่รู้จักวิธีรอบ OS X คือ ... zero
phatmann

5

นี่เป็นหัวข้อเก่า แต่ใกล้เคียงกับคำถามของฉัน ฉันต้องการจำลองเขตเวลาสำหรับยุโรปวิธีนี้ใช้ได้กับฉัน ไปที่แทป 'TimeZone' แทนการแตะ 'Date & Time' ยกเลิกการทำเครื่องหมายที่ช่อง 'ตั้งค่าเขตเวลาโดยอัตโนมัติโดยใช้ตำแหน่งปัจจุบัน' และเลื่อนแถบสี่เหลี่ยมแนวตั้ง (มีจุดสีน้ำเงินอยู่) เพื่อจำลองเวลาของระบบของคุณ

ป้อนคำอธิบายรูปภาพที่นี่


2

ผมได้นำเสนอวิธีการแก้ปัญหาโดยอัตโนมัติในการแก้ไขปัญหาการเปลี่ยนแปลงของเวลาที่มีวิธีการ swizzling hacky นี้: https://stackoverflow.com/a/34793193/829338 ฉันคิดว่าควรทำงานเพื่อเปลี่ยนเขตเวลาตาม


ฉันต้องการทดสอบแอปของฉันโดยอัตโนมัติซึ่งจำเป็นต้องเปลี่ยนเวลาของระบบ ฉันทำในสิ่งที่ทอมแนะนำ: วิธีแฮ็คแฮ็กที่มีความสุขกำลังส่าย

เพื่อวัตถุประสงค์ในการชี้ฉันเท่านั้นที่เปลี่ยนแต่ไม่[NSDate date][NSDate dateWithTimeIntervalSince1970:]

ก่อนอื่นคุณต้องสร้างวิธีการเรียนที่ทำหน้าที่เป็น [NSDate date] ใหม่ ฉันใช้มันเพื่อเปลี่ยนเวลาโดยค่าคงที่ความแตกต่างของเวลา

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 สิ่งนี้จะไม่ทำงานสำหรับการทดสอบการแจ้งเตือนในท้องถิ่น
Steve Moser

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 สิ่งนี้ใช้ได้กับฉันในเวอร์ชัน 10.3 เท่านั้น (SimulatorApp-880.5 CoreSimulator-681.5.4)Reset All Content And Settings

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.