Derleme göndermeden görünümü değiştirme
Görünümü ve açılış yüzeyini yönetim panelinden yayınlayın: taslaklar ve yayınlananlar, bir derlemenin bunu nasıl aldığı ve nelerin asla yayınlanmadığı.
Theming içindeki her şey derleme zamanında yapılan bir tercihtir: markanızı Dart içinde eşlersiniz ve bunu değiştirmek bir App Store incelemesi anlamına gelir. Bu doğru bir varsayılandır, çünkü derlemeniz tekrarlanabilir olmalıdır. Ancak bir müşterinin perşembe günü marka rengini değiştirdiği ilk anda yanlış bir kısıtlamaya dönüşür.
Bu nedenle renk rolleri, köşe yarıçapları, yazı boyutları, kart stilleri, logonuz ve tüm açılış yüzeyi yönetim panelinden de yayınlanabilir; burada bunlar varsayılan hâline gelir ve Dart kodunuz ise taban sınır olur.
Neleri değiştirir
| Yayınlanabilir | Nereye yansır |
|---|---|
surface, onSurface, accent, onAccent | fromTokens fonksiyonunun çalıştırdığı aynı türetim yoluyla katalogdaki her blok. Dördü birden ya da hiçbiri: kısmi bir paletin kontrastı denetlenemez; çünkü dışarıda bıraktığı değerler yönetim panelinden değil Dart kodunuzdan gelir |
| Yükseltilmiş, alçaltılmış ve yüksek yüzey tonları | surface değerinin türetilmiş komşuları; yönetim paneli bunları açıkça yayınladığında |
| Blok köşesi, kontrol köşesi | RendelRadiusScale.card ve .control (iletim hattı daha küçük adımları da taşır) |
| Yazı boyutları (display'den overline'a) | RendelTypeScale: her bloğun metin adımları |
| Yazı tipi ailesi adları | Yalnızca ad olarak, uygulamanızın hâlihazırda içerdiği yazı tipleriyle eşleştirilen metin ve display yazı biçimleri |
| Stil: kart, buton, ürün düzeni, takip düzeni | RendelStyle: her bloğun nasıl inşa edildiği |
| Blok türüne göre kart bazında görünümler | RendelCardLook |
Mesaj kutusu renkleri (composer, onComposer, onComposerFaint), ipucu metni ve üç ikonu | Mesaj kutusu |
Logo (varlık kimliğine göre, /v1/apps/logo üzerinden alınır, asla bir URL değildir) | Bir sohbet başladıktan sonra Rendel'in başlığı, adın önünde. Açılış ekranında işaret bulunmaz |
| Asistan adı | Bir sohbet başladığında Rendel'in başlığı |
| Başlatıcı etiketi | RendelLauncher üzerindeki kelime |
| Açılış başlığı ve gövde metni, öneriler | Açılış ekranı: selamlama, ardından tek bir kart içinde öneriler |
| Kullanılabilirlik | Başlatıcıyı gizler ve open() çağrısını reddeder |
Başka hiçbir şey. Personanız, bilgi kaynaklarınız, aksiyon kayıt defteriniz, anahtarlarınız ve limitleriniz asla bu iletim hattında yer almaz. Bkz. Kasıtlı olarak yayınlanmayanlar.
Taslak ve yayınlanan sürümler farklı kanallardır
Uygulama başına bir yapılandırma vardır ve aynı anda iki sürümü devrededir.
- Bir test anahtarı taslak sürümü alır. Yönetim panelinde kaydedin; test anahtarınızı çalıştıran kendi uygulamanız bir sonraki açılışında bunu alır.
- Bir canlı anahtar ise yayınlanan sürümü alır ve bunu yalnızca Yayınla'ya bastıktan sonra alır.
Test anahtarı üzerindeki uygulamanız, önizleme cihazının ta kendisidir. Eşzamanlı tutulacak ikinci bir yüzey yoktur ve “Bu ne zaman kullanıcılarıma ulaşır?” sorusunun yanıtı tek bir kelimedir.
Taslak hakkında bilinmesi gereken bir şey var: test anahtarı yayınlanabilir bir anahtardır ve tıpkı canlı anahtarda olduğu gibi herkes bir TestFlight veya debug derlemesinden bunu ayıklayabilir. Taslak kanalı gizli bir kanal değil, bir kolaylıktır. launcherLabel içine henüz duyurulmamış bir ürün adı koyup gizli kalmasını beklemeyin.
Her yayınlama, yerine geçtiği sürümü saklar ve geri yükleme işlemi, eski bir sürümü doğrudan kullanıcılarınıza sunmak yerine taslağa kopyalar.
SDK tarafı
Bağlanacak bir şey yoktur. init() yapılandırmayı alır, ikinci bir açılışın ilk karede görünümünüzü çizmesi için önce önbelleğe alınmış olanı uygular ve herhangi bir sorun çıktığında doğrudan derlediğiniz koda geri döner.
await Rendel.init(
appKey: key,
// Still the floor. Anything the console does not publish comes from here,
// and anything it publishes is layered over this rather than over the last
// payload that arrived.
theme: RendelTheme.fromTokens(
surface: brand.background,
onSurface: brand.text,
accent: brand.primary,
onAccent: brand.onPrimary,
),
config: const RendelConfig(
assistantName: 'Kicks',
launcherLabel: 'Ask',
),
);Açılışlar arasında koruma
Bağlanacak bir şey yoktur. SDK, geçerli son yükü uygulamanın tercihlerinde (shared_preferences) saklar; böylece ilk açılıştan sonra yayınlanan görünümünüz getirme işlemi tamamlanmadan önce ekrana çizilir. RendelConfig.configStore kendi deponuzu (örneğin şifrelenmiş bir depoyu) kullanmanızı sağlar; RendelMemoryConfigStore() ise açılışlar arasında hiçbir şey saklamaz.
Devre dışı bırakma
config: const RendelConfig(remoteConfig: false)Bu durumda derlemeniz sonsuza kadar tam olarak Dart kodunuzun belirttiği gibi görünür. Tekrarlanabilirlik sizin için perşembe günkü bir marka değişikliğinden daha önemliyse bunu kullanın.
Yeniden başlatmadan yayını alma
Rendel.refreshConfig() bunu yeniden okur. Bunu istiyorsanız uygulamanız ön plana döndüğünde çağırın; SDK yaşam döngüsüne kendisi müdahale etmez, çünkü bir başkasının uygulamasına uygulama yaşam döngüsü gözlemcisi kuran bir SDK sürpriz yaratır.
Her hata modu kod yapılandırmanıza geri döner
Tüm güvenlik güvencesi budur, bu nedenle açık olmakta fayda vardır. Aşağıdakilerin her birinde Rendel tam olarak derlediğiniz hâli işler:
- Uygulama daha önce hiçbir yapılandırma yayınlamamışsa
- Cihaz çevrimdışıysa veya istek zaman aşımına uğrarsa
- API bir hata döndürürse
- Veri yükü kesilmişse, JSON değilse veya yanlış biçimde bir JSON ise
- 900 pt gövde boyutu veya negatif yarıçap gibi bir değer aralık dışındaysa
- Diskteki önbellek bozulmuşsa
- Veri yükü daha yeni bir sunucudan geliyorsa ve bu derlemenin hiç bilmediği anahtarlar içeriyorsa
Sonuncusu bir tesadüf değil, bir kuraldır: bilinmeyen anahtarlar yoksayılır ve asla kritik bir hataya yol açmaz; böylece yönetim paneli yeni bir kontrol öğrendiğinde sahadaki eski bir ikili dosya çalışmaya devam eder.
Kontrast raporlanır ve taban sınır cihazda uygulanır
Yönetim paneli SDK'nın kendi denetimini çalıştırır: başlatma sırasında auditContrast fonksiyonunun debug konsolunuza yazdırdığı aynı lerp'ler, aynı ikiye bölmeler ve aynı eşikler. Marka turuncunuz üzerine beyaz seçtiğinizde, bunun 3.34:1 olduğunu, hangi kontrolü etkilediğini ve uygulamanın bunun yerine ne çizeceğini size bildirir.
Türetimin kurtardığı değeri değil, yazdığınız değeri ölçer. Kurtarılan değeri ölçmek, bu denetimi yakalamak için var olduğu tek çiftte bile başarısızlığa uğramaz hâle getiriyordu.
Kaydetmenizi engellemez. Eskiden engellerdi ve bu doğru bir fikir için yanlış bir mekanizmaydı: cihaz, okunamıyorsa yazdığınız rengi asla çizmez — rengi koyulaştırır ve sonucu çizer — dolayısıyla reddedilen şey okunaksız bir uygulama değil, ayarlanacak olan renk örneğiydi. Bir markanın hangi renk örneğini kullanacağı markanın kendi kararıdır ve sürükleme ortasında bunu reddeden bir ekran özenli olmaktan ziyade bozuk gibi görünüyordu. Rapor bir rapor olarak kalır; renk örneğinizin telefonla eşleşmesini tercih ediyorsanız tek bir tıklama ayarlanmış değeri alır.
Taban sınırın kendisi değişmedi, çünkü hiçbir zaman yönetim panelinde değildi:
- Okunaksız bir
onAccent,onSurface,onComposerveyaonComposerFaint, release derlemelerinde 4.5:1 oranını geçene kadar koyulaştırılır ve debug konsolunuz bunu belirtir. - Türetilmiş rolleri çizildikleri her yüzeyde taban sınırlarını hâlâ aşamayan yayınlanmış bir tema bütünüyle elenir ve Rendel derlediğiniz temayı işler. Bu durum nadirdir ve sessizce gerçekleşir: kaydetme işlemi çalışır ve uygulama kendi renklerini korur. Yayınladığınız bir palet görünmüyorsa ilk kontrol edilecek şey budur;
surface,surfaceRaisedvesurfaceSunkarasındaki farkı açtığınızda sorun çözülür.
Yönetim paneli artık balon renklerini yayınlamaz. Yanıtlar sayfalara dönüşmeden önce kaydedilmiş bir balon renk çifti, bir sonraki kaydetmenizde kaldırılır.
Müşterinin markası, erişilebilirlik taban sınırı etrafından dolanılarak değil, her zaman bu sınır gözetilerek uygulanır. Taban sınırın zorunlu kılındığı yer cihazdır; yönetim paneli yalnızca ne yapacağını söyler.
Kasıtlı olarak yayınlanmayanlar
Yayınlanabilir anahtarlar herkese açıktır. rd_pk_live_... ikili dosyanızın içinde yer alır ve herkes bunu ayıklayabilir; bu nedenle bu iletim hattındaki her şey yapısal olarak herkese açıktır. Buradaki kriter “müşteri bunu dert eder mi?” değil, “uygulamanın herhangi bir kullanıcısı bunu zaten görebiliyor mu?” sorusudur ve yukarıdaki her alan uygulamanın ekranda çizdiği bir şeydir.
Kasıtlı olarak dışarıda bırakılanlar:
- Personanız. İsim, üslup, talimatlar ve güvenlik sınırları. Prompt, üründeki kopyalanması en kolay şeydir ve asla iletim hattında bulunmaz.
- Bilgi kaynaklarınız, bunların URL'leri ve içerikleri.
- Kendi aksiyon kayıt defteriniz, risk seviyeleri ve etkinleştirme bayrakları. Bir asistanın ne yapabileceğini sunucu her turda yanıtlar, cihaza yayınlanmaz.
- Plan, limitler, kullanım ve faturalandırma durumu.
- Herhangi bir kişiyi, diğer uygulamalarınızı veya organizasyonunuzu adlandıran her şey.
- SDK'nın getireceği herhangi bir URL. Yazı tipleri adlandırılır, asla bağlantı verilmez: cihazın güvendiği bir veri yükündeki uzak yazı tipi URL'si, başka birinin uygulamasında bir takip pikseli olmaktan yalnızca bir yönlendirme uzaklıktadır. İkili dosyanızın hâlihazırda içerdiği bir aileyi adlandırın; içermiyorsa Flutter varsayılana döner ve hiçbir şey bozulmaz.
Kullanılabilirlik anahtarı bir güvenlik kontrolü değil, bir kolaylıktır. Eyleme davetin çizilmesini durdurur. Bir uygulamayı askıya almak ise API'nin yanıt vermesini tamamen durduran ayrı bir sunucu tarafı kontroldür.