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.
- 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
- 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.
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.
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>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.
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.
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:
| Özellik | UIImagePickerController | PHPickerViewController | SwiftUI PhotosPicker |
|---|---|---|---|
| Desteklenen iOS | iOS 2.0+ | iOS 14.0+ | iOS 16.0+ |
| Gerekli İzin | Kamera/Galeri İzni Şart | İzin Gerekmez (Gizlilik Dostu) | İzin Gerekmez |
| Çoklu Seçim | Desteklemez | Destekler (Sınırsız) | Destekler |
| Performans | Orta | Yü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.
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
}
}
}
}
}
}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.
- 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?
- Info.plist dosyasında kamera erişimi gerekçesini tanımlamak için kullanılan özel anahtar (key) adı nedir?
- Xcode simülatöründe kamera kodları test edilirken neden cihaz kontrolü (`isSourceTypeAvailable`) yapılmalıdır?
- SwiftUI’da iOS 16+ ile gelen ve galeriden medya seçmeye yarayan bildirimsel bileşenin adı nedir?
- 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
- 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


