Mobil Programlama

iOS

Uzaktaki Bir Sunucuya Bağlanmak

Lisans: Creative Commons 11.12.2020 tarihinde güncellendi
Bakabileceğiniz Etiketler: Eğitmen: Geleceği Yazanlar Ekibi

Mobil uygulamaların büyük bir çoğunluğu akıllı telefonlar üzerindeki internet bağlantısını kullanarak bir sunucu üzerindeki veriyi ekrana getirir ya da kullanıcıdan aldığı veriyi bir sunucuya taşır. Bugün AppStore’da yer alan iOS uygulamalarının büyük bir çoğunluğu çeşitli web servislerine bağlanarak veri çeker ya da veri gönderir. Bu bölümde de sizlere NSURLConnection yardımıyla uzaktaki bir sunucudan nasıl veri çekebileceğinizi göstereceğiz:

Öncelikle bağlantı sonrası elde edilecek veriyi tutabilmek için NSMutableData sınıfından bir değişkene ihtiyacımız vardır. Web sunucusuna bağlantı açılıp veri çekilmeye başladığında elde edilen veri bu değişkende toplanacaktır.

 

@interface ViewController : UIViewController
{
    NSMutableData *receivedData;
}
- (void) loadAPI;

 

receivedData adlı değişken loadAPI fonksiyonu bağlantıyı başlattığında elde edilen veriyi tutar. Şimdi ise bir bağlantıyı nasıl başlattığımızı inceleyelim;

 

- (void) loadAPI
{
    NSURLRequest *theRequest = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.turkcell.com.tr"]
        cachePolicy:NSURLRequestUseProtocolCachePolicy
        timeoutInterval:60.0];
    NSURLConnection *theConnection = [[NSURLConnection alloc] initWithRequest:theRequest delegate:self];
    if (theConnection)
    {
        receivedData = [NSMutableData data];
    }
    else
    {
        NSLog(@"Bağlantı hatası!");
    }
}

 

NSURLRequest yapılacak istekle ilgili bilgileri içermektedir. Burada yapılan işlem http://www.turkcell.com.tr adresinin bize vereceği cevabı almak olacaktır. cachePolicy seçeneği isteğe verilen cevabın cihazda nasıl saklanacağı ile ilgilidir. Burada kullanabileceğiniz değerler;

NSURLRequestUseProtocolCachePolicy: Yapılan istekte kullanılan protokolün saklama kurallarını uygular.

NSURLRequestReloadIgnoringLocalCacheData: Eğer cihazda bu istekle ilgili önceden saklanan bir veri varsa bunu görmezden gelir.

NSURLRequestReloadIgnoringLocalAndRemoteCacheData: Eğer cihazda ya da uzaktaki sunucuda bu istekle ilgili önceden saklanan bir veri varsa bunu görmezden gelir.

NSURLRequestReturnCacheDataElseLoad: Eğer cihazda bu istekle ilgili önceden bir veri varsa bunu kullanır, yoksa uzaktaki sunucunun cevabı kullanılır.

NSURLRequestReturnCacheDataDontLoad: Eğer cihazda bu istekle ilgili önceden bir veri varsa bunu kullanır, yoksa bağlantı başarısız kabul edilir. Çevrimdışı durumu kabul edilir.

NSURLRequestReloadRevalidatingCacheData: Öncelikle istekle ilgili cihazdaki verinin doğruluğu kontrol edilir, daha sonra uzaktaki sunucunun cevabı işlenir.

timeoutInterval değeri ise bağlantının başarısız kabul edileceği süreyi belirtir. Bu örnekte 60 saniye içinde cevap alınmazsa bağlantı başarısız kabul edilecektir. NSURLRequest oluşturulduktan sonra NSURLConnection ile bağlantı başlatılır. Bağlantının cevabı temsilci (delegate) metotları içerisinde işlenecektir. Bu yüzden aşağıdaki temsilci metotlarının kullanılması gereklidir. Eğer bağlantı başarılı bir şekilde başlamışsa receivedData değişkeni oluşturulur ve sunucudan gelen cevap beklenir.

 

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
    [receivedData setLength:0];
}
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
    [receivedData appendData:data];
}
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
    NSLog(@"Bir hata oluştu : %@", [error localizedDescription]);
}
- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
    NSLog(@"Cevap : %@",[[NSString alloc] initWithData:receivedData encoding:NSUTF8StringEncoding]);
}

 

Buradaki metotları açıklarsak;

didReceiveResponse: Bu metot karşıdaki sunucudan cevap geldiğini gösterir. Burada alınan veri uzunluğu sıfırdır.

didReceiveData: Bu metot karşıdan veri geldiğini belirtir. Burada alınan verinin receivedData değişkeni içerisinde saklanması gereklidir. appendData metodu ile uzak sunucudan gelen veri receivedData içerisine yazılır.

didFailWithError: Eğer bağlantı sırasında herhangi bir sorun oluşursa bu metot içerisinde sorunun kaynağı öğrenilebilir.

connectionDidFinishLoading: Bu metotta bağlantı sonlandırılır. Bu noktada alınan bütün veri receivedData içerisine yazılmıştır.

Bu noktadan sonra NSData sınıfında tutulan veri istenilen formata çevirilebilir. Eğer bir resim dosyası yüklediyseniz UIImage sınıfına çevirebilir ya da dosya yüklediyseniz diske yazabilirsiniz. Biz burada http://www.turkcell.com.tr adresinde yer alan HTML içeriği çektiğimizden receivedData içerisinde yer alan veriyi bir NSString sınıfına dönüştürüyoruz. NSLog ile konsola baktığımızda yanıtı göreceğiz.

 

Cevabın loglarda görüntülenmesi

Eğer block kullanarak asenkron bir bağlantı açmak isterseniz iOS5 ve üzeri sistemlerde kullanılan aşağıdaki metottan faydalanabilirsiniz;

 

NSURLRequest *theRequest = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.turkcell.com.tr"]
    cachePolicy:NSURLRequestUseProtocolCachePolicy
    timeoutInterval:60.0];
[NSURLConnection sendAsynchronousRequest:theRequest queue:[NSOperationQueue mainQueue]
    completionHandler:^(NSURLResponse *response, NSData *data, NSError *error)
{
    NSLog(@"Cevap : %@",[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);
}];

 

NSURLConnection içerisinde gelen sendAsynchronousRequest metodu ile bağlantıyı daha az karmaşık bir şekilde  başlatmanız mümkündür. Burada yine daha önceki örnekte olduğu gibi bir NSURLRequest ile istek oluşturup bağlantı açarsınız. queue ile isteklerin sıralanacağı bir kuyruk belirtebilirsiniz. completionHandler içerisinde yer alan blok bağlantı tamamlandığında karşıdan gelen cevapla ilgili NSURLResponse sınıfından bir değişken ve bağlantı sonucunun tutulduğu NSData sınıfından bir veri içerir. Oluşan hatalar da yine daha önce olduğu gibi NSError sınıfından bir değişken ile kullanıcıya bildirilir.

İPUCU : Bağlantıları daha kolay yönetebilmek için internet üzerinde hazır projeler mevcuttur. Dilerseniz AFNetworking ve ASIHTTPRequest projelerine göz atabilirsiniz. AFNetworking sürekli güncel tutulan ve önerilen bir çalışmadır.