App Clips, kullanicilarin uygulamanizi indirmeden belirli islevleri kullanmasina olanak tanir. NFC, QR kod veya Safari banner'i ile tetiklenebilen bu hafif deneyimler, kullanici edinme ve donusum oranlarini artirmada guclu bir aractir. Bu rehberde App Clip gelistirmenin tum adimlarini inceleyecegiz.
Icindekiler
- App Clips Nedir?
- Ne Zaman Kullanilmali?
- Proje Kurulumu
- App Clip Card Tasarimi
- Tetikleme Yontemleri
- Boyut Optimizasyonu
- Veri Paylasimi (App Clip → Ana Uygulama)
- Konum Dogrulama
- Test ve Debug
- Best Practices
- Sonuc
1. App Clips Nedir?
Karsilastirma Tablosu
Ozellik | App Clip | Tam Uygulama | Instant App (Android) |
|---|---|---|---|
**Max Boyut** | 15 MB (iOS 16+) | Sinirsi | 15 MB |
**Indirme** | Gerekmiyor | App Store | Gerekmiyor |
**Yukleme Suresi** | <2 saniye | Degisken | <4 saniye |
**Framework Destegi** | SwiftUI, UIKit | Tam | Jetpack Compose |
**Sign in with Apple** | Evet | Evet | - |
**Apple Pay** | Evet | Evet | Google Pay |
**Push Notification** | 8 saat sinirli | Sinirsiz | Sinirli |
**Cihazda Kalma** | 30 gun (kullanilmazsa silinir) | Kalici | Gecici |
2. Ne Zaman Kullanilmali?
- Restoran siparisi: — QR ile menu ve odeme
- Scooter kiralama: — NFC ile kilidi ac
- Otopark odemesi: — QR ile hizli odeme
- Etkinlik bileti: — link ile bilet goster
- Deneme surumu: — uygulama indirmeden dene
3. Proje Kurulumu
swift
1// 1. Xcode: File → New → Target → App Clip2 3// 2. App Clip target'inda SwiftUI entry point4import SwiftUI5import AppClip6 7@main8struct ParkingClipApp: App {9 var body: some Scene {10 WindowGroup {11 ContentView()12 .onContinueUserActivity(13 NSUserActivityTypeBrowsingWeb14 ) { activity in15 handleIncomingURL(activity)16 }17 }18 }19 20 func handleIncomingURL(_ activity: NSUserActivity) {21 guard let url = activity.webpageURL,22 let components = URLComponents(url: url, resolvingAgainstBaseURL: false) else {23 return24 }25 26 // URL'den parametreleri cikart27 if let locationId = components.queryItems?28 .first(where: { $0.name == "location" })?.value {29 // Ilgili park yerine yonlendir30 NavigationManager.shared.navigate(to: .parking(id: locationId))31 }32 }33}Associated Domains Ayari
json
1// apple-app-site-association (AASA) dosyasi2{3 "appclips": {4 "apps": ["TEAMID.com.example.parking.Clip"]5 },6 "applinks": {7 "apps": [],8 "details": [{9 "appIDs": [10 "TEAMID.com.example.parking",11 "TEAMID.com.example.parking.Clip"12 ],13 "components": [{14 "/": "/clip/*",15 "comment": "App Clip URL pattern"16 }]17 }]18 }19}4. App Clip Card Tasarimi
swift
1// App Store Connect'te App Clip deneyimi yapilandirmasi:2// 1. Header image: 1800x1200px (3:2 oran)3// 2. Baslik: Max 30 karakter4// 3. Alt baslik: Max 56 karakter5// 4. Aksiyon butonu: "Ac" / "Goruntule" / "Oynat" / "Kullan"6 7// Xcode'da App Clip Meta Data8struct AppClipMetadata {9 static let title = "Park Odeme"10 static let subtitle = "Hizli ve guvenli otopark odemesi"11 static let actionButton = "Ac" // Open, View, Play, Use12 13 // URL'ler App Store Connect'te tanimlanir14 // https://example.com/clip/parking?location=IST00115}5. Tetikleme Yontemleri
Yontem | Kurulum | Kullanici Deneyimi |
|---|---|---|
**QR Kod** | URL iceren QR | Kamera ile tara |
**NFC** | NDEF URL tag | Telefonu yaklasstir |
**Safari Banner** | Meta tag | Banner'a tikla |
**Maps** | Place card | Maps'te ac |
**Messages** | Link onizleme | Mesajdaki linke tikla |
**App Clip Code** | Apple tasarimli kod | Kamera ile tara |
Safari Smart Banner
html
123 content="app-clip-bundle-id=com.example.parking.Clip,4 app-id=123456789">NFC Tag Yapisi
swift
1import CoreNFC2 3// NFC tag yazma (admin uygulamasi icin)4class NFCWriter: NSObject, NFCNDEFReaderSessionDelegate {5 func writeTag(session: NFCNDEFReaderSession, tag: NFCNDEFTag) {6 let urlPayload = NFCNDEFPayload.wellKnownTypeURIPayload(7 url: URL(string: "https://example.com/clip/parking?location=IST001")!8 )!9 10 let message = NFCNDEFMessage(records: [urlPayload])11 tag.writeNDEF(message) { error in12 if let error = error {13 print("Yazma hatasi: \(error)")14 } else {15 print("NFC tag basariyla yazildi")16 }17 }18 }19 20 func readerSession(_ session: NFCNDEFReaderSession,21 didDetect tags: [NFCNDEFTag]) {22 // Tag algilandi23 }24 25 func readerSession(_ session: NFCNDEFReaderSession,26 didInvalidateWithError error: Error) {27 // Hata28 }29}6. Boyut Optimizasyonu (15 MB Limit)
swift
1// Boyut kontrol komutlari2// Terminal:3// xcodebuild -project App.xcodeproj -scheme "AppClip" -configuration Release archive4// Sonra .xcarchive icindeki thinned .ipa boyutunu kontrol edin5 6// Boyut azaltma stratejileri:7 8// 1. Asset'leri on-demand yukleyin9func loadImage(named: String) async -> UIImage? {10 // Buyuk gorselleri sunucudan indirin11 let url = URL(string: "https://cdn.example.com/images/\(named).webp")!12 let (data, _) = try? await URLSession.shared.data(from: url)13 return data.flatMap { UIImage(data: $0) }14}15 16// 2. Sadece gerekli framework'leri import edin17// YAPMAYIN: import Charts, MapKit, ARKit (gereksiz buyukluk)18// YAPIN: Sadece ihtiyac duyulan framework'ler19 20// 3. Shared framework kullanin21// Ana uygulama ve App Clip arasinda paylasilan kod22// Shared target olusturun7. Veri Paylasimi (App Clip → Ana Uygulama)
swift
1import Foundation2 3// Shared App Group ile veri paylasimi4class SharedDataManager {5 static let shared = SharedDataManager()6 7 private let defaults: UserDefaults?8 9 init() {10 defaults = UserDefaults(suiteName: "group.com.example.parking")11 }12 13 // App Clip'ten kaydet14 func saveFromClip(parkingId: String, paymentToken: String) {15 defaults?.set(parkingId, forKey: "lastParkingId")16 defaults?.set(paymentToken, forKey: "paymentToken")17 defaults?.set(Date(), forKey: "clipUsageDate")18 }19 20 // Ana uygulamadan oku21 func readClipData() -> (parkingId: String?, paymentToken: String?) {22 let parkingId = defaults?.string(forKey: "lastParkingId")23 let token = defaults?.string(forKey: "paymentToken")24 return (parkingId, token)25 }26}27 28// Keychain paylasimi (daha guvenli)29import Security30 31class SharedKeychainManager {32 static let accessGroup = "TEAMID.com.example.shared"33 34 static func save(key: String, value: String) {35 let data = value.data(using: .utf8)!36 let query: [String: Any] = [37 kSecClass as String: kSecClassGenericPassword,38 kSecAttrAccount as String: key,39 kSecValueData as String: data,40 kSecAttrAccessGroup as String: accessGroup41 ]42 SecItemDelete(query as CFDictionary)43 SecItemAdd(query as CFDictionary, nil)44 }45}8. Konum Dogrulama
swift
1import AppClip2import CoreLocation3 4class LocationVerifier {5 func verifyLocation(6 latitude: Double,7 longitude: Double,8 radius: Double = 500 // metre9 ) async -> Bool {10 let region = CLCircularRegion(11 center: CLLocationCoordinate2D(latitude: latitude, longitude: longitude),12 radius: radius,13 identifier: "clip-location"14 )15 16 guard let activity = await getActivity() else { return false }17 18 activity.appClipActivationPayload?.confirmAcquired(19 in: region20 ) { inRegion, error in21 if inRegion {22 print("Kullanici dogrulanan konumda")23 } else {24 print("Konum dogrulanamadi")25 }26 }27 return true28 }29}9. Test ve Debug
swift
1// Xcode'da App Clip test etme:2// 1. Scheme'de App Clip target'ini sec3// 2. Environment variable ekle:4// _XCAppClipURL = https://example.com/clip/parking?location=IST0015 6// Local test icin7struct ContentView_Previews: PreviewProvider {8 static var previews: some View {9 ContentView()10 .environment(\.appClipURL,11 URL(string: "https://example.com/clip/parking?location=IST001"))12 }13}14 15// TestFlight ile test16// 1. App Store Connect'te App Clip deneyimi olustur17// 2. TestFlight'a yukle18// 3. Test URL'si ile dene10. Best Practices
Kural | Aciklama |
|---|---|
**Tek goreve odaklan** | App Clip bir isi iyi yapmali |
**15 MB altinda kal** | On-demand asset loading kullan |
**Hizli yukle** | 2 saniyede kullanilabilir olmali |
**Sign in with Apple** | Hesap gerekliyse bu yontemi kullan |
**Ana uygulamaya yonlendir** | Tam deneyim icin indirmeyi teklif et |
**Offline destegi** | Temel islevler offline calismali |
ALTIN İPUCU
Bu yazının en değerli bilgisi
Bu ipucu, yazının en önemli çıkarımını içeriyor.
Easter Egg
Gizli bir bilgi buldun!
Bu bölümde gizli bir bilgi var. Keşfetmek ister misin?
Okuyucu Ödülü
Tebrikler! Bu yaziyi sonuna kadar okudugun icin sana ozel bir hediyem var:
11. Sonuc
App Clips, mobil uygulama deneyimini fiziksel dunyayla bulusturan guclu bir platform ozelligidir. Dogru kullanim senaryolarinda kullanici edinme maliyetini dusurur ve donusum oranlarini arttirir. 15 MB limitine dikkat ederek, odakli ve hizli bir deneyim sunmak basarinin anahtaridir.
Sonuc ve Oneriler
App Clips, kullanicilarin uygulamanizi indirmeden deneyimlemesini saglayan stratejik bir aractir. Ozellikle fiziksel isletmeler, etkinlikler ve konum bazli hizmetler icin muazzam bir kullanici edinme kanali olusturur. NFC etiketleri, QR kodlar ve App Clip Code'lar ile fiziksel dunyadaki temas noktalarini dijital deneyimlere donusturebilirsiniz.
Gelistirme surecinde 15 MB boyut limitini her zaman goz onunde bulundurun. Gereksiz framework bagimliliklarini kaldirin, asset'leri optimize edin ve on-demand kaynak yukleme stratejileri kullanin. Kullanici deneyimini tek bir goreve odaklayin: odeme, siparis, kayit veya bilgi gosterimi. App Clip icinde tam uygulamaya gecis akisini iyi tasarlamak, donusum oranlarini dogrudan etkiler.
Analytics ve A/B test altyapisi kurarak farkli tetikleme yontemlerinin performansini olcun. Hangi fiziksel konumlarin veya dijital kanallarin daha fazla etkilesim yaratttigini analiz edin ve stratejinizi buna gore sekillendirin. Apple Business Register entegrasyonu ile Maps uzerinden kesfedilebilirlik saglamak da kullanici edinme maliyetini dusurmenin etkili bir yoludur.

