Merhaba, iOS – derin bakış
Temel bir Xamarin. iOS uygulaması oluşturmaya ve çalıştırmaya sunulan hızlı başlangıç kılavuzu. Artık iOS uygulamalarının nasıl çalıştığı hakkında daha ayrıntılı bilgi edinmektir. böylece daha karmaşık programlar oluşturabilirsiniz. Bu kılavuz, iOS uygulama geliştirmenin temel kavramlarını kavramak için, Merhaba, iOS izlenecek adımlarını gözden geçirir.
Bu kılavuz, tek ekranlı bir iOS uygulaması oluşturmak için gereken becerileri ve bilgileri geliştirmenize yardımcı olur. Üzerinde çalıştıktan sonra, Xamarin. iOS uygulamasının farklı kısımlarını ve bunların birbirine nasıl uydukları hakkında bir bilgiye sahip olmanız gerekir.
Mac için Visual Studio giriş
Mac için Visual Studio, Visual Studio ve xcode özelliklerini birleştiren ücretsiz, açık kaynaklı bir ıde 'dir. Tamamen tümleşik bir görsel tasarımcı, yeniden düzenleme araçlarıyla bir metin Düzenleyicisi, bir derleme tarayıcısı, kaynak kodu tümleştirmesi ve daha fazlasını sunar. bu kılavuzda bazı temel Mac için Visual Studio özellikler tanıtılmaktadır, ancak Mac için Visual Studio yeni başladıysanız Mac için Visual Studio belgelerine göz atın.
Mac için Visual Studio, çözüm ve projelerekod düzenleme Visual Studio uygulaması izler. Bir çözüm, bir veya daha fazla projeyi tutabilecek bir kapsayıcıdır. Proje bir uygulama (iOS veya Android gibi), destekleme kitaplığı, test uygulaması ve daha fazlası olabilir. phoneword uygulamasında, tek görünüm uygulama şablonu kullanılarak yeni bir iPhone projesi eklenmiştir. İlk çözüm şu şekilde aranır:

Visual Studio giriş
Visual Studio, Microsoft 'un güçlü bir ıde 'dir. Tamamen tümleşik bir görsel tasarımcı, yeniden düzenleme araçlarıyla bir metin Düzenleyicisi, bir derleme tarayıcısı, kaynak kodu tümleştirmesi ve daha fazlasını sunar. bu kılavuz, Visual Studio için Xamarin araçlarıyla bazı temel Visual Studio özellikleri tanıtır.
Visual Studio kodu çözümler ve projeler halinde düzenler. Bir çözüm, bir veya daha fazla projeyi tutabilecek bir kapsayıcıdır. Proje bir uygulama (iOS veya Android gibi), destekleme kitaplığı, test uygulaması ve daha fazlası olabilir. phoneword uygulamasında, tek görünüm uygulama şablonu kullanılarak yeni bir iPhone projesi eklenmiştir. İlk çözüm şu şekilde aranır:

Xamarin. iOS uygulamasının anatomumu
Sol tarafta, dizin yapısını ve çözümle ilişkili tüm dosyaları içeren çözüm paneli:

Sağ tarafta, dizin yapısını ve çözümle ilişkili tüm dosyaları içeren çözüm bölmesi:

Merhaba, iOS gözden geçirmede phoneword adlı bir çözüm oluşturdunuz ve bir iOS projesi- Phoneword_iOS yerleştirdiniz. Projenin içindeki öğeler şunları içerir:
- Başvurular -uygulamayı derlemek ve çalıştırmak için gereken derlemeleri içerir. System, System. Core ve System.Xmlgibi .NET bütünleştirilmiş kodlarına yönelik başvuruları ve Xamarin. iOS derlemesine bir başvuruyu görmek için dizini genişletin.
- paketler -paketler dizini, kullanıma hazırlanmış NuGet paketlerini içerir.
- Kaynaklar -kaynaklar klasörü diğer medyayı depolar.
- Main. cs – bu, uygulamanın ana giriş noktasını içerir. Uygulamayı başlatmak için, ana uygulama sınıfının adı öğesine
AppDelegategeçirilir. - Appdelegate. cs – bu dosya ana uygulama sınıfını Içerir ve pencereyi oluşturmaktan, Kullanıcı arabirimini oluşturmadan ve işletim sisteminden olayları dinlemeye sorumludur.
- Main. görsel taslak -film şeridi, uygulamanın kullanıcı arabiriminin görsel tasarımını içerir. Görsel taslak dosyaları, iOS Tasarımcısı adlı bir grafik düzenleyicide açılır.
- ViewController. cs – görünüm denetleyicisi, kullanıcının gördüğü ve dokunduğu ekranı (görünüm) güçlendirir. Görünüm denetleyicisi, Kullanıcı ve görünüm arasındaki etkileşimleri işlemekten sorumludur.
- ViewController. Designer. cs –, görünümü ve görünüm denetleyicisindeki kod temsilleri arasında yapıştırıcı görevi gören otomatik oluşturulmuş bir dosyadır. Bu bir iç sıhhi tesisat dosyası olduğundan, IDE el ile yapılan tüm değişikliklerin üzerine yazar ve bu dosyanın yok sayılmasına neden olur.
- Info. plist : Info. plist , uygulama adı, simgeler, başlatma görüntüleri ve daha fazlası gibi uygulama özelliklerinin ayarlandığı yerdir. Bu güçlü bir dosyadır ve buna kapsamlı bir giriş, özellik listeleriyle çalışma kılavuzunda bulunabilir.
- Yetkilendirmeler. plist -yetkilendirmeler özellik listesi, ICloud, PassKit gibi uygulama yeteneklerini (App Store teknolojileri de denir) belirtmemizi sağlar. Yetkilendirmeler. plist hakkında daha fazla bilgi, özellik listeleriyle çalışma kılavuzunda bulunabilir. Yetkilendirmelere genel bir giriş için cihaz sağlama kılavuzuna bakın.
Mimari ve uygulama temelleri
Bir iOS uygulamasının Kullanıcı arabirimini yükleyebilmesi için, iki şeyin yerinde olması gerekir. İlk olarak, uygulamanın bir giriş noktası tanımlanması gerekir: uygulamanın işlemi belleğe yüklendiğinde çalıştırılan ilk kod. İkincisi, uygulama genelinde olayları işlemek ve işletim sistemiyle etkileşimde bulunmak için bir sınıf tanımlanması gerekir.
Bu bölümde, aşağıdaki diyagramda gösterilen ilişkiler incedir:
Main yöntemi
Bir iOS uygulamasının ana giriş noktası Application sınıfıdır. ApplicationSınıfı Application dosyasında tanımlanır ve statik bir Main yöntem içerir. Bu, yeni bir Xamarin. iOS uygulama örneği oluşturur ve işletim sistemi olaylarını işleyecek uygulama temsilcisi sınıfının adını geçirir. Statik yöntemin şablon kodu Main aşağıda görünür:
using System;
using UIKit;
namespace Phoneword_iOS
{
public class Application
{
static void Main (string[] args)
{
UIApplication.Main (args, null, "AppDelegate");
}
}
}
Uygulama temsilcisi
İOS 'ta, uygulama temsilcisi sınıfı sistem olaylarını işler; Bu sınıf Appdelegate. csiçinde bulunur. AppDelegateSınıfı, uygulama AppDelegateyönetir. Pencere, UIWindow sınıfının Kullanıcı arabirimi için kapsayıcı görevi gören tek bir örneğidir. Varsayılan olarak, bir uygulama içeriğinin yükleneceği tek bir pencere alır ve pencere, fiziksel cihaz ekranının boyutlarıyla eşleşen sınırlayıcı dikdörtgeni sağlayan bir ekrana (tek örnek) eklenir.
Appdelegate , uygulamanın başlatılması bittiğinde veya bellek yetersiz olduğunda olduğu gibi önemli uygulama olayları hakkında sistem güncelleştirmelerine abone olunmasından de sorumludur.
AppDelegate için şablon kodu aşağıda verilmiştir:
using System;
using Foundation;
using UIKit;
namespace Phoneword_iOS
{
[Register ("AppDelegate")]
public partial class AppDelegate : UIApplicationDelegate
{
public override UIWindow Window {
get;
set;
}
...
}
}
Uygulama penceresini tanımladıktan sonra Kullanıcı arabirimini yüklemeye başlayabilir. Sonraki bölümde kullanıcı arabirimi oluşturma incelenmektedir.
Kullanıcı arabirimi
Bir iOS uygulamasının Kullanıcı arabirimi bir storefront gibidir; uygulama genellikle bir pencere alır, ancak bu pencere, gereken sayıda nesne ile pencereyi doldurabilir ve uygulamanın ne kadar görüntülenmesini istediğini bağlı olarak değiştirebilir. Bu senaryodaki nesneler-kullanıcının gördüğü şeyler, görünümler olarak adlandırılır. Bir uygulamada tek bir ekran oluşturmak için, görünümler bir Içerik görünümü hiyerarşisindebirbirlerinin üzerine yığılır ve hiyerarşi tek bir görünüm denetleyicisi tarafından yönetilir. Birden çok ekranlı uygulamalar, her biri kendi görünüm denetleyicisi olan birden çok Içerik görünümü hiyerarşisine sahiptir ve uygulama, kullanıcının açık olduğu ekrana göre farklı bir Içerik görünümü hiyerarşisi oluşturmak için görünümleri pencereye koyar.
Görsel taslakları kullanarak bir kullanıcı arabirimi oluşturma hakkında daha fazla bilgi için Apple 'ın iOS Geliştirici kitaplığı 'nda Xcode genel bakış konusunun görsel taslak ile tasarlama bölümüne bakın.
Aşağıdaki diyagramda, Kullanıcı arabirimini cihaz ekranına getiren pencere, görünümler, alt görünümler ve görünüm denetleyicisi arasındaki ilişkiler gösterilmektedir:
Sonraki bölümde, kod içindeki görünümlerle çalışmayı ve görünüm denetleyicilerini ve görünüm yaşam döngüsünü kullanarak Kullanıcı etkileşimi için program kullanmayı öğrenin.
Görüntüleme denetleyicileri ve görüntüleme yaşam döngüsü
Her Içerik görünümü hiyerarşisinin, Power User etkileşimi için karşılık gelen bir görünüm denetleyicisi vardır. Görünüm denetleyicisinin rolü, Içerik görünümü hiyerarşisindeki görünümleri yönetmez. Görünüm denetleyicisi, Içerik görünümü hiyerarşisinin bir parçası değildir ve arayüzde bir öğe değildir. Bunun yerine, kullanıcının ekrandaki nesnelerle etkileşimini destekleyen kodu sağlar.
Denetleyicileri ve görsel taslakları görüntüleme
Görünüm denetleyicisi, görünümün alt kısmındaki bir çubuk olarak bir film şeridinde temsil edilir. Görünüm denetleyicisini seçmek Özellikler bölmesiözelliklerini getirir:

Bu sahneye göre temsil edilen Içerik görünümü hiyerarşisi için özel bir görünüm denetleyicisi sınıfı, Özellikler bölmesiIdentity bölümünde Class özelliği düzenlenerek ayarlanabilir. Örneğin, Phoneword uygulamamız aşağıdaki ekran görüntüsünde gösterildiği gibi ilk ekranımız için Görünüm denetleyicisi olarak ayarlanır:

Görünüm denetleyicisi, görünümün alt kısmındaki bir çubuk olarak bir film şeridinde temsil edilir. Görünüm denetleyicisini seçmek Özellikler bölmesindeözelliklerini getirir:

Bu sahneye göre temsil edilen Içerik görünümü hiyerarşisi için özel bir görünüm denetleyicisi sınıfı, Özellikler bölmesininkimlik bölümünde sınıf özelliği düzenlenerek ayarlanabilir. Örneğin, Phoneword uygulamamız aşağıdaki ekran görüntüsünde gösterildiği gibi ilk ekranımız için Görünüm denetleyicisi olarak ayarlanır:

Bu, görünüm denetleyicisinin görsel taslak sunumunu ViewController C# sınıfına bağlar. Dosyayı açın ViewController.cs ve bildirim görünüm denetleyicisi aşağıdaki kodla gösterildiği gibi öğesinin bir ViewController.csUIViewController :
public partial class ViewController : UIViewController
{
public ViewController (IntPtr handle) : base (handle)
{
}
}
ViewControllerArtık film şeridinde bu görünüm denetleyicisiyle ilişkili içerik görünümü hiyerarşisinin etkileşimleri sürüşdir. Daha sonra Görünüm yaşam döngüsü adı verilen bir işleme bakarak görünümleri yönetirken görünüm denetleyicisinin rolü hakkında bilgi edineceksiniz.
Not
Kullanıcı etkileşimi gerektirmeyen yalnızca görsel ekranlarda, sınıf özelliği Özellikler bölmesiboş bırakılabilir. Bu, görünüm denetleyicisinin destek sınıfını bir varsayılan uygulama olarak ayarlar. Bu, UIViewController özel kod eklemeyi planlamıyorsanız uygun olur.
Yaşam döngüsünü görüntüle
Görünüm denetleyicisi, penceredeki içerik görünümü hiyerarşilerini yükleme ve kaldırma ile ücretlendirilir. İçerik görünümü hiyerarşisindeki bir görünümde önemli bir şey olduğunda, işletim sistemi görüntüleme yaşam döngüsünün olayları aracılığıyla görünüm denetleyicisine bildirir. Görüntüleme yaşam döngüsünün yöntemlerini geçersiz kılarak ekrandaki nesnelerle etkileşim kurabilir ve dinamik, yanıt veren bir kullanıcı arabirimi oluşturabilirsiniz.
Bunlar temel yaşam döngüsü yöntemleri ve işlevleri şunlardır:
- Viewdıdload -görünüm denetleyicisi Içerik görünümü hiyerarşisini belleğe yüklediğinde bir kez çağırılır. Bu, ilk kurulum yapmak için iyi bir yerdir çünkü bu, önce alt görünümlerin kodda kullanılabilir hale gelir.
- Viewwillappear -bir görünüm denetleyicisinin görünümü bir Içerik görünümü hiyerarşisine eklenmek üzere olduğunda ve ekranda gözükmesi durumunda çağırılır.
- Bir görünüm denetleyicinin görünümü bir Içerik görünümü hiyerarşisinden kaldırılacak ve ekrandan kaybolduğu her seferinde Viewwillkayboluyor -çağırılır. Bu yaşam döngüsü olayı Temizleme ve kaydetme durumu için kullanılır.
- Bir görünüm eklendiğinde veya Içerik görünümü hiyerarşisine kaldırıldığında, Viewdidappear ve Viewdıdkaybolması
Özel kod yaşam döngüsünün herhangi bir aşamasına eklendiğinde, bu yaşam döngüsü yönteminin temel uygulamasınıngeçersiz kılınmasıgerekir. Bu, bir kod zaten eklenmiş olan mevcut yaşam döngüsü yöntemine dokunarak ve ek kodla genişleterek elde edilir. Temel uygulama, ilk kodun yeni koddan önce çalıştığından emin olmak için yönteminin içinden çağrılır. Bir sonraki bölümde bunun bir örneği gösterilmiştir.
Görünüm denetleyicileriyle çalışma hakkında daha fazla bilgi için, iOS için Apple 'ın Görünüm denetleyicisi programlama kılavuzuna ve UIViewController başvurusunabakın.
Kullanıcı etkileşimine yanıt verme
Görünüm denetleyicisinin en önemli rolü, düğme basma, gezinme ve daha fazlası gibi kullanıcı etkileşimine yanıt verir. Kullanıcı etkileşimini işlemenin en kolay yolu, Kullanıcı girişini dinlemek ve girişe yanıt vermek için bir olay işleyicisi iliştirmek üzere bir denetim kullanmaktır. Örneğin, bir düğme, Phoneword uygulamasında gösterildiği gibi dokunma olayına yanıt verecek şekilde kablolu olabilir.
Bunun nasıl çalıştığını keşfedelim.
Phoneword_iOSProjesinde, Içerik görünümü hiyerarşisine çağrılan bir düğme eklenmiştir TranslateButton :
Xcode Interface Builder kullanılarak başvuran bir çıkış oluşturulduğunda, Xcode Sync onu otomatik olarak ViewController. Designer. csiçindeki bir denetimle eşleyerek, sınıfının içinde kullanılabilir hale getirir ViewController . Denetimler ilk olarak ViewDidLoad Görünüm yaşam döngüsünün aşamasında kullanıma sunulmuştur. bu nedenle, kullanıcının Touch 'a yanıt vermek için bu yaşam döngüsü yöntemi kullanılır:
public override void ViewDidLoad ()
{
base.ViewDidLoad ();
// wire up TranslateButton here
}
Phoneword uygulaması, kullanıcının Touch ' i dinlemek için çağrılan bir dokunmatik olay kullanır TouchUpInside . TouchUpInside denetimin sınırları içinde bir dokunma aşağı (ekrana parmak izi) izleyen bir rötuş olayını dinler (ekranda parmak çıkarma). ' Nin tersi, TouchUpInsideTouchDown Kullanıcı bir denetimde bir denetimin üzerine geldiğinde harekete geçecek olaydır. TouchDownOlay çok sayıda gürültü yakalar ve Kullanıcı, parmak izi denetimin dışına kaydırarak dokunma işlemini iptal etme seçeneği sunar. TouchUpInside bir TouchUpInside dokunarak yanıt almanın en yaygın yoludur ve kullanıcının bir düğmeye basıldığında beklediği deneyimi oluşturur. Bu konuda daha fazla bilgi Apple 'ın IOS ınsan arabirimi yönergelerinegöre sunulmaktadır.
Uygulama TouchUpInside olayı lambda ile işledi, ancak bir temsilci veya adlandırılmış olay işleyicisi de kullanılmış olabilir. Son düğme kodu aşağıdakilere benzer:
public override void ViewDidLoad ()
{
base.ViewDidLoad ();
string translatedNumber = "";
TranslateButton.TouchUpInside += (object sender, EventArgs e) => {
translatedNumber = Core.PhonewordTranslator.ToNumber(PhoneNumberText.Text);
PhoneNumberText.ResignFirstResponder ();
if (translatedNumber == "") {
CallButton.SetTitle ("Call", UIControlState.Normal);
CallButton.Enabled = false;
} else {
CallButton.SetTitle ("Call " + translatedNumber, UIControlState.Normal);
CallButton.Enabled = true;
}
};
}
Phoneword 'de tanıtılan ek kavramlar
Phoneword uygulaması, bu kılavuzda kapsanmayan birkaç kavram sunmuştur. Bu kavramlar şunlardır:
Düğme metnini Değiştir – phoneword uygulaması, düğme üzerinde arayarak ve yeni metni ve düğmenindenetim durumunugeçirerek bir düğmenin metninin nasıl değiştirileceğini gösteren bir. Örneğin, aşağıdaki kod CallButton metnini "Call" olarak değiştirir:
CallButton.SetTitle ("Call", UIControlState.Normal);Düğme etkinleştir ve devre dışı bırak – düğmeler bir veya durumunda olabilir. Devre dışı bir düğme Kullanıcı girişine yanıt vermez. Örneğin, aşağıdaki kod şunları devre dışı bırakır
CallButton:CallButton.Enabled = false;Düğmeler hakkında daha fazla bilgi için düğmeler kılavuzuna bakın.
Klavyeyi kapat – Kullanıcı metin alanına dokunduğunda, iOS kullanıcının giriş girmelerini sağlamak için klavyeyi görüntüler. Ne yazık ki, klavyeyi kapatmak için yerleşik bir işlev yoktur.
TranslateButtonKullanıcı öğesine bastığında Klavyeyi kapatmak için aşağıdaki kod öğesine eklenirTranslateButton:PhoneNumberText.ResignFirstResponder ();Klavyenin eksik olduğu başka bir örnek için, klavye tarifesine kapatma bölümüne bakın.
URL ile Telefon çağrısı yerleştir – phoneword uygulamasında, sistem telefon uygulamasını başlatmak için bir Apple URL şeması kullanılır. Özel URL şeması, aşağıdaki kodla gösterildiği gibi bir "Tel:" öneki ve çevrilmiş telefon numarasından oluşur:
var url = new NSUrl ("tel:" + translatedNumber); if (!UIApplication.SharedApplication.OpenUrl (url)) { // show alert Controller }Uyarı göster – Kullanıcı, çağrı desteklemeyen bir cihaza telefon araması yerleştirmeyi denediğinde (örneğin simülatör veya bir iPod Touch), kullanıcının telefon araması yerleştirilebileceğini bilmesini sağlamak için bir uyarı iletişim kutusu görüntülenir. Aşağıdaki kod bir uyarı denetleyicisi oluşturur ve doldurur:
if (!UIApplication.SharedApplication.OpenUrl (url)) { var alert = UIAlertController.Create ("Not supported", "Scheme 'tel:' is not supported on this device", UIAlertControllerStyle.Alert); alert.AddAction (UIAlertAction.Create ("Ok", UIAlertActionStyle.Default, null)); PresentViewController (alert, true, null); }İOS uyarı görünümleri hakkında daha fazla bilgi için, Uyarı denetleyicisi tarifi' ne bakın.
Test, dağıtım ve son dokunuşları
hem Mac için Visual Studio hem de Visual Studio, bir uygulamayı test etmek ve dağıtmak için birçok seçenek sağlar. Bu bölümde hata ayıklama seçenekleri ele alınmaktadır, cihazdaki uygulamaları test eden ve özel uygulama simgeleri oluşturma ve görüntüleri başlatma araçları tanıtılmaktadır.
Hata ayıklama araçları
Bazen uygulama kodundaki sorunların tanılanması zordur. Karmaşık kod sorunlarını tanılamaya yardımcı olmak için bir kesme noktası, kod adım adımveya çıktı bilgilerini günlük penceresineayarlayabilirsiniz.
Cihaza dağıtma
İOS simülatörü, uygulamayı test etmenin hızlı bir yoludur. Simülatör, test için, sahte konum, hareket benzetimive daha fazlasını içeren çeşitli yararlı iyileştirmeler içerir. Ancak, kullanıcılar son uygulamayı bir Benzetici içinde tüketmez. Tüm uygulamalar gerçek cihazlarda erken ve sık test edilmelidir.
Bir cihazın sağlanması zaman alır ve bir Apple geliştirici hesabı gerektirir. Cihaz sağlama Kılavuzu, bir cihazı geliştirmeye hazırlayarak ilgili kapsamlı yönergeler sağlar.
Not
Apple 'dan bir gereksinim nedeniyle, bir fiziksel cihaz veya simülatör için kodunuzu derlemek üzere bir geliştirme sertifikası veya imzalama kimliği olması gerekir. Bunu ayarlamak için cihaz sağlama kılavuzundaki adımları izleyin.
Cihaz sağlandıktan sonra, içine bağlanarak dağıtabilirsiniz, derleme araç çubuğundaki hedefi iOS cihazına değiştirebilir ve aşağıdaki ekran görüntüsünde gösterildiği gibi Başlat ( Yürüt) düğmesine basabilirsiniz:


Uygulama iOS cihazına dağıtılacak:
Özel simgeler oluşturma ve görüntüleri başlatma
Herkesin, bir uygulamanın öne çıkmasını gerektiren özel simgeleri ve başlatma görüntülerini oluşturmak için kullanılabilir bir tasarlayıcısı yoktur. Özel uygulama resmi oluşturmaya yönelik birkaç alternatif yaklaşım aşağıda verilmiştir:
- Pixelmator : Mac için $30 ile ilgili çok yönlü bir görüntü düzenleyici uygulaması.
- Fiverr : $5 ' den başlayarak, sizin için bir simge kümesi oluşturmak üzere çeşitli tasarımcılardan seçim yapın. Hareket halindeyken tasarlanan simgelere ihtiyacınız varsa, bu, iyi bir kaynak olabilir.
- Visual Studio – bunu, doğrudan ıde 'de uygulamanız için basit bir simge kümesi oluşturmak için kullanabilirsiniz.
- Fiverr : $5 ' den başlayarak, sizin için bir simge kümesi oluşturmak üzere çeşitli tasarımcılardan seçim yapın. Hareket halindeyken tasarlanan simgelere ihtiyacınız varsa, bu, iyi bir kaynak olabilir.
Simge ve başlatma görüntü boyutları ve gereksinimleri hakkında daha fazla bilgi için görüntülerle çalışma kılavuzu kılavuzunabakın.
Özet
Tebrikler! Artık bir Xamarin. iOS uygulamasının bileşenlerinin yanı sıra bunları oluşturmak için kullanılan araçları da sorunsuz bir şekilde anlayacaksınız. Başlarken serisinde bulunan bir sonraki öğreticide, uygulamamızı birden çok ekranı işleyecek şekilde genişleteceksiniz. Bir gezinti denetleyicisi uygulamanıza, film şeridi segues hakkında bilgi edinin ve uygulamanızı birden çok ekranı işleyecek şekilde genişletirken model, görünüm, denetleyici (MVC) modelini tanıtın.


