İçeriğe geç
academia.sh

Ders 10 / 12

Simülatör ve Aygıt

Uygulamanın gerektirdiği yeteneklerin simülatörde bulunmaması, simülatör ile aygıtın ortak yetenekleri ve simüle edilen konumun gerçek konumun yerini alması ölçülür.

Yayın Güncelleme

Bu derste

  • Uygulamanın gerektirdiği yetenek simülatörde yoksa buluşmanın reddedildiğini ölçer
  • Simülatör ile aygıtın ortak yeteneklerini kesişim olarak gösterir
  • Simüle edilen konumun gerçek konumun yerini aldığını ölçer
  • Modelin yeteneği saydığını, başarımı ölçmediğini gösterir
İçindekiler

Önceki ders paketlerin sürüm kısıtlarını buluşturdu. Derlenen uygulamanın çalışacağı yer ise ayrı bir sorudur. Geliştirme sırasında uygulama çoğunlukla bir simülatörde (simulator) çalışır: bilgisayarda koşan, aygıtı taklit eden bir ortam. Gerçek bir aygıt (device) ise kendi donanımını taşır. İkisi aynı kodu çalıştırır ama aynı yetenekleri sunmaz.

Ölçü ekseni aynı: iki tanım buluşunca nasıl çözülüyor? Bu derste bir tanım uygulamanın gerektirdiği yetenekler, öteki bir ortamın sunduğu yeteneklerdir. Yetenek burada bir ad taşır: kamera, konum, ağ, hareket sensörü gibi.

Sınıflandırıcı

// Meeting.swift — iki tanim bulusunca nasil cozuldugunu siniflandirir
struct Meeting {
    let label: String
    let first: Set<String>
    let second: Set<String>
    let result: Set<String>?

    init(_ label: String, first: Set<String>, second: Set<String>, result: Set<String>?) {
        self.label = label
        self.first = first
        self.second = second
        self.result = result
    }

    var resolution: String {
        if first.isEmpty || second.isEmpty
            || first.isSubset(of: second) || second.isSubset(of: first) {
            return "olcum-disi"
        }
        guard let result, !result.isEmpty else { return "ret" }
        if result == first.union(second) { return "birlesim" }
        if result == first.intersection(second) { return "kesisim" }
        if result == first || result == second { return "oncelik" }
        return "kural-disi"
    }

    static func list(_ values: Set<String>) -> String {
        values.isEmpty ? "bos" : values.sorted().joined(separator: ",")
    }

    func report() {
        let outcome = result.map(Meeting.list) ?? "yok"
        print("\(label): ilk \(Meeting.list(first)) | ikinci \(Meeting.list(second)) | sonuc \(outcome) -> \(resolution)")
    }
}

func summarize(_ meetings: [Meeting]) {
    for resolution in ["oncelik", "kesisim", "birlesim", "ret"] {
        let count = meetings.filter { $0.resolution == resolution }.count
        print("\(resolution): \(count)")
    }
}

Farklar ve Sınırlamalar

Simülatör ile aygıt arasındaki fark, kodun değil çalıştığı ortamın farkıdır. Aynı derlenmiş uygulama iki yerde koşar, ama altındaki makine aynı değildir. Simülatör geliştirme bilgisayarında bir süreç olarak çalışır: bilgisayarın işlemcisini, belleğini ve ağ bağlantısını kullanır. Aygıt ise kendi işlemcisi, sınırlı belleği, pili ve ısı sınırı olan ayrı bir makinedir. Bu yüzden simülatörde akıcı görünen bir ekran, aygıtta takılabilir; simülatörde sorunsuz biten bir işlem, aygıtta bellek baskısı altında sonlandırılabilir.

Farkları üç sınıfa ayırmak işe yarar.

  • Donanım farkı: Simülatör bir donanım taklididir. Kamera, hareket ve yönelim sensörleri, titreşim motoru, biyometrik doğrulama ve kablosuz bağlantı birimleri gibi donanıma bağlı yetenekler ya hiç sunulmaz ya da geliştiricinin elle verdiği değerlerle taklit edilir.
  • Ortam farkı: Ağ, dosya sistemi ve izin akışları iki ortamda aynı biçimde görünür ama aynı koşullarda çalışmaz. Simülatör bilgisayarın hızlı ve kararlı bağlantısını kullanır; aygıt zayıf, kesintili ya da pahalı bir bağlantıda olabilir.
  • Yaşam döngüsü farkı: Aygıtta kullanıcı uygulamayı arka plana alır, aygıtı kilitler, başka bir uygulamaya geçer, arama alır. Simülatörde bu olayları tetiklemek mümkündür ama kendiliğinden oluşmazlar, bu yüzden geliştirici çoğu zaman onları denemeyi unutur.

Sınırlama, bir yeteneğin yokluğu kadar, varlığının yanıltıcı olması da olabilir. Simülatörde konum her zaman hazırdır, izin akışı kısa sürer ve doğruluk mükemmeldir. Aygıtta konum önce uyduyu bulmak zorundadır, kapalı bir mekânda doğruluğu düşer ve kullanıcı izni reddedebilir. Simülatörde sorunsuz geçen bir ekran bu üç durumu hiç görmemiş olabilir.

Bu bölümdeki cümleler modelin ölçtüğü şeyler değildir; ortamlar arasındaki farkın kaba bir haritasıdır. Ölçüm, bu derste aşağıda, yetenek adlarının kümeleriyle yapılır.

Gerekli Yetenek Simülatörde Yoksa

Bir uygulama kamerayı kullanıyorsa, bunu proje ayarlarında bildirir ve ilk kullanımda kullanıcıdan izin ister. Simülatör bilgisayarda koştuğu için bilgisayarın kamerasını aygıtın kamerası gibi sunmaz; kamera çağrısı simülatörde ya hata verir ya da boş döner. Konum için durum farklıdır: simülatör, geliştiricinin seçtiği bir konumu uygulamaya aygıtın konumu gibi verebilir.

Konum iznini isteyen kod platformun konum çerçevesine bağlıdır, bu yüzden yalnız kaynak olarak durur.

// konum izni — KAYNAK
import CoreLocation

let manager = CLLocationManager()
manager.requestWhenInUseAuthorization()

İlk ölçüm, bir uygulamanın gerektirdiği yeteneklerle simülatörün sunduğu yeteneklerin buluşmasıdır. Uygulama kamerayı ve hareket sensörünü ister; simülatör konum, ağ ve anahtar zinciri sunar. İki küme ayrıktır.

// main.swift — uygulamanin gerektirdigi yetenek simulatorde yok
let required: Set<String> = ["camera", "motion"]
let simulator: Set<String> = ["location", "network", "keychain"]

let missing = Meeting(
    "required-vs-simulator",
    first: required,
    second: simulator,
    result: required.intersection(simulator)
)
missing.report()
required-vs-simulator: ilk camera,motion | ikinci keychain,location,network | sonuc bos -> ret

Ortak yetenek yok ve çözüm ret: uygulama bu simülatörde gereken yeteneklerini bulamaz. Pratikte bu, kamera ekranına gelindiğinde simülatörde sınanamayan bir akışa karşılık gelir. Çözüm kodu değiştirmek değil, o akışı gerçek aygıtta sınamaktır.

GO13. Ölçüm iki ayrık yetenek kümesi için yapıldı. Gerekli yeteneklerin yalnız bir kısmının simülatörde bulunduğu karışık durum bu tabloda ayrıca ölçülmedi.

Simülatör ve Aygıtın Ortak Yetenekleri

Aynı uygulama hem simülatörde hem aygıtta çalışacaksa, ikisinin ortak yeteneklerine güvenmek güvenlidir. Simülatör konum, ağ ve anahtar zinciri sunar; aygıt kamera, konum, ağ ve hareket sensörü sunar. İkisinin buluşması iki ortamda da aynı davranan yetenekleri verir.

// main.swift — simulator ve aygitin ortak yetenekleri
let simulatorSet: Set<String> = ["location", "network", "keychain"]
let deviceSet: Set<String> = ["camera", "location", "network", "motion"]

let shared = Meeting(
    "simulator-vs-device",
    first: simulatorSet,
    second: deviceSet,
    result: simulatorSet.intersection(deviceSet)
)
shared.report()
simulator-vs-device: ilk keychain,location,network | ikinci camera,location,motion,network | sonuc location,network -> kesisim

Çözüm kesişim: konum ve ağ iki ortamda da vardır. Anahtar zinciri yalnız simülatör kümesinde göründü; çünkü bu modelde aygıt kümesine yazılmadı. Bu bir gerçeklik iddiası değil, ölçümün girdisidir: kümelere yazılanı sayarız, platformun gerçek donanımını değil.

GO14. Yetenek kümeleri modelin girdisidir; platformun gerçek yetenek listesini yansıttığı iddia edilmez. Üçüncü bir ortamın, örneğin farklı bir donanımın, kümesi ölçülmedi.

Simüle Edilen Konum

Simülatörde konum, gerçek bir uydu okumasından gelmez; geliştirici bir konum seçer ya da bir güzergâh oynatır. Uygulama iki konum bilgisine sahip olduğunda, simüle edilen konum gerçek konumun yerini alır. Bu yerine koyma bir öncelik (precedence) ilişkisidir: biri kazanır, öteki görünmez.

// main.swift — simule edilen konum gercek konumun yerini alir
let realFix = ["real-fix"]
let simulatedFix = ["simulated-fix"]

let fixMeeting = Meeting(
    "location-source",
    first: Set(realFix),
    second: Set(simulatedFix),
    result: Set(simulatedFix)
)
fixMeeting.report()
location-source: ilk real-fix | ikinci simulated-fix | sonuc simulated-fix -> oncelik

Çözüm öncelik: sonuç ikinci tanımla aynıdır. Uygulama simülatörde konum okuduğunda sahadaki bir konumu değil, seçilen konumu görür. Bu yüzden konuma bağlı hatalar yalnız simülatörde sınanınca gizli kalabilir: gerçek konum gelmediği için doğruluk, gecikme ve izin değişiklikleri gibi durumlar hiç oluşmaz.

GO15. Ölçüm tek bir konum kaynağı çiftini kapsar. Simüle edilen konum olmadığında gerçek konumun nasıl geldiği ve iki kaynağın aynı anda ne kadar ayrışabileceği ölçülmedi.

Bu farklar yüzünden aygıtta mutlaka denenmesi gereken bir liste çıkar. Kamera ve mikrofon gibi donanıma bağlı akışlar, kesintili ya da yavaş bağlantıda ağ davranışı, uzun süre çalışırken bellek kullanımı ve ısınma, arka plana alınıp geri dönülen uygulamanın durumu, dokunma ve kaydırmanın gerçek parmakla hissedilen akıcılığı bu listenin başındadır. Bunların hiçbiri simülatörde güvenle sınanamaz; çünkü simülatör ya yeteneği sunmaz ya da bilgisayarın gücüyle kusursuz çalıştırır. Pratik kural basittir: simülatör hızlı geri bildirim içindir, aygıt ise yayından önceki son sınavdır.

Aygıta Kurulum

Simülatöre uygulama kurmak için kimseye bir şey kanıtlamak gerekmez; aygıta kurmak için gerekir. Platform, aygıtta çalışacak her uygulamanın kimin tarafından üretildiğini ve neye izin verildiğini imzayla doğrular. Hazırlık dört parçadan oluşur.

  • Geliştirici kimliği (certificate): Uygulamayı imzalayan kişi ya da takımın dijital kimliğidir. Bir sertifika ile ona bağlı bir özel anahtardan oluşur; özel anahtar yoksa imza atılamaz, bu yüzden anahtarın başka bir bilgisayara taşınması gerekebilir.
  • Uygulama kimliği (app identifier): Uygulamayı dünyada tekil olarak tanıtan, çoğu zaman ters alan adı biçiminde yazılan paket adıdır. İki uygulama aynı kimliği taşıyamaz.
  • Kayıtlı aygıt (registered device): Geliştirme imzalı bir uygulama yalnız önceden kaydedilmiş aygıtlarda açılır. Aygıtın benzersiz tanımlayıcısı takımın aygıt listesine eklenir.
  • Yetkiler (entitlements): Uygulamanın bildirim, anahtar zinciri paylaşımı ya da arka planda çalışma gibi özel yetenekleri kullanma hakkıdır. Bir yetenek kodda kullanılsa da yetki profilde yoksa aygıtta çalışmaz.

Bu dört parçayı bir hazırlık profili (provisioning profile) tek dosyada bağlar: hangi uygulama kimliği, hangi sertifikayla imzalandığında, hangi aygıtlarda, hangi yetkilerle çalışabilir. Hedefin ayarları bu profile işaret eder. İmza ayarları da proje ve hedef düzeyinde tanımlanır; hedefteki değer projedekinin önüne geçer.

Aygıtta ayrıca iki adım gerekebilir. Birincisi, aygıtın geliştirme için hazır hâle getirilmesidir: platformun ilgili sürümlerinde aygıt bir geliştirici kipinin açılmasını ister. İkincisi, aygıta ilk kez kurulan geliştirme imzalı bir uygulamanın geliştiricisine aygıt sahibinin ayarlardan güvenmesidir. Her ikisi de bir kez yapılır ama atlandığında uygulama kurulur, yine de açılmaz; bu da yeni başlayanları en çok şaşırtan durumlardan biridir.

Bu hazırlığın sonucu da bir buluşmadır, ama bu dersin modeli onu ölçmez: sertifikanın, profilin ve aygıt listesinin birbirine uyup uymadığı platformun imza denetimine aittir. Derste ölçülen tek şey, hazırlık tamamlandıktan sonra uygulamanın ve ortamın yetenek adlarıdır.

Sınırlayıcı Ölçüm

Model yeteneğin var olup olmadığını sayar; bu yeteneğin ne kadar iyi çalıştığını sayamaz. Simülatörde koşan bir kod aygıtta koşmayabilir: bellek, işlemci ve sensör gürültüsü iki ortamda farklıdır. Bunu görmek için simülatör ve aygıt aynı yetenek kümesini sunsun; biri hızlı, öteki yavaş olsun. Model kümeleri karşılaştırır ve iki kümenin aynı olduğunu görür.

// main.swift — ayni yetenek kumeleri: basarim farki modelde gorunmez
let capabilities: Set<String> = ["location", "network"]

let sameCapabilities = Meeting(
    "same-capabilities",
    first: capabilities,
    second: capabilities,
    result: capabilities
)
sameCapabilities.report()
same-capabilities: ilk location,network | ikinci location,network | sonuc location,network -> olcum-disi

İki tanım aynı olduğunda sınıflandırıcı bir buluşma görmez: sonuç ölçüm dışı. Bu, iki ortamın aynı davrandığı anlamına gelmez; yalnız yetenek adlarının aynı olduğunu söyler. Başarım, süre ve doğruluk farkı bu modelin dışındadır.

Pratik kural şudur: simülatörde geçen bir sınama, yeteneğin var olduğunu gösterir, yeteneğin gerçek donanımda yeterince hızlı ve doğru çalıştığını göstermez. Süre ve bellek kaygısı taşıyan akışlar, yayından önce en az bir gerçek aygıtta sınanmalıdır. Aynı şekilde sensör verisine bağlı akışlar da simülatörde yalnız seçilen değerlerle sınanabilir; gerçek sensörün gürültüsü ya da kesintisi orada oluşmaz.

GO16. Ölçüm yeteneğin varlığını saydı. Aynı yeteneğin iki ortamda farklı hızda ya da farklı doğrulukta çalışması, bellek ve işlemci farkı ölçülmedi.

Özet

  • Uygulamanın gerektirdiği yetenek simülatörde yoksa buluşma reddedilir; akış gerçek aygıtta sınanır.
  • Simülatör ile aygıtın ortak yetenekleri kümelerin kesişimidir.
  • Simüle edilen konum gerçek konumun yerini alır; çözüm önceliktir.
  • Model yeteneğin varlığını sayar; başarım farkı ölçümün dışında kalır.
  • Bu dersin çözümü: ret. Gerekli yetenek ortamda yoksa uygulama o ortamda bulunamaz.

Sonraki Adım

Bu derste uygulamanın nerede çalışacağı ve neyin eksik kalacağı ölçüldü. Çalışırken bir şey ters gittiğinde sorunu bulmak gerekir. Bir sonraki ders hata ayıklamanın temellerini ele alır: iki kaynağın kesme noktalarının birleşimi, süzgeçlerin kesişimi ve şema ayarının kodun varsayılanına üstünlüğü.

İlerlemeni kaydetmek ve not almak için Giriş yap

Notlarım

Not almak için giriş yapmalısın.

Aramak için yazmaya başlayın.

↑↓ ↵ Esc gezin · aç · kapat