Làm cách nào để thay đổi thời gian và múi giờ trong trình giả lập iPhone ?
Làm cách nào để thay đổi thời gian và múi giờ trong trình giả lập iPhone ?
Câu trả lời:
Tôi đoán nó sử dụng múi giờ hệ thống của bạn, vì vậy việc thay đổi TZ trong Tùy chọn hệ thống có thể sẽ thực hiện thủ thuật
Khởi động lại Trình mô phỏng sau khi thay đổi tùy chọn thời gian ngày hệ thống và bạn sẽ thấy các thay đổi được phản ánh. Nó làm việc cho tôi.
Sẽ rất hữu ích nếu Apple cung cấp "Ngày mô phỏng" khi họ cung cấp menu "Mô phỏng vị trí". Những gì tôi làm là đặt một điểm dừng ngay sau khi nhận được ngày (lưu nó vào một biến) và sau đó sửa đổi giá trị. Hoặc chỉ sửa đổi vị trí nơi tôi kiểm tra thay đổi ngày và làm cho nó trở lại đúng.
Với mục đích chụp ảnh màn hình, Apple cuối cùng đã có thể ghi đè thời gian trên thanh trạng thái của trình giả lập iOS (kể từ Xcode 11 ) bằng cách sử dụng công cụ simctl :
xcrun simctl status_bar "iPhone Xs" override --time "21:08"
Đây là một giải pháp có sẵn từ iOS 13 và Xcode 11 ít nhất. (không thử nghiệm với các phiên bản trước)
Theo mặc định, Trình mô phỏng iOS hiển thị bất cứ lúc nào trên máy Mac của bạn, tuy nhiên, bạn có thể sử dụng dòng lệnh của Xcode để ghi đè lên điều đó bằng lệnh này trong thiết bị đầu cuối:
xcrun simctl status_bar "iPhone 11 Pro Max" override --time '9:41'
Thay thế tên giả lập bằng thiết bị bạn muốn thay đổi.
Đối với thanh trạng thái, bạn có phần ghi đè này:
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.
Thời gian có thể là bất kỳ chuỗi. Nhưng nếu bạn muốn thiết bị hiển thị ngày, bạn sẽ cần sử dụng định dạng ISO . Ví dụ: chuỗi ngày ISO hợp lệ sẽ là '2007-01-09T10: 41: 00 + 01: 00'
Nếu không, bạn có thể sử dụng tham số thời gian dưới dạng chuỗi và nó sẽ hiển thị bất cứ thứ gì bạn vượt qua trong đó.
Cảm ơn bài viết gốc của Paul Hudson Đây là liên kết !
Khi thay đổi múi giờ, tôi thấy cách dễ nhất để làm điều đó là nhấp vào đồng hồ trong thanh thực đơn. Và sau đó chọn "Mở tùy chọn ngày & giờ", sau đó chọn tab Múi giờ.
Hoặc Tùy chọn hệ thống -> Ngày và giờ và chọn tab Múi giờ.
Chỉ là một con trỏ cho bất cứ ai có thể không biết đường đi quanh OSX.
Đây là một chủ đề cũ nhưng nó là gần nhất với câu hỏi của tôi. Tôi cần mô phỏng múi giờ cho châu Âu, phương pháp này hiệu quả với tôi. Chuyển đến vòi 'TimeZone' thay vì chạm 'Ngày & Giờ'. Bỏ chọn hộp 'Đặt múi giờ tự động bằng vị trí hiện tại' và trượt thanh hình chữ nhật dọc (có chấm màu xanh trên đó) để mô phỏng thời gian hệ thống của bạn.
Bạn có thể đặt TZ
biến môi trường trong Lược đồ Xcode để đặt múi giờ chỉ cho ứng dụng đó.
Bạn có thể sử dụng UTC
, PST
, EST
, cũng như tên múi giờ nơi có trụ sở như America/Los_Angeles
. Nó không được ghi chép tốt, nhưng tôi nghi ngờ bất kỳ tên múi giờ nào cũng hoạt động.
Nó không được ghi chép tốt, nhưng nguồn là một đại diện Hỗ trợ Nhà phát triển của Apple trên các diễn đàn của nhà phát triển .
Tôi đã đề xuất một giải pháp tự động cho vấn đề thay đổi thời gian bao gồm phương pháp hacky swizzling: https://stackoverflow.com/a/34793193/829338 . Tôi cho rằng cũng nên làm việc để thay đổi múi giờ cho phù hợp.
Tôi cần kiểm tra ứng dụng của mình một cách tự động, yêu cầu thay đổi thời gian hệ thống. Tôi đã làm, những gì Tom đề nghị: hạnh phúc phương pháp hacky swizz.
Đối với mục đích trình diễn, tôi chỉ thay đổi [NSDate date]
nhưng không [NSDate dateWithTimeIntervalSince1970:]
.
Trước tiên, bạn cần tạo phương thức lớp đóng vai trò là [ngày NSDate] mới. Tôi đã thực hiện nó để đơn giản thay đổi thời gian bằng một thời gian không đổi.
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];
}
Cho đến nay, khá dễ dàng. Bây giờ đến phần thú vị. Chúng tôi nhận được các phương thức từ cả hai lớp và thực hiện trao đổi (nó hoạt động với tôi trong AppDelegate, nhưng không phải trong lớp UITests của tôi). Đối với điều này, bạn sẽ cần phải nhập khẩu 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);
Máy chủ xây dựng của tôi là UTC và một số bài kiểm tra đơn vị của tôi cần múi giờ là PST. Sử dụng một danh mục trên NSTimeZone, bạn có thể ghi đè triển khai của Apple để sử dụng mã của mình. Làm việc cho các dự án chỉ nhanh chóng quá.
//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
Sau khi thay đổi tùy chọn thời gian ngày hệ thống, tôi phải chọn Hardware
> Reset All Content And Settings
.
Chỉ điều này hoạt động với tôi trong Phiên bản 10.3 (SimulatorApp-880.5 CoreSimulator-681.5.4).