İPhone simülatöründeki saat ve saat dilimini nasıl değiştiririm ?
İPhone simülatöründeki saat ve saat dilimini nasıl değiştiririm ?
Yanıtlar:
Sistem saat diliminizi kullandığını tahmin ediyorum, bu yüzden Sistem Tercihlerinde TZ'yi değiştirmek muhtemelen işe yarayacaktır
Sistem tarih saati tercihlerini değiştirdikten sonra Simülatörü yeniden başlatın ve değişikliklerin yansıtıldığını göreceksiniz. Benim için çalıştı.
Apple, bir "Konumu Simüle Et" menüsü sağladığı için "Tarihi simüle et" seçeneği sunsaydı faydalı olacaktır. Ne yaptığım tarihi aldıktan sonra hemen bir kesme noktası ayarlamak (bir değişkene kaydetme) ve sonra değeri değiştirin. Ya da sadece bir tarih değişikliğini kontrol ettiğim ve değiştirdiğim noktayı değiştirin.
Ekran görüntüsü almak için Apple nihayet simctl aracını kullanarak iOS simülatörünün durum çubuğunda ( Xcode 11'den beri ) zamanı geçersiz kılmayı mümkün kıldı :
xcrun simctl status_bar "iPhone Xs" override --time "21:08"
En azından iOS 13 ve Xcode 11'de bulunan bir çözüm. (önceki sürümlerle test etmedi)
Varsayılan olarak iOS Simulator, Mac'inizde saatin ne olduğunu gösterir, ancak Xcode'un komut satırını terminaldeki bu komutla geçersiz kılmak için kullanabilirsiniz:
xcrun simctl status_bar "iPhone 11 Pro Max" override --time '9:41'
Simülatör adını değiştirmek istediğiniz cihazla değiştirin.
Durum çubuğu için bu geçersiz kılmalara sahipsiniz:
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.
Zaman herhangi bir dize olabilir. Ancak cihazın tarihi göstermesini istiyorsanız ISO formatını kullanmanız gerekir . Örneğin, geçerli bir ISO tarih dizesi '2007-01-09T10: 41: 00 + 01: 00'
Aksi takdirde, time parametresini bir dize olarak kullanabilirsiniz ve içine ne geçerseniz girin.
Paul Hudson tarafından orijinal yayına teşekkür grubu İşte bağlantı !
Sen ayarlayabilirsiniz TZ
sadece bu uygulama için saat dilimini ayarlamak için bir Xcode Şemasında ortam değişkeni.
Sen kullanabilirsiniz UTC
, PST
, EST
yanı gibi yere dayalı saat dilimi adları gibi America/Los_Angeles
. İyi belgelenmemiş, ancak herhangi bir saat dilimi adının çalışması gerektiğinden şüpheleniyorum .
İyi belgelenmemiş, ancak kaynak geliştirici forumlarında bir Apple Geliştirici Desteği temsilcisi .
Saat dilimini değiştirirken, bunu yapmanın en kolay yolunun menü çubuğundaki saati tıklamak olduğunu buldum. Sonra "Tarih ve Saat Tercihlerini Aç" ı seçip Saat Dilimi sekmesini seçin.
Alternatif olarak Sistem Tercihleri -> Tarih ve Saat öğelerini seçin ve Saat Dilimi sekmesini seçin.
Sadece OSX'te yolunu bilmeyen herkes için bir işaretçi.
Bu eski bir konu ama soruma en yakın. Avrupa için saat dilimini simüle etmem gerekiyor, bu yöntem benim için çalışıyor. 'Tarih ve Saat' dokunun yerine 'Saat Dilimi' seçeneğine gidin. 'Geçerli konumu kullanarak saat dilimini otomatik olarak ayarla' kutusunun işaretini kaldırın ve sistem saatinizi simüle etmek için dikey dikdörtgen çubuğu (üzerinde mavi noktalı) kaydırın.
Keskin yöntem swizzling içeren zamanı değiştirme sorununa otomatik bir çözüm önerdim: https://stackoverflow.com/a/34793193/829338 . Bunun zaman dilimini buna göre değiştirmek için de işe yarayacağını düşünüyorum.
Uygulamamı otomatik olarak test etmem gerekiyordu, bu da sys zamanını değiştirmeyi gerektiriyordu. Tom'un önerdiği şeyi yaptım: mutlu hileli yöntem dolandırıcılığı.
Gösterici amaçlar için, sadece değişiyorum [NSDate date]
ama değiştirmiyorum [NSDate dateWithTimeIntervalSince1970:]
.
Öncelikle, yeni [NSDate tarihi] olarak işlev gören sınıf yönteminizi yaratmanız gerekir. Sadece sabit bir timeDifference tarafından zaman kaydırmak için uyguladım.
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];
}
Şimdiye kadar, oldukça kolay. Şimdi eğlenceli kısım geliyor. Yöntemleri hem sınıflardan hem de değişim uygulamasından alıyoruz (benim için AppDelegate'te çalıştı, ancak UITests sınıfımda değil). Bunun için içe aktarmanız gerekecek 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);
Yapım sunucum UTC ve bazı birim testlerimin saat dilimi PST olması gerekiyordu. NSTimeZone'da bir kategori kullanarak kodunuzu kullanmak için Apple'ın uygulamasını geçersiz kılabilirsiniz. Sadece hızlı projeler için de çalışır.
//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
Sistem tarih saat tercihlerini değiştirdikten sonra Hardware
> seçeneğini seçmek zorunda kaldım Reset All Content And Settings
.
Sadece bu benim için Sürüm 10.3'te çalıştı (SimulatorApp-880.5 CoreSimulator-681.5.4).