Silverlight 3.0 Beta içerisinde (Out Of Browser) tarayıcı dışı uygulamalar.

0 dakikada yazıldı

6422 defa okundu

Düzenle

Silverlight 3.0 Beta ile beraber gelen ilginç özelliklerden biri de
herhangi bir Silverlight uygulamasını doğrudan masaüstüne alabiliyor
olmamız. Gelin öncelikle hızlı bir demo ile yeni yarattığımız bir
uygulamayı nasıl masaüstüne aldığımıza ve nasıl gözüktüğüne bakalım.

Yeni bir Silverlight uygulaması yarattıktan sonra tarayıcı içerisinde bu
uygulamayı çalıştırıp üzerine farenizin sağ tuşu ile tıklarsanız gelen
menüde ilginç bir komut dikkatinizi çekecektir.

Install onto this computer?
Install onto this computer?

Gördüğünüz üzere komutun anlamı aslında epey açık :) diyor ki "Bu
uygulamayı bilgisayarına yükle!" Tabi şu an için bu komut kullanılamıyor
çünkü aktif değil. Gelin hemen bu komutu nasıl aktif hale
getirebileceğimize göz atalım.

AppManifest dosyamız burada.
AppManifest dosyamız burada.

Visual Studio içerisinde Solution Explorer'dan uygulamanızın
AppManifest.xml dosyasına erişmemiz gerekiyor. Bunun için ilk olarak
hemen Solution Explorer penceresinin en üstündeki ikinci düğme olan
"Show all files" düğmesine tıklıyoruz ve "My Project" altında Manifest
dosyamızı bulup açıyoruz.

[AppManifest.xml]

<Deployment
xmlns="http://schemas.microsoft.com/client/2007/deployment"

        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

>

    <Deployment.Parts>

    </Deployment.Parts>

 

    <!--
Uncomment the markup and update the fields below to make your
application offline enabled

   
<Deployment.ApplicationIdentity>

        <ApplicationIdentity

            ShortName="Out of Browser
Silverlight Application"

            Title="Window Title of Your
Silverlight Application">

           
<ApplicationIdentity.Blurb>Description of your Silverlight
application</ApplicationIdentity.Blurb>

        </ApplicationIdentity>

   
</Deployment.ApplicationIdentity>

    -->

</Deployment>

Yukarıdaki manifest dosyasının içeriğini görebilirsiniz. Bu dosya
içeriğinde "yorum" satırı olarak yerleştirilmiş olan yeşil kısımlar
aslında uygulamanın "Out Of Browser" yani "Tarayıcı Dışı" moduna
alınabilmesini sağlayacak olan kodların ta kendisi. Basit bir şekilde
buradaki kodları yorum olmaktan çıkarmamız uygulamamızın tarayıcı dışına
taşınabilmesini sağlayacaktır. Tabi bu süreçte var olan XML kodlarının
anlamına da bir göz atalım.

[AppManifest.xml]

<Deployment
xmlns="http://schemas.microsoft.com/client/2007/deployment"

        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

>

    <Deployment.Parts>

    </Deployment.Parts>

 

    <Deployment.ApplicationIdentity>

        <ApplicationIdentity

            ShortName="Uygulama adı
uraya gelir!
"

            Title="Uygulama
penceresinde gösterilecek metin burada!
">

            <ApplicationIdentity.Blurb>Uygulamanın uzun uzun tanımı, açıklaması
da buraya gelecektir.</ApplicationIdentity.Blurb>

        </ApplicationIdentity>

    </Deployment.ApplicationIdentity>

 

</Deployment>

ApplicationIdentity XML tagları aslında uygulamanızın kimliğini
tanımlayacaktır. Bu kimlik tabi ki son kullanıcı tarafından farklı
noktalarda uygulamanızın adını vs özelliklerini yansıtacak bilgileri
barındırıyor. Örneğin ShortName özelliğine uygulama adını kısaca
yazıyoruz, Title özelliğinde ise uygulama Windows içerisinde
tarayıcı dışında çalıştırılırken sahip olacağı kendi penceresinin
üstünde yazılacak metni tanımlıyor. Diğer yandan Blurb kısmında ise
uygulama ile ilgili açıklayıcı bilgilere yer veriyoruz.

Tüm bu ayarları tamamladıktan sonra uygulamamızı çalıştırmanın zamanı
geldi.

Uygulamamızı artık tarayıcı dışına alabiliyoruz!
Uygulamamızı artık tarayıcı dışına alabiliyoruz!

Artık uygulamamızın ekranında herhangi bir yere sağ tuş ile
tıkladığımızda gelen menüdeki "Install" deyiminin bulunduğu komutun
aktif olduğunu görebiliyoruz. Ayrıca bizim manifest içerisinde
ShortName olarak tanımladığımız uygulama adının da hemen bu komut
içerisinde uygun yere yerleştirildiğini gördük. Eh bu durumda söz konusu
komuta tıklayalım bakalım neler oluyor.

Uygulamayı yükleme onay penceresi.
Uygulamayı yükleme onay penceresi.

Yükleme komutunu verdiğimiz anda karşımıza yukarıdaki ekran geliyor ve
bizi manifest içerisinde Title olarak verdiğimiz değeri de gösterek
söz konusu uygulamayı bilgisayarımıza yüklemek üzere olduğumuza dair
uyarıyor. Yükleme süresince istersek uygulamanın birer kısayolunu
masaüstüne ve/veya başlat menüsüne alabiliyoruz.

Yükleme işlemini onayladığımız gibi Silverlight uygulaması karşımıza
normal bir Windows programıymış gibi geliyor. Kendi penceresine sahip,
tamamen tarayıcıdan bağımsız olarak uygulamamız karşımızda.

Silverlight artık tarayıcının dışında!
Silverlight artık tarayıcının dışında!

Bu noktada dikkat etmeniz gereken noktalardan biri de uygulamanın
penceresinde Title metninin yanı sıra uygulamanın yüklendiği adresin
(bizim örneğimizde localhost) de aynı şekilde pencere adına eklenmiş
olması. Böylece kullanıcılar her zaman uygulamayı hangi adresten
yüklediklerine görebilecekler. Unutmayın artık uygulamamızın masaüstünde
ve başlat menüsünde kısayolları var!

Silverlight uygulamamızın masaüstü ve başlat menüsünde!
Silverlight uygulamamızın masaüstü ve başlat menüsünde!

Yukarıdaki ekran görüntüsünde de görebileceğiniz üzere uygulamamızın bir
kısayolu masaüstünde bulunuyor. Bu kısayolun adı manifest içerisinde
ShortName. Aynı şekilde başlat menüsüne konan kısayolun adı da
ShortName üzerinden gelirken bu kısayollar üzerinde fare ile
durduğumuzda gelen açıklamada ise Blurb bilgisini görüyoruz. Artık
Silverlight uygulamamızın söz konusu bilgisayarda internet bağlantısı
olmasa da rahatlıkla bu kısayollardan çalıştırılabilecektir.

Eğer kullanıcılar bu programı bilgisayarlarından silmek isterlerse
doğrudan programı çalıştırıp Silverlight uygulamasının üzerinde herhangi
bir yerde sağ tuş ile gelen menüden  "Remove Application" komutunu
seçmek durumundalar. Silverlight 3 Beta ile beraber gelen bu özellik ile
bilgisayarlara yüklenen Silverlight uygulamaları Denetim Masası'nda
"Program/Ekle Kaldır" bölümünde gözükmeyecektir.

Silvelright uygulamasının bilgisayardan kaldırmak isterseniz...
Silvelright uygulamasının bilgisayardan kaldırmak isterseniz...

Tüm bu manzara içerisinde belki de hemen değiştirmek isteyeceğiniz
şeylerden biri uygulamanın her yerde gözüken varsayılan ikonu olacaktır.
Hem masaüstündeki hem başlat menüsündeki hem de uygulama penceresindeki
ikonların hepsini birden tek tek değiştirebiliyorsunuz.

Tek tek ayarlanmış logolar...
Tek tek ayarlanmış logolar...

Uygulamamızda kullanılmak üzere dört farklı boyutta logolar ayarlamamız
gerekiyor. Bu logoların 16, 32, 64, 128 piksellik dosyalarını doğrudan
PNG olarak kaydedebilirsiniz. Söz konusu dosyaları Silverlight projenize
eklemek için Visual Studio içerisinde Solution Explorer'a sağ tıklayıp
"Add Existing Item" diyebilirsiniz. Önemli olan tüm bu dosyaları
projenize ekledikten sonra Build Action'larını Content olarak
ayarlamanız.

PNG'lerinin hepsinin de Content olarak ayarlanması şart!
PNG'lerinin hepsinin de Content olarak ayarlanması şart!

Artık logolarımız hazır olduğuna göre geçip manifest dosyamızdaki
ayarları yapabiliriz. Kabaca manifest dosyasında ApplicationIdentity
tagına Icons adında bir seri ekleyip farklı boyutlar için hangi
dosyaların kullanılması gerektiğini belirteceğiz.

[AppManifest.xml]

<Deployment xmlns="http://schemas.microsoft.com/client/2007/deployment"

        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

>

  <Deployment.Parts>

  </Deployment.Parts>

 

  <Deployment.ApplicationIdentity>

    <ApplicationIdentity

        ShortName="Uygulama adı uraya gelir!"

        Title="Uygulama penceresinde gösterilecek metin
burada!
">

     
<ApplicationIdentity.Blurb>
Uygulamanın uzun uzun tanımı, açıklaması da buraya
gelecektir.
</ApplicationIdentity.Blurb>

      <ApplicationIdentity.Icons>

        <Icon
Size="16x16">logo_16.png</Icon>

        <Icon
Size="32x32">logo_32.png</Icon>

        <Icon
Size="64x64">logo_64.png</Icon>

        <Icon
Size="128x128">logo_128.png</Icon>

      </ApplicationIdentity.Icons>

    </ApplicationIdentity>

  </Deployment.ApplicationIdentity>

 

</Deployment>

Artık manifest dosyamızın son halini yukarıda inceleyebilirsiniz.
Icons adındaki serinin içerisinde tek tek Icon'ları tanımladık ve
her Size için ayrı ayrı hazırladığımız Content olarak uygulama
içerisinde bulunan dosyaların adlarını verdik. Silverlight uygulamamızın
bulunduğu sayfayı açıp uygulamayı masaüstüne kaydetmeye kalktığımızda
artık bu ikonlar ile karşılaşacağız.

Yükleme esnasında özel logo! :)
Yükleme esnasında özel logo! :)

Uygulamanın kısayollarında özelleştirilmiş logolar...
Uygulamanın kısayollarında özelleştirilmiş logolar...

Uygulama penceresinde özel logo!
Uygulama penceresinde özel logo!

Here yere özel logolarımız geldiğinde göre artık uygulama kimliğini çok
daha rahat bir şekilde müşteriye yansıtabiliriz. Hatta Windows
Taskbar'da da söz konusu logomuz ayrıca gözüküyor.

Taskbarda özel logo.
Taskbarda özel logo.

Ya kullanıcılar sağ tıklamaz ise uygulamamıza?

Bu noktaya kadar hoş bir şekilde uygulamaya sağ tıkladık yükledik ve
aynı şekilde sağ tıklayıp bilgisayarımızdan sildik. Diyelim ki silme
işlemi çok önemli değil :) Kimsenin pek de uygulamamızı silmesini
istemiyoruz fakat yükleme noktasında daha kolay bir kullanıcı deneyimi
sağlamak zorundayız. İnsanların uygulamamıza sağ tıklayarak o yükleme
komutunu keşfetlemelerini bekleyemeyiz. Böyle bir durumda basit bir
şekilde uygulama içerisinde herhangi bir yere "Yükle" düğmesi koymak
bile sorunumuzu çözebilir.

[VB]

        If App.Current.Detach Then

            MessageBox.Show("Oldu!")

        End If

Yukarıdaki kodu herhangi bir düğmenin arkasına yazabilirsiniz.
App.Current.Detach metodu otomatik olarak daha önceki örneklerimizde
gördüğümüz yükleme ekranını kullanıcının karşına getirecektir. Bu metod
geriye bir Boolean döndürdüğü için kullanıcının yükleme işlemini
yapıp yapmadığını da rahatlıkla öğrenebilirsiniz. Burada özellikle
dikkat etmeniz gereken bir nokta var, App.Current.Detach metodunu
kullanıcı tarafından başlatılmış metodlarda çağırabilirsiniz, yani
Page.Load gibi istediğiniz yerlerde bu pencereyi açamazsınız :)
Bilginize.

Derinlere dalalım!

Artık uygulamamızı kendi kendimize kod ile de tarayıcıdan bağımsız hale
getirebiliyoruz fakat ortalık biraz karışık durumda. Kendi yarattığımız
düğmeler aracılığı ile kod ile kullanıcı uygulamamızı masaüstüne alırsa
biz de bundan haberdar olabiliyoruz fakat ya kullanıcı gibip sağ tuş ile
gelen menüden uygulamayı bilgisayarına alırsa? Bazı durumlarda biz
bundan da haberdar olmak isteyebiliriz. Peki neden mi haberdar olmak
isteriz?

Unutmayın ki bir Silverlight uygulaması normal şartlarda Online çalışmak
üzere hazırlanır ve programlanır. Örneğin veritabanından veri çekmek
için sonuçta bir sunucuya bağlanırız. Uygulama masaüstüne alındıktan
sonra ise Offline da çalışabilir hale geliyor. Yani artık Silverlight
uygulamanız her çalıştığında internete erişimi olmayacak! Bu durumda
bizim uygulamanın tarayıcı içerisinde mi çalıştırıldığını yoksa dışarıda
mı olduğunu anlamamız gerekiyor. Diğer yandan uygulama tarayıcı dışında
olabilir fakat internet bağlantısı da o an için makinede bulunabilir.

İnternet var mı?

İlk olarak gelin uygulama her nerede olursa olsun, ister tarayıcı içinde
ister tarayıcı dışında, internet bağlantısının durumundan nasıl haberdar
olabileceğimize bakalım. Söz konusu durumla ilgili bize bilgi verecek
olan Event-Handler System.Net.NetworkInformation.NetworkChange
olarak geliyor. Bu event'ı yakalayarak bir değişiklik olduğunda
System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable
komutu ile makinede net olup olmadığını anlayabilirsiniz.

[VB]

Partial Public Class MainPage

    Inherits UserControl

 

    Public Sub New()

        InitializeComponent()

        AddHandler
System.Net.NetworkInformation.NetworkChange.NetworkAddressChanged, AddressOf Network_NetworkAddressChanged

    End Sub

 

    Private Sub Network_NetworkAddressChanged(ByVal sender As Object,
ByVal e As System.EventArgs)

        If
System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable
Then

            MessageBox.Show("NET
VAR!"
)

        Else

            MessageBox.Show("yok")

        End If

    End Sub

End Class

[C#]

    public partial class MainPage : UserControl

    {

        public MainPage()

        {

            InitializeComponent();

            System.Net.NetworkInformation.NetworkChange.NetworkAddressChanged +=

                new
System.Net.NetworkInformation.NetworkAddressChangedEventHandler(NetworkChange_NetworkAddressChanged);

        }

 

        void
NetworkChange_NetworkAddressChanged(object sender, EventArgs e)

        {

            if
(System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable())

            {

                MessageBox.Show("NET VAR!");

            }

            else

            {

                MessageBox.Show("yok");

            }

        }

    }

Yukarıdaki kodumuzda ilk olarak sayfanın Init durumunda ihtiyacımız
olan NetworkAddressChanged event'ını bağlıyoruz. Sonrasında ise söz
konusu event her çağrıldığında GetIsNetworkAvailable ile internet
bağlantısı olup olmadığını kontrol ediyoruz. Böylece siz de
uygulamalarınızda İnternet bağlantısından haberdar olup farklı
senaryolar oluşturabilir belki kullanıcılarının offline data üzerinde
çalışabilmesini sağlayıp değişiklikleri de IsolatedStorage içerisinde
bir süre için kaydedebilirsiniz.

Uygulamam nerede çalışıyor?

Silverlight uygulamalarımızı hiçbir değişiklik yapmadan masaüstüne
taşıyabiliyor olsak da aslında uygulamanın masaüstündeki hali ile
internet tarayıcı içerisinde hali arasında görsel anlamda farklılıklar
da yaratmak isteyebilirsiniz. Özetle uygulamanızın tarayıcı içerisinde
mi yoksa dışarısında mı çalıştırıldığını anlamanız gerekebilir. Bu gibi
bir durumda basit bir şekilde App.Current.RunningOffline metodundan
faydalanabilirsiniz. Bu metod size doğrudan bir Boolean
döndürecektir. Eğer sonuç True olursa uygulamanın tarayıcı dışında,
False olursa tarayıcı içerisinde olduğunu anlayabilirsiniz. Metodun
ismi aklınızı karıştırmasın söz konusu metodun internet bağlantısı olup
olmaması ile herhangi bir ilişkisi yok.

Update mekanizması ne durumda?

İnternet üzerinden bilgisayarına Silverlight uygulamamızı yüklemiz
kişiler rahatlıkla offline olarak da çalışabilecekler fakat eğer biz
sunucu tarafında bir değişiklik yapar ve Silverlight uygulamamızı
değiştirirsek ne olacak? Aslında buradaki Update mekanizması .NET
Framework içerisinde ClickOnce mekanizmasına çok benziyor.
Silverlight uygulaması masaüstünden çalıştırıldığında hemen online olup
olmadığını otomatik olarak kontrol ediyor ve eğer online ise webdeki
sürüme bakıyor. Webdeki uygulama ile lokaldeli aynı ise zaten bir sorun
yok demektir. Eğer webdeki daha yeni bir sürüm ise arkaplanda yeni sürüm
bilgisayara indiriliyor ve uygulama tekrar çalıştırıldığında istemci
tarafında artık yeni sürüm çalıştırılmış oluyor. Bu mekanizma bu şekilde
ilerlerken biz de tabi ki bu işleyişten haberdar olabiliyoruz. Örneğin
belki de yeni bir sürüm var ise kullanıcıyı uyarmak isteyebiliriz!

Uygulamanın update mekanizmasının işleyişinden haberdar olmak için
Application (uygulama) bazındaki event'lardan birini kullanmamız
gerekiyor. Söz konusu event'ın adı ExecutionStateChanged. Bu event'a
tabi ki uygulama içerisinde App.XAML'ın arkasında kod dosyasından
ulaşabiliyoruz.

[VB]

    Private Sub App_ExecutionStateChanged(ByVal sender As Object,
ByVal e As System.EventArgs) Handles Me.ExecutionStateChanged

        If
App.Current.ExecutionState =
ExecutionStates.DetachedUpdatesAvailable Then

            MessageBox.Show("Yeni sürüm
var lütfen uygulamayı baştan başlatın!"
)

        End If

    End Sub

[C#]

        public App()

        {

            this.Startup += this.Application_Startup;

            this.Exit += this.Application_Exit;

            this.UnhandledException +=
this.Application_UnhandledException;

            this.ExecutionStateChanged += new EventHandler(App_ExecutionStateChanged);

            InitializeComponent();

        }

 

        void
App_ExecutionStateChanged(object
sender, EventArgs e)

        {

            if(App.Current.ExecutionState== ExecutionStates.DetachedUpdatesAvailable)

            {

                MessageBox.Show("Yeni sürüm var lütfen uygulamayı baştan
başlatın!"
);

            }

        }

App.xaml arkasında ExecutionStateChanged event'ı çalıştığı anda o
anki uygulamanın ExecutionState'ini kontrol ediyoruz. Eğer
ExecutionState DetachedUpdatesAvailable olarak geliyorsa demek
ki yeni bir update var. Bu durumda kullanıcıya gerekli uyarıyı
gösterebiliriz.

Arkaplanda neler oluyor?

Peki nasıl oluyor da bizim Silverlight uygulaması offline çalışıyor?
Aslında konu epey basit. Herhangi bir Silverlight uygulaması Detach
edildiğinde uygulamanın XAP dosyasının bir kopyası kullanıcının
bilgisayarına alınıyor.

C:\Users\KullaniciAdi\AppData\LocalLow\Microsoft\Silverlight\Offline
  

Yukarıda gördüğünüz yolda bulunan klasörün altına Silverlight
uygulamasının bulunduğu alan adına ait bir klasör açılır ve söz konusu
klasörün içerisinde XAP dosyası bir takım başka bilgilerle beraber
kaydedilir.

Silverlight uygulaması diskte saklı.
Silverlight uygulaması diskte saklı.

Yukarıdaki ekran görüntüsünde de görebileceğiniz üzere XAP dosyamız
orada duruyor. İçerisindeki ikonlarımızdan bir ico dosyası
yaratılmış ve dışarıya yerleştirilmiş. Böylece işletim sisteminde tüm
kısayollarda bu ico dosyası kullanılıyor. Uygulamamızı host eden bir de
HTML var :) Bu HTML'i kim açıp bize gösteriyor kısmına birazdan geliriz.
Onun öncesinde metadata dosyasının içeriğine bir bakalım.

[metadata]

LaunchPath=C:\Users\KullaniciAdi\AppData\LocalLow\Microsoft\Silverlight\Offline\localhost.1\index.html

CustomIcon=1

SourceDomain=localhost

OriginalUri=http://localhost:1559/ClientBin/SilverlightApplication29.xap

AppID=localhost.1

Description=Uygulamanın uzun uzun tanımı, açıklaması da buraya
gelecektir.

Title=Uygulama penceresinde gösterilecek metin burada!

Name=Uygulama adı uraya gelir!

Gördüğünüz gibi uygulama içerisinde bazı manifest bilgilerimiz buraya da
alınmış. Önemli noktalardan biri OriginalUri bilgisinde uygulamanın
orijinal adresinin saklanıyor olması. Sistem bu bilgi üzerinden yeni
sürüm kontrolü yapabiliyor. Peki tüm bunları kim çalıştırıyor?
Silverlight Runtime kullanıcıların bilgisayarına yüklenirken beraber bir
de sllauncher.exe adında bir program yükleniyor. Bu program aldığı
parametreye göre bilgisayarda yüklü Silverlight uygulamalarını birer
masaüstü uygulamasıymış gibi çalıştırabiliyor.

Hmm bu Adobe AIR değil mi?

Adobe tarafını takip edenlerin hemen soracakları ilk soru eminim ki "Bu
Adobe AIR değil mi?
" olacaktır. Hayır, değil. Neden mi? İlk olarak
aradaki en büyük fark Adobe AIR için bilgisayarınıza ayrıca AIR Runtime
yüklemek zorunda olmanız. Silverlight tarafında böyle bir durum yok.
Hali hazırda yüklü olan Silverlight Runtime ile hayatınıza devam
edebiliyorsunuz. İkinci en büyük fark ise Silverlight'ın bir masaüstü
uygulaması haline dönüşse de hala tarayıcının güvenlik sınırlarında
çalışıyor olması. Yani masaüstüne alsanız da bir Silverlight uygulaması
masaüstündeki dosyalara kafasına göre erişemez, donanıma erişemez! Nasıl
ki tarayıcı içerisinden sadece OpenFileDialog vs kullanarak dosyalara
erişebiliyorsak masaüstüne alınmış bir Silverlight uygulaması da aynı
şartlara tabidir. Özellikle donanım erişimi konusunda farklı
senaryoların sertifikasyonlarla belki sağlanabileceğini söylese de
Microsoft şu ana kadar resmi bir duyuru yok. Adobe tarafında AIR
uygulamaları tam donanım erişimi ile çalıştığı için o tarafta
sertifikasyon şart oluyor ve Silverlight'ın masaüstüne alınabildiği gibi
bir tıkla kullanıcıya farklı bir deneyim sağlamak mümkün olmuyor. Diğer
yandan Adobe tarafında update mekanizması için de ayrı bir SDK paketinde
gelen sistemi kullanmak gerekiyor, oysa Silverlight 3.0 içerisinde söz
konusu sistem entegre olarak geliyor.

Sonuç olarak baktığınızda Adobe elindeki teknoloji ile bir Windows
uygulama geliştirme platformu oluşturmaya çalışırken Microsoft ise
Windows tarafında WPF gibi zaten kendini kanıtlamış ve arkasında .NET
Framework olan yapısını korurken web uygulamalarının rahatlıkla Offline
kullanıma açılmasını hedefleyen ve çok kolay kullanılan bir yapıyı
hedefliyor.

Kapanış!

Özünde Silverlight 3'ün bu özelliği ile çok ilginç senaryolar
üretilebilir. Online ve Offline senaryoların beraber kullanımının çok
daha rahat ve hoş bir kullanıcı deneyimi sağlayacağı kesin. Tüm bunları
yapabilmek için de birkaç satır koddan ödeye geçmenize gerek kalmıyor.

Hepinize kolay gelsin!