Tüm Yazılar
KategoriiOS
Okuma Süresi
19 dk okuma
Yayın Tarihi
...
Kelime Sayısı
1.642kelime

Kahveni hazırla - bu içerikli bir makale!

App Clip gelistirme, NFC/QR tetikleme, App Clip Card tasarimi, boyut optimizasyonu ve ana uygulamayla veri paylasimi.

iOS App Clips: Hafif Uygulama Deneyimi Rehberi

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


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 Clip
2 
3// 2. App Clip target'inda SwiftUI entry point
4import SwiftUI
5import AppClip
6 
7@main
8struct ParkingClipApp: App {
9 var body: some Scene {
10 WindowGroup {
11 ContentView()
12 .onContinueUserActivity(
13 NSUserActivityTypeBrowsingWeb
14 ) { activity in
15 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 return
24 }
25 
26 // URL'den parametreleri cikart
27 if let locationId = components.queryItems?
28 .first(where: { $0.name == "location" })?.value {
29 // Ilgili park yerine yonlendir
30 NavigationManager.shared.navigate(to: .parking(id: locationId))
31 }
32 }
33}

Associated Domains Ayari

json
1// apple-app-site-association (AASA) dosyasi
2{
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 karakter
4// 3. Alt baslik: Max 56 karakter
5// 4. Aksiyon butonu: "Ac" / "Goruntule" / "Oynat" / "Kullan"
6 
7// Xcode'da App Clip Meta Data
8struct AppClipMetadata {
9 static let title = "Park Odeme"
10 static let subtitle = "Hizli ve guvenli otopark odemesi"
11 static let actionButton = "Ac" // Open, View, Play, Use
12 
13 // URL'ler App Store Connect'te tanimlanir
14 // https://example.com/clip/parking?location=IST001
15}

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
1
2
3 content="app-clip-bundle-id=com.example.parking.Clip,
4 app-id=123456789">

NFC Tag Yapisi

swift
1import CoreNFC
2 
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 in
12 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 algilandi
23 }
24 
25 func readerSession(_ session: NFCNDEFReaderSession,
26 didInvalidateWithError error: Error) {
27 // Hata
28 }
29}

6. Boyut Optimizasyonu (15 MB Limit)

swift
1// Boyut kontrol komutlari
2// Terminal:
3// xcodebuild -project App.xcodeproj -scheme "AppClip" -configuration Release archive
4// Sonra .xcarchive icindeki thinned .ipa boyutunu kontrol edin
5 
6// Boyut azaltma stratejileri:
7 
8// 1. Asset'leri on-demand yukleyin
9func loadImage(named: String) async -> UIImage? {
10 // Buyuk gorselleri sunucudan indirin
11 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 edin
17// YAPMAYIN: import Charts, MapKit, ARKit (gereksiz buyukluk)
18// YAPIN: Sadece ihtiyac duyulan framework'ler
19 
20// 3. Shared framework kullanin
21// Ana uygulama ve App Clip arasinda paylasilan kod
22// Shared target olusturun

7. Veri Paylasimi (App Clip → Ana Uygulama)

swift
1import Foundation
2 
3// Shared App Group ile veri paylasimi
4class 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 kaydet
14 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 oku
21 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 Security
30 
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: accessGroup
41 ]
42 SecItemDelete(query as CFDictionary)
43 SecItemAdd(query as CFDictionary, nil)
44 }
45}

8. Konum Dogrulama

swift
1import AppClip
2import CoreLocation
3 
4class LocationVerifier {
5 func verifyLocation(
6 latitude: Double,
7 longitude: Double,
8 radius: Double = 500 // metre
9 ) 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: region
20 ) { inRegion, error in
21 if inRegion {
22 print("Kullanici dogrulanan konumda")
23 } else {
24 print("Konum dogrulanamadi")
25 }
26 }
27 return true
28 }
29}

9. Test ve Debug

swift
1// Xcode'da App Clip test etme:
2// 1. Scheme'de App Clip target'ini sec
3// 2. Environment variable ekle:
4// _XCAppClipURL = https://example.com/clip/parking?location=IST001
5 
6// Local test icin
7struct 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 test
16// 1. App Store Connect'te App Clip deneyimi olustur
17// 2. TestFlight'a yukle
18// 3. Test URL'si ile dene

10. 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.

Etiketler

#App Clips#iOS#NFC#QR Code#Deep Linking#Performance
Muhittin Çamdalı

Muhittin Çamdalı

Senior iOS Developer

12+ yıllık deneyime sahip iOS Developer. Swift, SwiftUI ve modern iOS mimarileri konusunda uzman. Apple platformlarında performanslı ve kullanıcı dostu uygulamalar geliştiriyorum.

iOS Geliştirme Haberleri

Haftalık Swift tips, SwiftUI tricks ve iOS best practices. Spam yok, sadece değerli içerik.

Gizliliğinize saygı duyuyoruz. İstediğiniz zaman abonelikten çıkabilirsiniz.

Paylaş

Bunu da begenebilirsiniz