# AI-Powered iOS Uygulama Ozellikleri: Akilli Uygulamalar Gelistirme
Yapay zeka, iOS uygulamalarinda kullanici deneyimini donusturuyor. Akilli arama, kisisellestirilmis oneriler, otomatik fotograf duzenleme, ses tanima ve daha fazlasi — bunlarin hepsi Apple'in ML framework'leri ile mumkun. Bu rehberde, uygulamaniza ekleyebileceginiz AI-powered ozellikleri pratik orneklerle inceleyecegiz.
"En iyi AI, kullanicinin fark etmedigi AI'dir — her sey sadece sihirli bir sekilde calisir." — Apple HIG
Icindekiler
- AI-Powered Ozellik Haritasi
- Akilli Arama ve Oneri
- Goruntu Analizi ve Duzenleme
- Ses Tanima ve Transcription
- Kisisellestirilmis Deneyim
- Anomali Tespiti
- On-Device Training
- Privacy-First AI Tasarimi
- Okuyucu Odulu
- Sonuc
1. AI-Powered Ozellik Haritasi
Ozellik | Framework | Zorluk | Kullanici Etkisi |
|---|---|---|---|
Akilli Arama | NaturalLanguage + Core ML | Orta | Yuksek |
Oneri Sistemi | Create ML Recommendation | Orta | Cok Yuksek |
Goruntu Siniflandirma | Vision + Core ML | Dusuk | Yuksek |
OCR / Metin Tanima | Vision | Dusuk | Orta |
Ses Tanima | Speech Framework | Dusuk | Yuksek |
Duygu Analizi | NaturalLanguage | Dusuk | Orta |
Anomali Tespiti | Custom Core ML | Yuksek | Yuksek |
Yuz Filtreleri | Vision + Core Image | Orta | Cok Yuksek |
Aktivite Tanima | Core Motion + ML | Orta | Orta |
Tahminsel Oneri | On-Device Training | Yuksek | Cok Yuksek |
2. Akilli Arama ve Oneri Sistemi
Geleneksel arama "contains" kontrolu yapar. AI-powered arama ise anlam ve baglam anlayarak sonuc dondurur.
swift
1import NaturalLanguage2import CoreML3 4class SmartSearchEngine {5 private let embedding: NLEmbedding?6 private let tagger: NLTagger7 private var searchIndex: [(String, [Double])] = []8 9 init() {10 self.embedding = NLEmbedding.wordEmbedding(for: .turkish)11 self.tagger = NLTagger(tagSchemes: [.lemma, .nameType])12 }13 14 // Icerik indexleme15 func indexContent(_ items: [SearchableItem]) {16 searchIndex = items.compactMap { item in17 guard let vector = computeDocumentVector(item.text) else {18 return nil19 }20 return (item.id, vector)21 }22 }23 24 // Semantik arama25 func search(query: String, limit: Int = 10) -> [SearchResult] {26 // 1. Query'yi lemmatize et27 let lemmatized = lemmatize(query)28 29 // 2. Query vektorunu hesapla30 guard let queryVector = computeDocumentVector(lemmatized) else {31 return []32 }33 34 // 3. Cosine similarity ile siralama35 var results: [SearchResult] = searchIndex.compactMap { (id, docVector) in36 let similarity = cosineSimilarity(queryVector, docVector)37 return SearchResult(id: id, score: similarity)38 }39 40 results.sort { $0.score > $1.score }41 return Array(results.prefix(limit))42 }43 44 private func computeDocumentVector(_ text: String) -> [Double]? {45 guard let embedding = embedding else { return nil }46 47 let tokenizer = NLTokenizer(unit: .word)48 tokenizer.string = text49 50 var vectors: [[Double]] = []51 tokenizer.enumerateTokens(in: text.startIndex..<text.endIndex) { range, _ in52 let word = String(text[range]).lowercased()53 if let vector = embedding.vector(for: word) {54 vectors.append(vector.map { Double($0) })55 }56 return true57 }58 59 guard !vectors.isEmpty else { return nil }60 61 // Ortalama vektor62 let dim = vectors[0].count63 var avgVector = [Double](repeating: 0, count: dim)64 for vector in vectors {65 for i in 0..<dim {66 avgVector[i] += vector[i]67 }68 }69 let count = Double(vectors.count)70 return avgVector.map { $0 / count }71 }72 73 private func cosineSimilarity(_ a: [Double], _ b: [Double]) -> Double {74 guard a.count == b.count else { return 0 }75 var dot = 0.0, normA = 0.0, normB = 0.076 for i in 0..<a.count {77 dot += a[i] * b[i]78 normA += a[i] * a[i]79 normB += b[i] * b[i]80 }81 let denom = sqrt(normA) * sqrt(normB)82 return denom > 0 ? dot / denom : 083 }84 85 private func lemmatize(_ text: String) -> String {86 tagger.string = text87 var lemmas: [String] = []88 tagger.enumerateTags(89 in: text.startIndex..<text.endIndex,90 unit: .word,91 scheme: .lemma92 ) { tag, range in93 lemmas.append(tag?.rawValue ?? String(text[range]))94 return true95 }96 return lemmas.joined(separator: " ")97 }98}99 100struct SearchableItem {101 let id: String102 let text: String103}104 105struct SearchResult {106 let id: String107 let score: Double108}Easter Egg
Gizli bir bilgi buldun!
Bu bölümde gizli bir bilgi var. Keşfetmek ister misin?
3. Goruntu Analizi ve Akilli Duzenleme
Vision framework ile gorselleri otomatik analiz edip akilli duzenleme onerebilirsiniz.
swift
1import Vision2import CoreImage3 4class SmartPhotoEditor {5 6 // Goruntu analizi - sahne, yuz, metin tespiti7 func analyzeImage(_ image: CGImage) async throws -> ImageAnalysis {8 // Paralel olarak birden fazla analiz9 async let faces = detectFaces(image)10 async let texts = detectText(image)11 async let saliency = detectSaliency(image)12 13 return try await ImageAnalysis(14 faceCount: faces.count,15 hasText: !texts.isEmpty,16 saliencyMap: saliency,17 suggestedCrop: computeSmartCrop(saliency: saliency)18 )19 }20 21 private func detectFaces(_ image: CGImage) async throws -> [VNFaceObservation] {22 let request = VNDetectFaceRectanglesRequest()23 let handler = VNImageRequestHandler(cgImage: image)24 try handler.perform([request])25 return request.results ?? []26 }27 28 private func detectText(_ image: CGImage) async throws -> [VNRecognizedTextObservation] {29 let request = VNRecognizeTextRequest()30 request.recognitionLevel = .fast31 let handler = VNImageRequestHandler(cgImage: image)32 try handler.perform([request])33 return request.results ?? []34 }35 36 private func detectSaliency(_ image: CGImage) async throws -> VNSaliencyImageObservation? {37 let request = VNGenerateAttentionBasedSaliencyImageRequest()38 let handler = VNImageRequestHandler(cgImage: image)39 try handler.perform([request])40 return request.results?.first41 }42 43 private func computeSmartCrop(saliency: VNSaliencyImageObservation?) -> CGRect {44 guard let saliency = saliency,45 let salientObject = saliency.salientObjects?.first else {46 return CGRect(x: 0.1, y: 0.1, width: 0.8, height: 0.8)47 }48 return salientObject.boundingBox49 }50}51 52struct ImageAnalysis {53 let faceCount: Int54 let hasText: Bool55 let saliencyMap: VNSaliencyImageObservation?56 let suggestedCrop: CGRect57}4. Ses Tanima ve Transcription
swift
1import Speech2 3class SpeechRecognizer: ObservableObject {4 private let speechRecognizer: SFSpeechRecognizer?5 private var recognitionRequest: SFSpeechAudioBufferRecognitionRequest?6 private var recognitionTask: SFSpeechRecognitionTask?7 private let audioEngine = AVAudioEngine()8 9 @Published var transcribedText = ""10 @Published var isRecording = false11 12 init() {13 speechRecognizer = SFSpeechRecognizer(locale: Locale(identifier: "tr-TR"))14 }15 16 func startRecording() throws {17 // Onceki task'i iptal et18 recognitionTask?.cancel()19 recognitionTask = nil20 21 let audioSession = AVAudioSession.sharedInstance()22 try audioSession.setCategory(.record, mode: .measurement, options: .duckOthers)23 try audioSession.setActive(true, options: .notifyOthersOnDeactivation)24 25 recognitionRequest = SFSpeechAudioBufferRecognitionRequest()26 27 guard let recognitionRequest = recognitionRequest,28 let speechRecognizer = speechRecognizer else {29 return30 }31 32 recognitionRequest.shouldReportPartialResults = true33 34 // On-device tanima (iOS 13+)35 if speechRecognizer.supportsOnDeviceRecognition {36 recognitionRequest.requiresOnDeviceRecognition = true37 }38 39 recognitionTask = speechRecognizer.recognitionTask(40 with: recognitionRequest41 ) { [weak self] result, error in42 if let result = result {43 self?.transcribedText = result.bestTranscription.formattedString44 }45 46 if error != nil || (result?.isFinal ?? false) {47 self?.stopRecording()48 }49 }50 51 let inputNode = audioEngine.inputNode52 let recordingFormat = inputNode.outputFormat(forBus: 0)53 54 inputNode.installTap(onBus: 0, bufferSize: 1024, format: recordingFormat) {55 [weak self] buffer, _ in56 self?.recognitionRequest?.append(buffer)57 }58 59 audioEngine.prepare()60 try audioEngine.start()61 isRecording = true62 }63 64 func stopRecording() {65 audioEngine.stop()66 audioEngine.inputNode.removeTap(onBus: 0)67 recognitionRequest?.endAudio()68 recognitionRequest = nil69 recognitionTask = nil70 isRecording = false71 }72}5. Kisisellestirilmis Deneyim
Create ML'in MLRecommender'i ile kullaniciya ozel oneriler sunabilirsiniz.
6. Anomali Tespiti
Kullanici davranislarindaki anormallikleri tespit ederek guvenlik veya UX iyilestirmesi yapabilirsiniz.
7. On-Device Training
Core ML 3+ ile modelleri cihaz uzerinde guncelleyebilirsiniz. Bu, kisisellestirilmis modeller icin idealdir.
8. Privacy-First AI Tasarimi
Prensip | Uygulama | Apple API |
|---|---|---|
Veri minimizasyonu | Sadece gerekli veriyi isle | Core ML on-device |
On-device isleme | Sunucuya veri gonderme | Neural Engine |
Differential privacy | Istatistik toplama | Apple DP framework |
Transparency | Kullaniciya bilgi ver | Privacy Nutrition Labels |
User control | Veri silme imkani | Privacy settings |
ALTIN İPUCU
Bu yazının en değerli bilgisi
Bu ipucu, yazının en önemli çıkarımını içeriyor.
Okuyucu Ödülü
Tebrikler! Bu yazıyı sonuna kadar okuduğun için sana özel bir hediyem var:
Sonuç ve Öneriler
AI-powered ozellikler, iOS uygulamalarini siradanliktan cikarip olagnustu yapan unsurlardir. Akilli arama, kisisellestirilmis oneriler, otomatik goruntu analizi ve dogal dil isleme ile kullanici deneyimini dramatik sekilde iyilestirebilirsiniz. Ancak onemli olan, AI'yi kullanicinin hayatini kolaylastirmak icin kullanmak — teknolojiyi sergilemek icin degil. Her AI ozelliginin somut bir kullanici problemini cozmesi gerekir.
AI ozelliklerini uygulamaniza entegre ederken on-device ve server-side arasindaki dengeyi dikkatle degerlendirin. On-device modeller gizlilik, hiz ve cevrimdisi calisma avantaji sunarken, server-side cozumler daha buyuk ve guclu modellere erisim saglar. Ideal yaklasim, temel ozellikleri on-device tutmak ve gelismis analizler icin server-side destegi sunmaktir. Her durumda bir fallback mekanizmasi olusturun — AI basarisiz oldugunda uygulama hala kullanilabilir olmalidir.
Son olarak, AI ozelliklerini A/B testleri ile dogrulayin ve kullanici geri bildirimlerini aktif olarak toplayin. Bir ozelligin teknik olarak etkileyici olmasi, kullanicilarin onu benimseyecegi anlamina gelmez. Privacy impact assessment yapmayi, kullanicilara seffaf bilgi vermeyi ve AI kararlarini aciklanabilir kilmayi ihmal etmeyin.

