İpuçlarının ne zaman görüntüleneceğini kontrol eden kurallar, parametreler, olaylar ve uygulama düzeyinde yapılandırma seçenekleri.
Rule
Yapı | TipKit
*iOS 17.0+, iPadOS 17.0+, Mac Catalyst 17.0+, macOS 14.0+, tvOS 17.0+, visionOS 1.0+, watchOS 10.0+*
İpucu görüntülemeden önce karşılanması gereken koşul.
struct Rule
Kurallar, ipuçlarınızın ne zaman görüntüleneceğini kontrol etmek için kullanılır. İki tür kural mevcuttur: parametre tabanlı ve olay tabanlı.
Parametre Tabanlı Kurallar
Uygulama durumunu izler. Örneğin, kullanıcı giriş yaptığında bir ipucu göstermek için:
1. İzlemek istediğiniz uygulama durumunu @Parameter makrosuyla tanımlayın. 2. #Rule makrosuyla bu duruma dayalı bir kural oluşturun. 3. Kural closure'ında görüntülenme koşullarını belirleyin.
struct FavoriteLandmarkTip: Tip {
@Parameter
static var userIsLoggedIn: Bool = false
var rules: [Rule] {
#Rule(Self.$userIsLoggedIn) {
$0 == true
}
}
}
Olay Tabanlı Kurallar
Kullanıcı etkileşimlerini izler. Örneğin, bir olay üç veya daha fazla kez gerçekleştiğinde ipucu göstermek için:
1. İzlemek istediğiniz etkileşimi benzersiz id ile bir Event olarak tanımlayın. 2. #Rule makrosuyla bu etkileşime dayalı bir kural oluşturun. 3. Kural closure'ında görüntülenme koşullarını belirleyin.
struct FavoriteLandmarkTip: Tip {
static let didViewLandmark: Event = Event(id: "didViewLandmark")
var rules: [Rule] {
#Rule(Self.didViewLandmark) {
$0.donations.count > 3
}
}
}
Not: İpucu yapısında herhangi bir kural tanımlanmazsa, ipucu kapatılana veya gösterim sıklığı eşiğini aşana kadar görüntülenir.
Bileşik İşlemler (iOS 26+)
Tips.Rule.CompoundOperation numaralandırması ile kurallar arasında mantıksal işlemler belirlenebilir:
| İşlem | Açıklama | | --- | --- | | .conjunction | Mantıksal VE (and) kuralları | | .disjunction | Mantıksal VEYA (or) kuralları |
Parameter
Yapı | TipKit
*iOS 17.0+, iPadOS 17.0+, Mac Catalyst 17.0+, macOS 14.0+, tvOS 17.0+, visionOS 1.0+, watchOS 10.0+*
Sarmaladığı değerin durumunu izleyerek, değer değiştiğinde bağımlı ipucu kurallarını yeniden değerlendiren tip.
struct Parameter<Value> where Value : Decodable, Value : Encodable, Value : Sendable
Uyumlu bir tipi @Parameter makrosuyla sarmalayarak parametre oluşturulur. Tanımlayıcı (id), parametrenin kapsayan örneğine ve sarmaladığı özelliğin adına göre otomatik oluşturulur.
Önemli: Parametreler varsayılan olarak kalıcıdır (persistent). @Parameter ile sarmalanan bir özellik, değerini ipuçları veri deposunda uygulama başlatmaları arasında saklar. ParameterOption.transient iletilmesiyle parametrenin ilk başvurulduğunda varsayılan değerine sıfırlanması sağlanabilir.
Parametreler, configure(_:)) çağrılmadan önce güncellenmez.
struct LandmarksUser {
@Parameter
static var hasFavoritedLandmark: Bool = false
}
struct FavoriteLandmarkTip: Tip {
var rules: [Rule] {
#Rule(LandmarksUser.$hasFavoritedLandmark) {
$0 == false
}
}
}
Parametre Seçenekleri
ParameterOption.transient — Uygulama başlatmaları arasında parametre değerini sıfırlayan seçenek.
struct LandmarksUser {
@Parameter(.transient)
static var lastViewedLandmark: Landmark? = nil
}
Uyum: Identifiable, Sendable
Event
Yapı | TipKit
*iOS 17.0+, iPadOS 17.0+, Mac Catalyst 17.0+, macOS 14.0+, tvOS 17.0+, visionOS 1.0+, watchOS 10.0+*
Tekrarlanabilir, kullanıcı tanımlı eylem.
struct Event<DonationInfo> where DonationInfo : Decodable, DonationInfo : Encodable, DonationInfo : Sendable
Uygulamanızda bir veya daha fazla kez gerçekleşebilecek bir eylemi izlemek istediğinizde olay kullanın. Eylem gerçekleştiğinde donate()) çağrısıyla olaya bağış yaparak olay sayısını bir artırın.
Not: Performanslı kalmak için olaylar varsayılan olarak yalnızca en son 1000 bağışı sorgular.
İlişkili Bağış Değeri Olmadan
struct LandmarkTips: App {
static let landmarksAppDidOpen = Tips.Event(id: "landmarksAppDidOpen")
var body: some Scene {
WindowGroup {
ContentView()
.onAppear { Self.landmarksAppDidOpen.sendDonation() }
}
}
}
struct LandmarkFeatureTip: Tip {
var rules: [Rule] {
#Rule(LandmarkTips.landmarksAppDidOpen) {
$0.donations.donatedWithin(.week).count >= 3
}
}
}
İlişkili Bağış Değeri İle
struct LandmarkDetail: View {
static let didViewLandmarkDetail = Tips.Event<DidViewLandmark>(id: "didViewLandmarkDetail")
struct DidViewLandmark: Codable, Sendable {
let landmarkID: Int
let landmarkName: String
}
var body: some View {
ScrollView {
MapView(coordinate: landmark.locationCoordinate)
}
.onAppear {
Self.didViewLandmarkDetail.sendDonation(
.init(landmarkID: landmark.id, landmarkName: landmark.name)
)
}
}
}
struct LandmarkDetailTip: Tip {
var rules: [Rule] {
#Rule(LandmarkDetail.didViewLandmarkDetail) {
$0.donations.filter({ $0.landmarkName != "Wilbere Bowl" }).count > 3
}
}
}
Başlatıcılar
// Bağış değeri olmadan
init(id: String) where DonationInfo == Tips.EmptyDonation
init(id: String, donationLimit: Tips.DonationLimit)
where DonationInfo == Tips.EmptyDonation // iOS 26+
// İlişkili bağış değeri ile
init(id: String)
init(id: String, donationLimit: Tips.DonationLimit) // iOS 26+
Bağış Yöntemleri
| Yöntem | Açıklama | | --- | --- | | donate() | Bağış değeri olmadan asenkron bağış yapar | | donate(_:) | İlişkili bağış değeri ile asenkron bağış yapar | | sendDonation(_:) | Bağış değeri olmadan asenkron bağış gönderir | | sendDonation(_:_:) | İlişkili bağış değeri ile asenkron bağış gönderir | | deleteDonations() | Olayın mevcut bağışlarını siler (iOS 26+) |
Donation Yapısı
Her bağış bir date özelliği taşır ve @dynamicMemberLookup aracılığıyla ilişkili bağış değerinin özelliklerine doğrudan erişim sağlar.
@dynamicMemberLookup struct Donation
DonationTimeRange
Bağışları zaman aralığına göre filtreleme:
// Statik özellikler
.minute, .hour, .day, .week
// Yöntemler
.minutes(_:), .hours(_:), .days(_:), .weeks(_:)
DonationLimit (iOS 26+)
Olayın saklayacağı ve sorgulayacağı maksimum bağış sayısı ve yaşı:
init(maximumCount: Int, maximumAge: Tips.DonationTimeRange? = nil)
Uyum: Identifiable, Sendable
Yapılandırma Seçenekleri
configure(_:)
Tip Yöntemi | TipKit
Uygulamanızdaki tüm ipuçlarının kalıcı durumunu yükler ve yapılandırır.
static func configure(_ configuration: [Tips.ConfigurationOption] = []) throws
Önemli: İpuçları görüntülenmeden önce bu işlev çağrılmalıdır.
Uygulama başlatılması sırasında çağırın. Varsayılan olarak tüm ipuçları, varsayılan konuma immediate gösterim sıklığıyla kalıcı olarak saklanır.
@main
struct SampleApp: App {
init() {
do {
try Tips.configure()
}
catch {
print("TipKit başlatılırken hata: \(error.localizedDescription)")
}
}
}
Özel yapılandırma ile:
do {
try Tips.configure([
.datastoreLocation(.groupContainer(identifier: "MyGroupContainer")),
.displayFrequency(.hourly),
.cloudKitContainer(.automatic)
])
}
catch {
print("TipKit başlatılırken hata: \(error.localizedDescription)")
}
ConfigurationOption
Yapılandırma dizisine eklenebilecek üç seçenek türü:
DisplayFrequency — Gösterim Sıklığı
Bir ipucu gösterildikten sonra başka bir ipucunun uygun hale gelmesi için gereken minimum süre.
.displayFrequency(_ frequency: Tips.ConfigurationOption.DisplayFrequency)
| Değer | Açıklama | | --- | --- | | .immediate | Sıklık sınırlaması yok (varsayılan) | | .hourly | Saatte en fazla bir ipucu | | .daily | Günde en fazla bir ipucu | | .weekly | Haftada en fazla bir ipucu | | .monthly | Ayda en fazla bir ipucu |
DatastoreLocation — Veri Deposu Konumu
İpuçları veri deposunun diskteki konumunu belirler.
.datastoreLocation(_ location: Tips.ConfigurationOption.DatastoreLocation)
| Değer | Açıklama | | --- | --- | | .applicationDefault | Varsayılan uygulama destek dizini | | .groupContainer(identifier:) | Paylaşılan grup konteynerı | | .url(_:) | Özel disk konumu |
let tipsLocation = URL.applicationSupportDirectory.appendingPathComponent("LandmarkTips")
try Tips.configure([
.datastoreLocation(.url(tipsLocation))
])
CloudKitContainer — CloudKit Senkronizasyonu (iOS 18+)
İpuçlarını CloudKit ile senkronize etmek için konteyner belirler.
.cloudKitContainer(_ container: Tips.ConfigurationOption.CloudKitContainer)
| Değer | Açıklama | | --- | --- | | .automatic | Uygulamanın yetkilendirmelerindeki ".tips" sonekli ilk konteyneri veya birincil konteyneri kullanır | | .named(_:) | Belirtilen CloudKit konteynerini kullanır |
Davranış Seçenekleri
Her ipucu, options özelliği aracılığıyla bireysel davranış seçenekleri tanımlayabilir:
MaxDisplayCount
İpucu en fazla kaç kez görüntülendikten sonra otomatik geçersiz kılınacağını belirler.
struct MaxDisplayCount // TipOption'a uyumlu
Varsayılan olarak ipuçlarında maksimum gösterim sayısı yoktur.
var options: [any Option] {
MaxDisplayCount(3) // 3 kez görüntülendikten sonra otomatik geçersiz kılınır
}
MaxDisplayDuration
*iOS 18.0+, macOS 15.0+*
İpucu en fazla ne kadar süre görüntülendikten sonra geçersiz kılınacağını belirler.
struct MaxDisplayDuration // TipOption'a uyumlu
Bu kümülatif bir değerdir — ipucu 2 dakikalık maksimum süre belirler ve Pazartesi 1 dakika, Salı 1 dakika gösterilirse otomatik olarak geçersiz kılınır.
İpucu görünümleri, çok hızlı belirip kaybolmayı önlemek için MaxDisplayDuration tarafından otomatik geçersiz kılınabilmeden önce minimum 60 saniyelik gösterim süresine sahiptir.
var options: [any Option] {
MaxDisplayDuration(300.0) // 5 dakika sonra otomatik geçersiz kılınır
}
IgnoresDisplayFrequency
İpucunun önceden yapılandırılmış gösterim sıklığı aralığına uyup uymayacağını kontrol eder.
struct IgnoresDisplayFrequency // TipOption'a uyumlu
Varsayılan değer false. true olarak ayarlandığında, ipucu displayFrequency kısıtlaması karşılanmasa bile görüntülenebilir.
var options: [any Option] {
IgnoresDisplayFrequency(true)
}
Seçenekleri Birleştirme
struct FavoriteBackyardTip: Tip {
var options: [any Option] {
MaxDisplayCount(3)
MaxDisplayDuration(300.0)
IgnoresDisplayFrequency(true)
}
}