---
title: 'Zorunlu Güncelleme Stratejisi'
source: 'https://academia.sh/tr/kurslar/capraz-platform-uretim/zorunlu-guncelleme-stratejisi'
course: 'Çapraz Platform Üretim Pratiği'
language: tr
updated: '2026-10-21T05:02:51+00:00'
license: 'CC BY-SA 4.0'
objectives:
    - 'En düşük desteklenen sürümün ne olduğunu ve sunucunun onu neden istediğini açıklar'
    - 'Yumuşak ve zorunlu güncelleme istemini ayırt eder ve her birinin ne zaman uygun olduğunu söyler'
    - 'İstemcinin sürümünden yetenek üretip eski sürümdeki özelliğin işlerliğini ölçer'
    - 'Güncelleme isteminin sertliğinin işlerliği belirlemediğini ölçümle gösterir'
---

# Zorunlu Güncelleme Stratejisi

Zorunlu güncelleme stratejisi, sunucunun artık desteklemediği eski istemcileri ne zaman, hangi istemle ve hangi gerekçeyle yeni sürüme yönlendireceğini belirler. Ders, en düşük sürümün altında kalan bir istemcide ödeme özelliğinin ne kadar çalıştığını ölçer.

Önceki derste yayın aşamalı ilerledi ve eski sürüm bir süre daha sorunsuz yaşadı. Her eski sürüm sonsuza dek yaşayamaz. Sunucu bir noktada eski bir sözleşmeyi sunmayı bırakır, bir güvenlik düzeltmesi eski sürümün çalışmasını imkânsız kılar ya da bir ödeme sağlayıcısı eski bir istemciyle konuşmayı reddeder. Bu ders, o noktaya nasıl hazırlanılacağını anlatır.

Kursun sorusu aynı kalır: bu koşulda bu özellik ne kadar çalışıyor? Bu derste koşul, istemcinin sürümüdür.

## En Düşük Desteklenen Sürüm

Her sunucunun fiilen konuşabildiği bir istemci aralığı vardır. Aralığın alt sınırı en düşük desteklenen sürümdür: bunun altındaki bir istemci sunucuya bağlanabilir, ama sunucu onun isteklerinin bir kısmını kabul etmez. Alt sınır bir tercihle belirlenir. Ekip eski sözleşmeyi sunmanın bakım yükünü taşımak istemez, ya da bir güvenlik gerekçesiyle eski istemciyi kabul edemez.

Alt sınırın belirlenmesi bir veri kararıdır, bir kod kararı değil. Ekip sahadaki sürüm dağılımına bakar: hangi sürümler hâlâ kullanımda, her birinde kaç kullanıcı var. Dağılımı bilmeden alt sınırı yükseltmek, kullanıcıların bir bölümünü uyarısız bir engelle karşılamak olur.

Alt sınır sunucuda tutulur ve istemci onu uzaktan okur. Alt sınır uygulamanın içine gömülürse, o sınırı değiştirmek için yeni bir sürüm gerekir ve alt sınırın amacı olan eski istemcilerin yönlendirilmesi gerçekleşmez, çünkü eski istemci yeni sınırı hiç görmez.

## Yumuşak ve Zorunlu Güncelleme İstemi

Güncelleme istemi iki biçimde olur.

Yumuşak istem kullanıcıya yeni bir sürümün çıktığını söyler ve kullanıcı bunu erteleyebilir. İstem bir şerit, bir iletişim kutusu ya da ayarlar ekranında bir satır olarak görünür. Yumuşak istemin amacı, alt sınırın altına henüz düşmemiş istemcileri yeni sürüme yöneltmektir.

Zorunlu istem uygulamayı kullanılamaz kılar ve yalnız güncelleme ekranını gösterir. Kullanıcı güncellemeden uygulamayı kullanamaz. Zorunlu istem yalnız istemci alt sınırın altındayken, yani sunucu onunla gerçekten konuşamazken gösterilir. Daha geniş kullanılırsa, kullanıcıyı kendisine zararı olmayan bir sürüm için engellemiş olur.

Aşağıdaki iki parça politikanın sunucuda durduğu biçimi ve istemin kararını gösterir. Parçalar ölçülmez.

```yaml
# Platform kodu: guncelleme politikasi
update-policy:
  hard-minimum: 5
  latest: 6
```

```swift
// Platform kodu: guncelleme istemi
if installed < policy.hardMinimum {
    showBlockingUpdateScreen()
} else if installed < policy.latest {
    showUpdateBanner()
}
```

Karar iki karşılaştırmaya iner. Kurulu sürüm en düşük sürümün altındaysa istem zorunludur, ama en son sürümün altındaysa yumuşaktır. Bu iki sınırın arasındaki sürümler uygulamayı kullanmaya devam eder.

## Eski Sürümün Desteğinin Sonu

Destek bir günde kesilmez. Ekip önce duyurur, sonra yumuşak istemle yönlendirir, en son zorunlu istemi açar. Her adım, bir öncekinin yeterince etkili olmadığını görmeye bağlıdır. Yumuşak istem yeterli sayıda kullanıcıyı yeni sürüme taşıdıysa zorunlu adıma gerek kalmayabilir.

Destek sonu iletişimi de bir iştir. Zorunlu ekranın metni kullanıcıya neden güncellemesi gerektiğini söylemelidir; "yeni sürüm gerekli" yetmez, çünkü kullanıcı bunu bir pazarlama dili olarak okur. Gerekçe somut olduğunda, örneğin "ödeme sağlayıcısı bu sürümü artık desteklemiyor", kullanıcı güncellemeyi bir engel olarak değil bir gereklilik olarak görür.

## Mağaza İncelemesinin Gecikmesi

Zorunlu güncelleme, yeni sürümün mağazada hazır olmasına bağlıdır. Alt sınır yükseltildiği anda yeni sürüm kullanıcıya sunulabilir olmalıdır; aksi hâlde zorunlu ekran, güncellenecek bir şey bulamayan kullanıcıyı çıkmaza sokar.

Mağaza incelemesinin ne kadar süreceği önceden bilinmez ve ekip onu belirleyemez. Bu yüzden sıra şöyle olmalıdır: önce yeni sürüm mağazada yayımlanır ve kullanıcılara sunulur; alt sınır ancak ondan sonra yükseltilir. Alt sınırın yükseltilmesi uzaktan bir değer değişikliğidir ve anında etkili olur. Bu hız tehlikelidir: yanlış sırada yapılan bir değişiklik, aygıtında güncelleme bulunmayan kullanıcıyı uygulamasız bırakır.

İncelemenin reddedilme ihtimali de plana girer. Güvenlik gerekçesiyle acil bir alt sınır yükseltmesi gerekiyorsa ve yeni sürüm henüz onaylanmamışsa, ekibin elinde alt sınırı yükseltmek ile beklemek arasında bir seçim kalır. Bu seçim kod değil, risk kararıdır.

## Güncelleme Koşulunu Ölçmek

Ölçüm için üç özelliği ele alalım. `Payments` ödemedir; ağı ve `min:5` yeteneğini ister, yani istemcinin beşinci ana sürümde ya da üstünde olmasını. Ödeme sağlayıcısı eski istemciyi kabul etmez, bu yüzden yedeği yoktur. `Catalog` ürün listesidir; o da `min:5` ister, ama eski istemcide eski alanlarla çalışabilir ve yedeği kısıtlıdır. `Settings` ayarlardır ve yalnız ağı ister. Çekirdek ilk dersten tanıdıktır ve her derste aynı biçimde yeniden verilir; ders ona dokunmaz.

```javascript
// operability.mjs — bir ozelligin bir kosulda ne kadar calistigini siniflandirir
export const LEVELS = ["tam", "kisitli", "ertelenen", "kapali"];
const FALLBACKS = ["kisitli", "ertelenen"];

export function feature(name, needs, fallback = {}) {
  return { name, needs, fallback };
}

export function condition(name, has) {
  return { name, has };
}

function judge(item, cond) {
  const missing = item.needs.filter((need) => !cond.has.includes(need)).sort();
  let level = "tam";
  for (const need of missing) {
    const given = FALLBACKS.includes(item.fallback[need]) ? item.fallback[need] : "kapali";
    if (LEVELS.indexOf(given) > LEVELS.indexOf(level)) level = given;
  }
  return { level, feature: item.name, condition: cond.name, missing };
}

export function assess(features, conditions) {
  const records = [];
  for (const cond of conditions) {
    for (const item of features) records.push(judge(item, cond));
  }
  return records;
}

export function printLevels(records) {
  for (const r of records) {
    const missing = r.missing.length === 0 ? "-" : r.missing.join(",");
    console.log(`${r.level}: ${r.feature} @ ${r.condition} eksik=${missing}`);
  }
}

export function countLevels(records) {
  for (const name of LEVELS) {
    console.log(`${name}: ${records.filter((r) => r.level === name).length}`);
  }
  console.log(`etkilenen: ${records.filter((r) => r.level !== "tam").length}`);
}
```

Çekirdeğin ardından dersin yardımcı dosyası gelir. `minimumFor(client)` istemcinin ana sürümünden `min:` yetenekleri üretir: dördüncü sürümdeki bir istemci `min:1`den `min:4`e kadar olanları taşır, `min:5`i taşımaz. `conditionsFor(clients)` bu yeteneklere ağı ekleyip her istemciden bir koşul kurar. `promptFor(client, policy)` istemcinin alacağı istemi söyler; bu dersin yerel işlevidir ve kuralın girdisi değildir.

```javascript
// updates.mjs — istemci surumunden kosul uretir, guncelleme istemini soyler
import { feature, condition } from "./operability.mjs";

export function minimumFor(client) {
  const levels = [];
  for (let level = 1; level <= client.major; level++) levels.push(`min:${level}`);
  return levels;
}

export function conditionsFor(clients) {
  return clients.map((client) => condition(client.name, ["network", ...minimumFor(client)]));
}

export function promptFor(client, policy) {
  if (client.major < policy.hardMinimum) return "zorunlu";
  if (client.major < policy.latest) return "yumusak";
  return "yok";
}

export const updateFeatures = [
  feature("Payments", ["network", "min:5"]),
  feature("Catalog", ["network", "min:5"], { "min:5": "kisitli" }),
  feature("Settings", ["network"]),
];
```

**YI7.** Model, en düşük sürümü tek bir ana sürüm numarasına indirger: istemci ya beşinci ana sürümde ve üstündedir ya değildir. Gerçek bir alt sınır ara ve yama sürümünü de içerebilir ve ödeme sağlayıcısının isteği başka bir değişkene, örneğin sunucu tarafında tutulan bir uyumluluk tablosuna bağlı olabilir. Model, bu işlerliğin kuralını kurar; model çerçevenin kendisi değildir.

İlk ölçüm üç istemciyi yan yana koyar: dördüncü, beşinci ve altıncı ana sürümdeki istemciler. Önce her istemcinin alacağı istem basılır, sonra dokuz kayıt gelir. Politika alt sınırı beş, en son sürümü altı olarak tanımlar.

```javascript
// main.mjs
import { assess, printLevels } from "./operability.mjs";
import { conditionsFor, promptFor, updateFeatures } from "./updates.mjs";

const clients = [
  { name: "client-v4", major: 4 },
  { name: "client-v5", major: 5 },
  { name: "client-v6", major: 6 },
];
const policy = { hardMinimum: 5, latest: 6 };
for (const client of clients) {
  console.log(`istem: ${client.name} ${promptFor(client, policy)}`);
}
printLevels(assess(updateFeatures, conditionsFor(clients)));
```

```text
istem: client-v4 zorunlu
istem: client-v5 yumusak
istem: client-v6 yok
kapali: Payments @ client-v4 eksik=min:5
kisitli: Catalog @ client-v4 eksik=min:5
tam: Settings @ client-v4 eksik=-
tam: Payments @ client-v5 eksik=-
tam: Catalog @ client-v5 eksik=-
tam: Settings @ client-v5 eksik=-
tam: Payments @ client-v6 eksik=-
tam: Catalog @ client-v6 eksik=-
tam: Settings @ client-v6 eksik=-
```

Dördüncü sürümdeki istemci zorunlu istem alır ve ödemesi kapalıdır; eksik olan `min:5` yeteneğidir ve ödemenin yedeği yoktur. Aynı istemcide katalog kısıtlı sürer, çünkü kataloğun yedeği tanımlıdır, ayarlar ise tamdır. Beşinci sürümdeki istemci yumuşak istem alır ve üç özelliği de tamdır; altıncı sürümdeki istem almaz ve o da tamdır.

Zorunlu istemin ne zaman gösterildiğine bakalım: yalnız ödemenin kapalı olduğu istemcide. Bu tesadüf değildir. Zorunlu istem, istemcide bir özelliğin artık çalışmadığı noktada anlam kazanır; hiçbir şey kapalı değilken zorunlu istem göstermek, kullanıcıyı gereksiz yere engeller.

## Güncellemenin Etkisi

Kullanıcı güncelleyince istemcinin ana sürümü değişir ve koşul yeniden kurulur. Güncelleme, kapalı özelliği açmanın tek yoludur; ekip uzaktan bir değer değiştirerek ödemeyi eski istemcide açamaz, çünkü eksik olan şey sunucu tarafında değil, istemcinin kendisindedir.

İkinci ölçüm aynı aygıtı güncellemeden önce ve sonra koşar. Koşul adları farklıdır, çünkü iki koşulun adı aynı olamaz. Yalnız ödeme ve katalog kayıtları basılır.

```javascript
// main.mjs
import { assess, printLevels } from "./operability.mjs";
import { conditionsFor, updateFeatures } from "./updates.mjs";

const before = { name: "before-update", major: 4 };
const after = { name: "after-update", major: 5 };
console.log(`guncelleme: ${before.major} -> ${after.major}`);
const records = assess(updateFeatures, conditionsFor([before, after]));
printLevels(records.filter((r) => r.feature !== "Settings"));
```

```text
guncelleme: 4 -> 5
kapali: Payments @ before-update eksik=min:5
kisitli: Catalog @ before-update eksik=min:5
tam: Payments @ after-update eksik=-
tam: Catalog @ after-update eksik=-
```

Güncellemeden önce ödeme kapalı, katalog kısıtlıdır. Güncellemeden sonra ikisi de tamdır. Ayarlar kaydı değişmediği için süzgeçle dışarıda bırakıldı.

**YI8.** Model, güncellemeyi tek adımlı ve başarılı varsayar. Gerçekte güncelleme yarıda kalabilir, aygıtın yeterli yeri olmayabilir, ya da kullanıcı güncelleme ekranını kapatıp uygulamayı terk edebilir. Kural bu ara durumları görmez; yalnız güncellemeden önceki ve sonraki iki koşulu ölçer.

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

Bu dersin odak kaydı `Payments @ client-v4`'tür. Sınırlayıcı ölçüm iki şeyi birlikte gösterir. Birincisi, odak kayıt kapalıdır ve aynı istemcide katalog kısıtlı, ayarlar tam sürer; altı kaydın ikisi etkilenir. İkincisi, güncelleme isteminin sertliği kayda girmez: aynı istemci zorunlu ya da yumuşak istem alsa da kaydı aynıdır.

```javascript
// main.mjs
import { assess, printLevels, countLevels } from "./operability.mjs";
import { conditionsFor, promptFor, updateFeatures } from "./updates.mjs";

const clients = [
  { name: "client-v4", major: 4 },
  { name: "client-v5", major: 5 },
];
const records = assess(updateFeatures, conditionsFor(clients));
printLevels(records.filter((r) => r.condition === "client-v4"));
countLevels(records);

const strict = promptFor(clients[0], { hardMinimum: 5, latest: 6 });
const lenient = promptFor(clients[0], { hardMinimum: 3, latest: 6 });
console.log(`istem: ${strict} ${lenient}`);
const key = (list) => list.map((r) => `${r.level}:${r.feature}:${r.missing.join(",")}`).join("|");
const again = assess(updateFeatures, conditionsFor(clients));
console.log(`istem kayda girmez: ${key(records) === key(again) ? "evet" : "hayir"}`);
```

```text
kapali: Payments @ client-v4 eksik=min:5
kisitli: Catalog @ client-v4 eksik=min:5
tam: Settings @ client-v4 eksik=-
tam: 4
kisitli: 1
ertelenen: 0
kapali: 1
etkilenen: 2
istem: zorunlu yumusak
istem kayda girmez: evet
```

İlk üç satır dersin işlerliğini taşır: aynı istemcide ödeme kapalı, katalog kısıtlı, ayarlar tamdır. Sayım satırları altı kayıttan dördünün tam, birinin kısıtlı, birinin kapalı olduğunu söyler; etkilenen ikidir.

Son iki satır modelin sınırını gösterir. Aynı istemci için iki politika iki ayrı istem üretir: biri zorunlu, biri yumuşak. Ama koşulu kuran işlev politikayı hiç almaz ve kayıtlar iki durumda da aynıdır. İstem, ekibin kullanıcıyla konuşma biçimidir; işlerlik ise istemcide hangi yeteneğin bulunduğunu sınıflar. Zorunlu istem ödemeyi açmaz, yumuşak istem ödemeyi kapatmaz. Ödemenin açılması için istemcinin güncellenmesi gerekir ve istem yalnız bu güncellemeye yönlendirir.

Bu ayrım karar sırasını belirler. Önce hangi özelliğin hangi sürümde kapalı olduğu ölçülür, ardından istemin sertliği buna göre seçilir. Hiçbir özelliğin kapanmadığı bir sürüm için zorunlu istem kurmak, kaydın desteklemediği bir sertliktir.

## Özet

- Bu dersin işlerliği: kapalı. `Payments @ client-v4`, istemci `min:5` yeteneğini taşımadığı ve ödemenin yedeği olmadığı için kapalı çıktı; aynı istemcide `Catalog` kısıtlı, `Settings` tam sürdü.
- En düşük desteklenen sürüm sunucuda tutulur ve uzaktan okunur; uygulamaya gömülürse eski istemci yeni sınırı hiç görmez.
- Yumuşak istem ertelenebilir ve alt sınırın üstündeki eski sürümleri yöneltir; zorunlu istem yalnız alt sınırın altındaki istemciyi durdurur.
- Altı kayıttan dördü tam, biri kısıtlı, biri kapalıydı; etkilenen iki. Güncelleme aynı aygıtta ödemeyi kapalıdan tama, kataloğu kısıtlıdan tama taşıdı.
- İstemin sertliği kayda girmedi; alt sınırı yükseltmeden önce yeni sürümün mağazada hazır olması gerekir.

## Sonraki Adım

Bu derste istemcinin sürümü bir koşuldu ve güncelleme onu değiştirdi. Güncellemenin de bir bedeli vardır: indirilen ve kurulan uygulama aygıtta yer kaplar. Sıradaki ders, `Uygulama Boyutu Yönetimi`, uygulamanın boyutunun indirme kararına etkisini, isteğe bağlı varlık paketlerini ve platforma göre bölünmüş paketleri ele alır. Sonra ilk indirmede gelmeyen bir varlık paketine bağlı özelliğin ne kadar çalıştığını ölçer.
