Mobil Uygulama Geliştirme

iOS Uygulamalarında Swift ile Kamera ve Galeri Erişimi Örnekleri

iOS uygulamalarında Swift ile kamera ve galeri erişimi örnekleri, mobil uygulama geliştiricilerinin kullanıcıdan görsel veri toplamasını; profil fotoğrafı yükleme, medya paylaşımı veya içerik işleme gibi senaryoları hayata geçirmesini sağlayan temel entegrasyon adımlarından biridir. iOS işletim sistemi, kullanıcı gizliliğini en üst düzeyde koruyacak şekilde tasarlandığı için kamera ve fotoğraf kitaplığına erişim süreçleri, özel güvenlik izinleri ve modern kütüphaneler aracılığıyla yönetilir.

⚡ Kısa Cevap: Swift ile kamera ve galeriye erişim sağlamak amacıyla ilk olarak Info.plist dosyasına NSCameraUsageDescription ve NSPhotoLibraryUsageDescription izin anahtarları eklenmelidir. Cihaz kamerasıyla fotoğraf çekmek için UIImagePickerController, modern galeri erişimi ve fotoğraf seçimi için ise PhotosUI çatısı altındaki PHPickerViewController ya da SwiftUI tarafında PhotosPicker kullanılır.
🎯 Bu Derste Öğrenecekleriniz
  • iOS gizlilik politikalarına uygun şekilde Info.plist dosyasında izin tanımlamayı
  • UIImagePickerController kullanarak doğrudan cihaz kamerasından fotoğraf çekmeyi
  • PHPickerViewController ile galeriden tekli veya çoklu fotoğraf seçmeyi
  • SwiftUI ortamında PhotosPicker ile modern medya erişimi sağlamayı
  • Kamera ve galeri entegrasyonlarında sık karşılaşılan hataları çözmeyi
📌 Bu Konuda Bilmeniz Gerekenler
  • iOS 14 ve sonrasında galeri erişimi için gizlilik dostu PHPickerViewController tercih edilmelidir.
  • Kamera veya galeriye izinsiz erişim denemeleri uygulamanın anında çökmesine (crash) neden olur.
  • Xcode simülatöründe fiziksel kamera donanımı bulunmadığı için kamera testleri gerçek cihazda yapılmalıdır.
  • Apple App Store incelemelerinde izin gerekçelerinin net açıklanması şarttır.

iOS Kamera ve Galeri Erişiminin Temelleri ve Gizlilik Yapısı

Mobil geliştirme dünyasında kullanıcı deneyimini zenginleştiren en kritik unsurlardan biri cihaz donanımlarına erişebilmektir. Ne var ki kullanıcıların kişisel verilerini güvenceye almak Apple için her zaman birinci önceliktir. Bu doğrultuda cihazın kamerasına veya fotoğraf galerisine erişim gerektiğinde, kullanıcının açık rızasını almak zorunlu kılınmıştır.

Apple, yayınladığı iOS güncellemeleriyle medya erişim modellerini sürekli iyileştirmektedir. Geçmişte tüm galeriye erişim izni talep edilirken, günümüzde kullanıcıların yalnızca belirledikleri fotoğrafları uygulamayla paylaşmasına imkan tanıyan kısıtlı erişim modelleri ön plana çıkmaktadır. Swift programlama dili sayesinde bu süreçleri kontrol etmek son derece pratiktir.

💡 İpucu: Kullanıcıdan izin isterken açıklama metninizi oldukça net kurgulayın. ‘Fotoğraf seçmek için izin gerekiyor’ gibi genel kalıplar yerine ‘Profil fotoğrafınızı güncellemek için galerinize erişmemiz gerekiyor’ şeklinde spesifik nedenler belirtmek izin onay oranlarını belirgin biçimde artırır.

1. Adım: Info.plist Dosyasında İzin Tanımlamaları

iOS uygulamanızda kamera veya galeri kodlarını çalıştırmadan önce, uygulamanın bu donanımlara neden ihtiyaç duyduğunu Apple sistemine bildirmeniz zorunludur. Söz konusu bildirim işlemi Info.plist (Information Property List) dosyası üzerinden gerçekleştirilir.

Gerekli izin anahtarlarını tanımlamadan kamera veya galeriyi açmaya çalışırsanız, uygulamanız çalışma zamanında (runtime) çökecek ve kullanıcıya kapanma hatası yaşatacaktır. Tanımlanması gereken temel anahtarlar şunlardır:

  • NSCameraUsageDescription: Kamerayı kullanma gerekçeniz.
  • NSPhotoLibraryUsageDescription: Fotoğraf galerisini okuma gerekçeniz.
  • NSPhotoLibraryAddUsageDescription: Galeriye yeni bir fotoğraf kaydetme gerekçeniz.
📖 Örnek: Info.plist XML İzin Kodları

Info.plist dosyanızı kaynak kod düzenleyici modunda açtığınızda eklemeniz gereken XML bloğu şu şekildedir:

<key>NSCameraUsageDescription</key>
<string>Fotoğraf çekip profilinize ekleyebilmeniz için kameranıza erişim istiyoruz.</string>
<key>NSPhotoLibraryUsageDescription</key>
<string>Galerinizdeki fotoğrafları seçip paylaşabilmeniz için galeri izni gerekmektedir.</string>
<key>NSPhotoLibraryAddUsageDescription</key>
<string>Çektiğiniz fotoğrafları galerinize kaydetmek için izin istiyoruz.</string>
⚠️ Dikkat: App Store inceleme ekibi, açıklama metni yetersiz, belirsiz veya boş olan uygulamaları doğrudan reddeder (Reject eder). Açıklamalarınız son derece açık ve anlaşılır olmalıdır.

2. Adım: UIImagePickerController ile Kameradan Fotoğraf Çekme

UIKit mimarisinde kamerayı başlatmak için kullanılan geleneksel ve son derece güvenilir yöntem UIImagePickerController sınıfından yararlanmaktır. Bu sınıf, cihazın yerel kamera arayüzünü uygulamanızın ekranında doğrudan açmanıza olanak tanır.

Kamera erişimi sürecinde sınıfınıza iki temel protokolü (delegate) adapte etmeniz gerekir: UIImagePickerControllerDelegate ve UINavigationControllerDelegate. Bu yapılar sayesinde kullanıcı fotoğraf çektiğinde veya çekimden vazgeçip iptal butonuna bastığında çalışacak mantıksal kodları tetikleyebilirsiniz.

📖 Örnek: Swift ile Kamera Açma ve Fotoğraf Yakalama

Aşağıdaki ViewController örneği, cihaz kamerasının kullanılabilirliğini denetledikten sonra kamerayı başlatır ve yakalanan fotoğrafı bir UIImageView bileşenine aktarır:

import UIKit
import AVFoundation

class CameraViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate {

    @IBOutlet weak var imageView: UIImageView!

    @IBAction func openCameraButtonTapped(_ sender: UIButton) {
        // Cihazda kamera var mı kontrol edilir (Simülatör kontrolü)
        if UIImagePickerController.isSourceTypeAvailable(.camera) {
            let imagePicker = UIImagePickerController()
            imagePicker.delegate = self
            imagePicker.sourceType = .camera
            imagePicker.allowsEditing = true // Kullanıcının fotoğrafı kırpmasına izin verir
            present(imagePicker, animated: true, completion: nil)
        } else {
            print("Kamera bu cihazda kullanılamıyor veya simülatör çalışıyor.")
        }
    }

    // Fotoğraf çekildiğinde çalışan delegate metodu
    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
        if let editedImage = info[.editedImage] as? UIImage {
            imageView.image = editedImage
        } else if let originalImage = info[.originalImage] as? UIImage {
            imageView.image = originalImage
        }
        
        picker.dismiss(animated: true, completion: nil)
    }

    // İptal edildiğinde çalışan delegate metodu
    func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
        picker.dismiss(animated: true, completion: nil)
    }
}

3. Adım: PHPickerViewController ile Modern Galeri Erişimi (iOS 14+)

Apple, iOS 14 sürümüyle birlikte galeri erişiminde çığır açan PHPickerViewController sınıfını kullanıma sundu. Geleneksel yöntemlerin aksine PHPicker, kullanıcının tüm fotoğraf kütüphanesine erişim izni vermesini şart koşmaz. Kullanıcı yalnızca seçtiği görsellerin uygulamaya aktarılmasına onay verir. Konuyu daha geniş bir perspektiften ele almak isteyen geliştiriciler için iOS Uygulama Geliştirme: Swift Dili ile Adım Adım Anlatım rehberi kapsamlı bir kaynak sunmaktadır.

Doğrudan PhotosUI modülü altında yer alan bu kütüphane; çoklu fotoğraf seçimi (multi-selection) ve medya türüne göre filtreleme (yalnızca video veya sadece fotoğraf gösterme) gibi gelişmiş imkanları kutudan çıktığı haliyle destekler.

📖 Örnek: PHPickerViewController Kullanımı

Galeriden tekli ya da birden fazla fotoğraf seçmek üzere izleyebileceğiniz modern yapı şu şekildedir:

import UIKit
import PhotosUI

class GalleryViewController: UIViewController, PHPickerViewControllerDelegate {

    @IBOutlet weak var selectedImageView: UIImageView!

    @IBAction func openGalleryButtonTapped(_ sender: UIButton) {
        var configuration = PHPickerConfiguration()
        configuration.filter = .images // Sadece fotoğrafları filtrele
        configuration.selectionLimit = 1 // 0 yapılırsa sınırsız seçim imkanı verir

        let picker = PHPickerViewController(configuration: configuration)
        picker.delegate = self
        present(picker, animated: true, completion: nil)
    }

    // PHPicker Delegate metodu
    func picker(_ picker: PHPickerViewController, didFinishPicking results: [PHPickerResult]) {
        picker.dismiss(animated: true, completion: nil)

        guard let itemProvider = results.first?.itemProvider else { return }

        if itemProvider.canLoadObject(ofClass: UIImage.self) {
            itemProvider.loadObject(ofClass: UIImage.self) { [weak self] (image, error) in
                if let selectedImage = image as? UIImage {
                    DispatchQueue.main.async {
                        self?.selectedImageView.image = selectedImage
                    }
                }
            }
        }
    }
}

Swift Kamera ve Galeri Yöntemleri Karşılaştırması

Aşağıdaki tablo, iOS geliştirmede tercih edilen farklı medya erişim yaklaşımlarının temel farklarını ve sunduğu avantajları özetlemektedir:

ÖzellikUIImagePickerControllerPHPickerViewControllerSwiftUI PhotosPicker
Desteklenen iOSiOS 2.0+iOS 14.0+iOS 16.0+
Gerekli İzinKamera/Galeri İzni Şartİzin Gerekmez (Gizlilik Dostu)İzin Gerekmez
Çoklu SeçimDesteklemezDestekler (Sınırsız)Destekler
PerformansOrtaYüksekÇok Yüksek

SwiftUI ile Modern PhotosPicker Kullanımı

Uygulamanızı SwiftUI ile geliştiriyorsanız, iOS 16 ile birlikte sunulan PhotosPicker bileşeni geliştirme sürecini son derece pratik hâle getirir. Karmaşık delegate yapılarına ihtiyaç duymadan, bildirimsel (declarative) kod yaklaşımıyla galeriden kolayca fotoğraf seçebilirsiniz.

Aşağıdaki SwiftUI örneği, modern galeri erişiminin nasıl yapılandırılacağını göstermektedir; ayrıca Nesne Yönelimli Programlama Prensipleri ve Mobil Kodlama Örnekleri başlıklı rehberimiz de bu tür mimari yapıların pratikteki kullanımına ışık tutmaktadır.

📖 Örnek: SwiftUI PhotosPicker Kod Bloğu

SwiftUI projelerinde galeri erişimini sağlayan yalın bir View örneği:

import SwiftUI
import PhotosUI

struct ProfilePhotoPickerView: View {
    @State private var selectedItem: PhotosPickerItem? = nil
    @State private var selectedImage: UIImage? = nil

    var body: some View {
        VStack(spacing: 20) {
            if let selectedImage {
                Image(uiImage: selectedImage)
                    .resizable()
                    .scaledToFit()
                    .frame(width: 200, height: 200)
                    .clipShape(Circle())
            } else {
                Image(systemName: "person.circle.fill")
                    .resizable()
                    .frame(width: 150, height: 150)
                    .foregroundColor(.gray)
            }

            PhotosPicker(selection: $selectedItem, matching: .images) {
                Label("Galeriden Fotoğraf Seç", systemImage: "photo")
                    .font(.headline)
                    .padding()
                    .background(Color.blue)
                    .foregroundColor(.white)
                    .cornerRadius(10)
            }
            .onChange(of: selectedItem) { newItem in
                Task {
                    if let data = try? await newItem?.loadTransferable(type: Data.self),
                       let image = UIImage(data: data) {
                        selectedImage = image
                    }
                }
            }
        }
    }
}
ℹ️ Bilgi: SwiftUI PhotosPicker arka planda otomatik olarak PHPickerViewController altyapısını çalıştırır. Bu sayede geliştiriciler fazladan gizlilik izni süreçleriyle vakit kaybetmeden güvenli medya aktarımı sağlar.

Kamera ve Galeri Erişiminde Sık Yapılan Hatalar ve Çözümleri

iOS projelerinde medya erişimini kodlarken sıklıkla karşılaşılan hatalar ve bunların pratik çözüm yolları mevcuttur. Kodlama sürecinde karşılaşabileceğiniz bu tür mantıksal aksaklıkları daha rahat çözebilmek adına Temel Programlama Mantığı ve Mobil Algoritma Örnekleri içeriğimizi incelemek de faydalı olacaktır.

  • Simülatörde Kamerayı Test Etmeye Çalışmak: Xcode simülatör ortamında fiziksel kamera sensörü yer almaz. UIImagePickerController.isSourceTypeAvailable(.camera) denetimi yapmadan kamera başlatılmaya çalışılırsa uygulama çökecektir. Kamera testlerinin her zaman gerçek bir iPhone üzerinde yürütülmesi gerekir.
  • Info.plist İzinlerini Unutmak: `NSCameraUsageDescription` anahtarı tanımlanmadığında uygulama doğrudan kapanır ve konsolda `This app has crashed because it attempted to access privacy-sensitive data without a usage description` uyarısı belirir.
  • Arka Planda UI Güncellemek: Galeri veya kameradan dönen resmi `UIImageView` üzerine aktarırken kodun ana iş parçacığında (Main Thread) çalıştığından emin olunmalıdır (`DispatchQueue.main.async`).
  • Kullanıcı İzni Reddettiğinde Süreci Yönetememek: Kullanıcı kameraya ilk açılışta onay vermezse, buton tekrar tetiklendiğinde sistem otomatik izin iletişim kutusunu yeniden göstermez. Bu durumda kullanıcıyı doğrudan uygulama ayarlarına (`UIApplication.openSettingsURLString`) yönlendirecek bir yapı kurulmalıdır.
✏️ Kendinizi Test Edin
  1. iOS 14 ve sonrasında kullanıcıdan tüm galeriye erişim izni istemeden fotoğraf seçmeyi sağlayan modern sınıf hangisidir?
  2. Info.plist dosyasında kamera erişimi gerekçesini tanımlamak için kullanılan özel anahtar (key) adı nedir?
  3. Xcode simülatöründe kamera kodları test edilirken neden cihaz kontrolü (`isSourceTypeAvailable`) yapılmalıdır?
  4. SwiftUI’da iOS 16+ ile gelen ve galeriden medya seçmeye yarayan bildirimsel bileşenin adı nedir?
📝 Konu Özeti
  • Swift ile kamera kullanımı için `UIImagePickerController`, modern galeri seçimi için `PHPickerViewController` tercih edilir.
  • Proje ayarlarında Info.plist dosyasına gizlilik gerekçeleri (`NSCameraUsageDescription`, `NSPhotoLibraryUsageDescription`) mutlaka eklenmelidir.
  • SwiftUI tarafında `PhotosPicker` kullanarak birkaç satır kodla galeri entegrasyonu sağlanabilir.
  • Asenkron resim yükleme işlemlerinde arayüz güncellemeleri daima `Main Thread` üzerinde gerçekleştirilmelidir.

Öğrendiklerinizi Uygulamaya Geçirin

Swift ile kamera ve galeri erişiminin temel esaslarını adım adım inceledik. Şimdi yapmanız gereken, Xcode üzerinde yeni bir proje başlatarak bu kod örneklerini bizzat uygulamaktır. Bir profil fotoğrafı güncelleme ekranı tasarlayarak hem kameradan anlık fotoğraf çekme hem de galeriden görsel seçme senaryolarını tek projede pratik edebilirsiniz.

Sıkça Sorulan Sorular

❓ Swift'te kameraya nasıl erişilir?
Swift'te kameraya erişmek için önce Info.plist dosyasına NSCameraUsageDescription izin anahtarı eklenir. Ardından UIImagePickerController sınıfından bir nesne oluşturularak sourceType değeri .camera olarak ayarlanır ve present metoduyla ekrana sunulur.
❓ Info.plist dosyasına kamera izni nasıl eklenir?
Info.plist dosyasını açıp yeni bir alan ekleyerek 'Privacy – Camera Usage Description' (NSCameraUsageDescription) anahtarını seçmelisiniz. Değer kısmına ise kullanıcının göreceği açıklama metnini yazmanız gerekir.
❓ PHPickerViewController nedir ve UIImagePickerController'dan farkı nedir?
PHPickerViewController, iOS 14 ile gelen modern galeri seçicisidir. UIImagePickerController'dan farklı olarak kullanıcıdan tüm galeri erişim izni istemez, çoklu fotoğraf seçimini destekler ve daha yüksek gizlilik sunar.
❓ iOS simülatöründe kamera neden çalışmaz?
Xcode iOS simülatöründe fiziksel bir kamera donanımı bulunmaz. Bu nedenle kamera kodları çalıştırıldığında simülatör hata verir veya çökebilir. Kamera testlerinin gerçek bir iOS cihazında yapılması gerekmektedir.
❓ iOS uygulamasında galeriden birden fazla fotoğraf nasıl seçilir?
PHPickerViewController kullanarak PHPickerConfiguration nesnesinin selectionLimit özelliğini 0 (sınırsız) veya istediğiniz bir sayıya ayarlayarak galeriden çoklu fotoğraf seçimi yapabilirsiniz.
❓ Swift ile çekilen fotoğraf galeriye nasıl kaydedilir?
Çekilen bir UIImage nesnesini cihazın fotoğraf galerisine kaydetmek için 'UIImageWriteToSavedPhotosAlbum' fonksiyonu kullanılır. Bu işlem için Info.plist dosyasına NSPhotoLibraryAddUsageDescription izni eklenmelidir.
❓ Kamera izni reddedilirse kullanıcı ayarlara nasıl yönlendirilir?
Kullanıcı izin vermediyse UIApplication.shared.open(URL(string: UIApplication.openSettingsURLString)!) kodu çalıştırılarak kullanıcı doğrudan uygulamanın cihaz ayarlarındaki izin sayfasına yönlendirilebilir.
❓ SwiftUI ile galeriden fotoğraf nasıl seçilir?
SwiftUI ortamında iOS 16 ve üzeri sürümlerde PhotosUI modülü içindeki 'PhotosPicker' bileşeni kullanılarak declarative yapıda kolayca fotoğraf seçimi gerçekleştirilebilir.
📚 Kaynaklar
  • Apple Developer Documentation – UIImagePickerController — iOS UIKit kamera ve dahili galeri arayüz yönetim belgelendirmesi
  • Apple Developer Documentation – PhotosUI and PHPicker — Modern iOS gizlilik odaklı fotoğraf seçici kütüphane dokümantasyonu

Deniz Karay

DersMerkezi.net.tr’nin yazarı, eğitim alanında yıllara dayanan deneyime sahip bir uzmandır ve öğrencilerin öğrenme sürecini desteklemeyi hedefler. Matematik, fen bilimleri, tarih, dil ve edebiyat başta olmak üzere birçok ders alanında içerik üretir ve konuları sade, anlaşılır ve adım adım rehberler halinde sunar.

İlgili Makaleler

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Başa dön tuşu