يتيح Klaviyo Swift SDK للمطورين دمج تحليلات Klaviyo ودفع وظائف الإخطار في تطبيقات iOS الخاصة بهم. تساعد SDK في تحديد المستخدمين وتتبع الأحداث عبر واجهات برمجة تطبيقات عميل Klaviyo. لتقليل النفقات العامة للأداء ، يتم وضع طلبات API في قائمة الانتظار وإرسالها على دفعات. يتم استمرار قائمة الانتظار للتخزين المحلي بحيث لا تضيع البيانات إذا كان الجهاز غير متصل أو إنهاء التطبيق.
بمجرد الاندماج ، سيتمكن فريق التسويق الخاص بك من فهم احتياجات مستخدمي التطبيق بشكل أفضل وإرسال رسائل في الوقت المناسب عبر APNs.
تمكين إمكانيات إشعار الدفع في مشروع XCode الخاص بك. يوفر قسم "تمكين قدرة إشعار الدفع" في دليل مطور Apple هذا التعليمات التفصيلية.
[اختياري ولكن موصى به] إذا كنت تنوي استخدام إشعارات الدفع الغنية ، أضف امتداد خدمة الإخطار إلى مشروع XCode الخاص بك. يشحن امتداد تطبيق خدمة الإخطار كحزمة منفصلة داخل تطبيق iOS الخاص بك. لإضافة هذا الامتداد إلى تطبيقك:
️ هدف النشر لتمديد خدمة الإخطار الخاص بك الافتراضي إلى أحدث إصدار من iOS. إذا تجاوز هذا الحد الأدنى من إصدار iOS المدعوم في تطبيقك ، فقد لا تعرض إشعارات الدفع الوسائط المرفقة على الأجهزة القديمة. لتجنب ذلك ، تأكد من أن الحد الأدنى من هدف النشر للتمديد يطابق مع تطبيقك.️
بناءً على مدير التبعية الذي تستخدمه ، اتبع الإرشادات أدناه لتثبيت تبعيات Klaviyo.
يتوفر Klaviyoswift عبر Swift Package Manager. اتبع الخطوات أدناه للتثبيت.
https://github.com/klaviyo/klaviyo-swift-sdk
في حقل النص. هذا يجب أن يطرح الحزمة على الشاشة.KlaviyoSwift
إلى هدف التطبيق الخاص بك و KlaviyoSwiftExtension
إلى هدف امتداد خدمة الإخطار (إذا تم إنشاء واحد) وانقر فوق إضافة حزمة .يتوفر Klaviyoswift من خلال Cocoapods.
YourAppTarget
و YourAppNotificationServiceExtenionTarget
بأسماء امتداد خدمة التطبيق والإخطار على التوالي. target 'YourAppTarget' do
pod 'KlaviyoSwift'
end
target 'YourAppNotificationServiceExtenionTarget' do
pod 'KlaviyoSwiftExtension'
end
pod install
لإكمال التكامل. يمكن الحفاظ على تحديث المكتبة عبر pod update KlaviyoSwift
و pod update KlaviyoSwiftExtension
. أخيرًا ، في ملف NotificationService.swift
، أضف الرمز للمندوبين المطلبين من هذا الملف. تغطي هذه العينة الدعوة إلى Klaviyo حتى نتمكن من تنزيل الوسائط وإرفاقها بإشعار الدفع.
يجب تهيئة SDK باستخدام مفتاح API الأبجدي الأسباني القصير لحساب Klaviyo الخاص بك ، والمعروف أيضًا باسم معرف موقعك.
// AppDelegate
import KlaviyoSwift
class AppDelegate : UIResponder , UIApplicationDelegate {
func application ( _ application : UIApplication , didFinishLaunchingWithOptions launchOptions : [ UIApplication . LaunchOptionsKey : Any ] ? ) -> Bool {
KlaviyoSDK ( ) . initialize ( with : " YOUR_KLAVIYO_PUBLIC_API_KEY " )
return true
}
}
يجب تهيئة SDK قبل أن يتم استدعاء أي طرق أخرى من Klaviyo SDK.
يوفر SDK طرقًا لتحديد مستخدميك كملفات تعريف Klaviyo عبر Create Client Profile API. يمكن تحديد ملف تعريف من خلال أي مزيج من ما يلي:
يتم استمرار هذه المعرفات المذكورة أعلاه في التخزين المحلي بحيث يمكن لـ SDK تتبع المستخدم/الملف الشخصي الحالي لك عند تقديم طلبات الحدث أو ترغب في تعيين رمز الدفع وما إلى ذلك.
يمكن تعيين معرفات الملف الشخصي في كل مرة أو بشكل فردي. في كلتا الحالتين ، ستقوم SDK بتجميع ومكالمات واجهة برمجة تطبيقات الدفعة لتحسين الأداء.
يوضح الرمز التالي كيفية تعيين معرفات الملف الشخصي:
// organization, title, image, location and additional properties (dictionary) can also be set using the below constructor
let profile = Profile ( email : " [email protected] " , firstName : " Blob " , lastName : " Jr. " )
KlaviyoSDK ( ) . set ( profile : profile )
// or setting individual properties
KlaviyoSDK ( ) . set ( profileAttribute : . firstName , value : " Blob " )
KlaviyoSDK ( ) . set ( profileAttribute : . lastName , value : " Jr. " )
لبدء ملف تعريف جديد تمامًا (على سبيل المثال KlaviyoSDK().set(profile: profile)
إذا قام المستخدم بتسجيل الخروج KlaviyoSDK().resetProfile()
هدف.
// start a profile for Blob Jr.
let profile = Profile ( email : " [email protected] " , firstName : " Blob " , lastName : " Jr. " )
KlaviyoSDK ( ) . set ( profile : profile )
// stop tracking Blob Jr.
KlaviyoSDK ( ) . resetProfile ( )
// start a profile for Robin Hood
let profile = Profile ( email : " [email protected] " , firstName : " Robin " , lastName : " Hood " )
KlaviyoSDK ( ) . set ( profile : profile )
ستقوم Klaviyo بتتبع المستخدمين المجهولين بمعرف تلقائي للتكوين كلما تم تعيين رمز الدفع أو إنشاء حدث. وبهذه الطريقة ، يمكنك جمع الرموز المميزة للدفع وتتبع الأحداث قبل جمع معرفات الملف الشخصي مثل البريد الإلكتروني أو رقم الهاتف. عند توفير معرف ، ستقوم Klaviyo بدمج المستخدم المجهول مع مستخدم محدد.
يوفر SDK أدوات لتتبع الأحداث التي يقوم بها المستخدمون على تطبيقك عبر API Create Client Event. فيما يلي مثال على كيفية تتبع الحدث:
// using a predefined event name
let event = Event ( name : . StartedCheckoutMetric ,
properties : [
" name " : " cool t-shirt " ,
" color " : " blue " ,
" size " : " medium " ,
] ,
value : 166 )
KlaviyoSDK ( ) . create ( event : event )
// using a custom event name
let customEvent = Event ( name : . CustomEvent ( " Checkout Completed " ) ,
properties : [
" name " : " cool t-shirt " ,
" color " : " blue " ,
" size " : " medium " ,
] ,
value : 166 )
KlaviyoSDK ( ) . create ( event : customEvent )
تأخذ طريقة create
كائن حدث كوسيطة. يمكن بناء الحدث مع الحجج التالية:
name
: اسم الحدث الذي تريد تتبعه ، كعنصر EventName
. يمكن العثور على قائمة بمقاييس الحدث المحددة في Klaviyo المشتركة في Event.EventName
. يمكنك أيضًا إنشاء أحداث مخصصة باستخدام حالة CustomEvent
Event.EventName
properties
: قاموس الخصائص المخصصة للحدث. هذه الحجة اختيارية.value
: قيمة رقمية ( Double
) للربط بهذا الحدث. على سبيل المثال ، مبلغ الدولار من الشراء. من أجل إرسال إشعارات الدفع إلى المستخدمين ، يجب عليك جمع الرموز المميزة الخاصة بهم وتسجيلها في Klaviyo. يتم ذلك عن طريق KlaviyoSDK().set(pushToken:)
، والتي تسجل رمز الرمز المميز وحالة التخويل الحالية عبر Create Client Push Token API.
registerForRemoteNotifications()
لطلب رمز الدفع من APNs. يتم ذلك عادة في application:didFinishLaunchingWithOptions:
طريقة مندوب التطبيق الخاص بك.application:didRegisterForRemoteNotificationsWithDeviceToken
في مندوب التطبيق الخاص بك لتلقي الرمز المميز من APNs وتسجيله مع Klaviyo.فيما يلي رمز القيام بكل من الخطوتين المذكورة أعلاه:
import KlaviyoSwift
func application ( _ application : UIApplication , didFinishLaunchingWithOptions launchOptions : [ UIApplication . LaunchOptionsKey : Any ] ? ) -> Bool {
KlaviyoSDK ( ) . initialize ( with : " YOUR_KLAVIYO_PUBLIC_API_KEY " )
UIApplication . shared . registerForRemoteNotifications ( )
return true
}
func application ( _ application : UIApplication , didRegisterForRemoteNotificationsWithDeviceToken deviceToken : Data ) {
KlaviyoSDK ( ) . set ( pushToken : deviceToken )
}
بمجرد الحصول على رمز الدفع ، فإن الخطوة التالية هي طلب إذن من المستخدمين لإرسال إشعارات الدفع لهم. يمكنك إضافة رمز طلب الإذن في أي مكان في التطبيق الخاص بك حيث من المنطقي أن تطالب المستخدمين بهذا الإذن. توفر Apple بعض الإرشادات حول أفضل الممارسات لمتى وكيفية طلب هذا الإذن. يوضح المثال التالي كيفية طلب أذونات الدفع داخل application:didFinishLaunchingWithOptions:
الطريقة في ملف مندوب التطبيق. ومع ذلك ، تجدر الإشارة إلى أن هذا قد لا يكون الموقع المثالي لأنه يمكن أن يقطع تجربة بدء تشغيل التطبيق.
بعد تعيين رمز الدفع ، سيقوم Klaviyo SDK تلقائيًا بتتبع التغييرات على إذن إخطار المستخدم عندما يتم فتح التطبيق أو استئنافه من الخلفية.
فيما يلي مثال رمز لطلب إذن إشعار الدفع:
import UserNotifications
func application ( _ application : UIApplication , didFinishLaunchingWithOptions launchOptions : [ UIApplication . LaunchOptionsKey : Any ] ? ) -> Bool {
KlaviyoSDK ( ) . initialize ( with : " YOUR_KLAVIYO_PUBLIC_API_KEY " )
UIApplication . shared . registerForRemoteNotifications ( )
let center = UNUserNotificationCenter . current ( )
center . delegate = self as? UNUserNotificationCenterDelegate // the type casting can be removed once the delegate has been implemented
let options : UNAuthorizationOptions = [ . alert , . sound , . badge ]
// use the below options if you are interested in using provisional push notifications. Note that using this will not
// show the push notifications prompt to the user.
// let options: UNAuthorizationOptions = [.alert, .sound, .badge, .provisional]
center . requestAuthorization ( options : options ) { granted , error in
if let error = error {
// Handle the error here.
print ( " error = " , error )
}
// Irrespective of the authorization status call `registerForRemoteNotifications` here so that
// the `didRegisterForRemoteNotificationsWithDeviceToken` delegate is called. Doing this
// will make sure that Klaviyo always has the latest push authorization status.
DispatchQueue . main . async {
UIApplication . shared . registerForRemoteNotifications ( )
}
}
return true
}
عندما ينقر المستخدم على إشعار الدفع ، قم بتنفيذ userNotificationCenter:didReceive:withCompletionHandler
و userNotificationCenter:willPresent:withCompletionHandler
في مندوب التطبيق الخاص بك للتعامل مع استلام إعلامات الدفع عندما يكون التطبيق في الخلفية والمصباح على التوالي.
فيما يلي مثال على كيفية التعامل مع إشعارات الدفع في مندوب التطبيق الخاص بك:
// be sure to set the UNUserNotificationCenterDelegate to self in the didFinishLaunchingWithOptions method (refer the requesting push notification permission section above for more details on this)
extension AppDelegate : UNUserNotificationCenterDelegate {
// below method will be called when the user interacts with the push notification
func userNotificationCenter (
_ center : UNUserNotificationCenter ,
didReceive response : UNNotificationResponse ,
withCompletionHandler completionHandler : @escaping ( ) -> Void ) {
// If this notification is Klaviyo's notification we'll handle it
// else pass it on to the next push notification service to which it may belong
let handled = KlaviyoSDK ( ) . handle ( notificationResponse : response , withCompletionHandler : completionHandler )
if !handled {
completionHandler ( )
}
}
// below method is called when the app receives push notifications when the app is the foreground
func userNotificationCenter (
_ center : UNUserNotificationCenter ,
willPresent notification : UNNotification ,
withCompletionHandler completionHandler : @escaping ( UNNotificationPresentationOptions ) -> Void ) {
if #available ( iOS 14 . 0 , * ) {
completionHandler ( [ . list , . banner ] )
} else {
completionHandler ( [ . alert ] )
}
}
}
عند تتبع إشعار الدفع المفتوح ، يمكنك أيضًا تقليل عدد الشارات على رمز التطبيق عن طريق إضافة الكود التالي إلى userNotificationCenter:didReceive:withCompletionHandler
method:
func userNotificationCenter (
_ center : UNUserNotificationCenter ,
didReceive response : UNNotificationResponse ,
withCompletionHandler completionHandler : @escaping ( ) -> Void ) {
// decrement the badge count on the app icon
if #available ( iOS 16 . 0 , * ) {
UNUserNotificationCenter . current ( ) . setBadgeCount ( UIApplication . shared . applicationIconBadgeNumber - 1 )
} else {
UIApplication . shared . applicationIconBadgeNumber -= 1
}
// If this notification is Klaviyo's notification we'll handle it
// else pass it on to the next push notification service to which it may belong
let handled = KlaviyoSDK ( ) . handle ( notificationResponse : response , withCompletionHandler : completionHandler )
if !handled {
completionHandler ( )
}
}
بالإضافة إلى ذلك ، إذا كنت ترغب فقط في إعادة تعيين عدد الشارات إلى الصفر عند فتح التطبيق (لاحظ أن هذا قد يكون من المستخدم فقط فتح التطبيق بشكل مستقل عن رسالة الدفع) ، فيمكنك إضافة الكود التالي إلى طريقة applicationDidBecomeActive
في مندوب التطبيق:
func applicationDidBecomeActive ( _ application : UIApplication ) {
// reset the badge count on the app icon
if #available ( iOS 16 . 0 , * ) {
UNUserNotificationCenter . current ( ) . setBadgeCount ( 0 )
} else {
UIApplication . shared . applicationIconBadgeNumber = 0
}
}
بمجرد إرسال إشعارات الدفع الأولى وفتحها ، يجب أن تبدأ في رؤية مقاييس الدفع المفتوحة داخل لوحة معلومات Klaviyo.
يحتاج تطبيقك إلى استخدام الإصدار 1.7.2 كحد أدنى لكي تعمل الخطوات أدناه.
تتيح لك الروابط العميقة الانتقال إلى صفحة معينة داخل تطبيقك استجابةً للمستخدم الذي يفتح إشعارًا للدفع.
تحتاج إلى تكوين روابط عميقة في تطبيقك للعمل. لا تختلف عملية التكوين لـ Klaviyo عن ما هو مطلوب للتعامل مع الارتباط العميق بشكل عام ، بحيث يمكنك متابعة وثائق Apple للربط العميق بالاقتران مع الخطوات الموضحة هنا.
لديك خياران لتنفيذ الروابط العميقة: مخططات URL والروابط الشاملة.
مخططات URL هي الطريقة التقليدية والأبسط للربط العميق من إشعار الدفع بتطبيقك. ومع ذلك ، لن تعمل هذه الروابط إلا إذا تم تثبيت تطبيق الهاتف المحمول الخاص بك على جهاز ولن يتم فهمه من قبل متصفح الويب إذا كنت تريد ، على سبيل المثال ، الارتباط من رسالة بريد إلكتروني إلى تطبيقك.
لكي توجه Apple رابطًا عميقًا إلى التطبيق الخاص بك ، تحتاج إلى تسجيل مخطط عنوان URL في ملف info.plist الخاص بالتطبيق. يمكن القيام بذلك باستخدام المحرر الذي يوفره Xcode من علامة تبويب المعلومات لإعدادات المشروع الخاصة بك أو عن طريق تحرير info.plist مباشرة.
الحقول المطلوبة على النحو التالي:
لتحرير info.plist مباشرة ، ما عليك سوى ملء تفاصيل التطبيق الخاصة بك ولصق هذا في Plist الخاص بك.
< key >CFBundleURLTypes</ key >
< array >
< dict >
< key >CFBundleTypeRole</ key >
< string >Editor</ string >
< key >CFBundleURLName</ key >
< string >{your_unique_identifier}</ string >
< key >CFBundleURLSchemes</ key >
< array >
< string >{your_URL_scheme}</ string >
</ array >
</ dict >
</ array >
نظرًا لأن iOS 9 قد فرضت Apple أن مخططات URL التي يمكن أن يفتح التطبيق الخاص بك يجب أن يتم إدراجها أيضًا في info.plist. هذا بالإضافة إلى الخطوة 1 أعلاه. حتى إذا لم يفتح تطبيقك أي تطبيقات أخرى ، فلا يزال عليك سرد نظام URL الخاص بتطبيقك حتى يتم ربطه بعمق بالعمل.
يجب القيام بذلك في info.plist مباشرة:
< key >LSApplicationQueriesSchemes</ key >
< array >
< string >{your custom URL scheme}</ string >
</ array >
تمكين الخطوتين 1 و 2 تطبيقك من تلقي روابط عميقة ، ولكن تحتاج أيضًا إلى التعامل مع هذه الروابط داخل تطبيقك. يتم ذلك عن طريق تطبيق application:openURL:options:
الطريقة في مندوب التطبيق الخاص بك.
مثال:
func application (
_ app : UIApplication ,
open url : URL ,
options : [ UIApplication . OpenURLOptionsKey : Any ] = [ : ]
) -> Bool {
guard let components = NSURLComponents ( url : url , resolvingAgainstBaseURL : true )
else {
print ( " Invalid deep linking URL " )
return false
}
print ( " components: ( components . debugDescription ) " )
return true
}
إذا كنت تستخدم Swiftui ، فيمكنك تنفيذ onOpenURL(perform:)
كمعدل عرض في العرض الذي تنوي التعامل مع الروابط العميقة. قد يكون هذا أو لا يكون جذر المشهد الخاص بك.
مثال:
@ main
struct MyApplication : App {
var body : some Scene {
WindowGroup {
ContentView ( )
. onOpenURL { url in
// handle the URL that must be opened
}
}
}
}
أخيرًا ، لدينا تطبيق مثال ( Examples/KlaviyoSwiftExamples
) في sdk repo التي يمكنك الإشارة إليها للحصول على مثال على كيفية تنفيذ الروابط العميقة في تطبيقك.
بمجرد اكتمال الخطوات المذكورة أعلاه ، يمكنك إرسال إشعارات الدفع من محرر Push Klaviyo داخل موقع Klaviyo. يمكنك هنا بناء وإرسال إشعار الدفع عبر Klaviyo للتأكد من أن عنوان URL يظهر في المعالج الذي قمت بتطبيقه في الخطوة 3.
بالإضافة إلى ذلك ، يمكنك أيضًا تشغيل رابط عميق للتأكد من أن الكود الخاص بك يعمل باستخدام الأمر أدناه في المحطة.
xcrun simctl openurl booted {your_URL_here}
الروابط الشاملة هي طريقة أكثر حداثة للتعامل مع الروابط العميقة ويوصي بها Apple. فهي أكثر أمانًا وتوفر تجربة مستخدم أفضل. ومع ذلك ، على عكس مخططات URL ، فإنها تتطلب المزيد من الإعدادات التي يتم تسليط الضوء عليها في مستندات Apple هذه.
بمجرد الحصول على الإعداد من مستندات Apple في مكانه ، ستحتاج إلى تعديل التتبع المفتوح للدفع كما هو موضح أدناه:
extension AppDelegate : UNUserNotificationCenterDelegate {
func userNotificationCenter ( _ center : UNUserNotificationCenter , didReceive response : UNNotificationResponse , withCompletionHandler completionHandler : @escaping ( ) -> Void ) {
let handled = KlaviyoSDK ( ) . handle ( notificationResponse : response , withCompletionHandler : completionHandler ) { url in
print ( " deep link is " , url )
}
if !handled {
// not a klaviyo notification should be handled by other app code
}
}
}
لاحظ أنه سيتم استدعاء معالج الارتباط العميق مرة أخرى في الخيط الرئيسي. إذا كنت ترغب في التعامل مع مخططات URL بالإضافة إلى الروابط الشاملة التي تنفذها كما هو موضح في الخيار 1: مخططات URL.
يتم دعم إشعارات الدفع الغنية في SDK الإصدار 2.2.0 وأعلى
الدفع الغني هو القدرة على إضافة صور لدفع رسائل الإخطار. بمجرد اكتمال الخطوات في قسم التثبيت ، يجب أن يكون لديك امتداد خدمة إشعار في إعداد مشروعك مع الرمز من KlaviyoSwiftExtension
. فيما يلي تعليمات حول كيفية اختبار إشعارات الدفع الغنية.
{
"aps" : {
"alert" : {
"title" : " Free apple vision pro " ,
"body" : " Free Apple vision pro when you buy a Klaviyo subscription. "
},
"mutable-content" : 1
},
"rich-media" : " https://www.apple.com/v/apple-vision-pro/a/images/overview/hero/portrait_base__bwsgtdddcl7m_large.jpg " ,
"rich-media-type" : " jpg "
}
didRegisterForRemoteNotificationsWithDeviceToken
في AppDelegate
.بمجرد حصولك على هذه الأشياء الثلاثة ، يمكنك بعد ذلك استخدام اختبار إشعار الدفع وإرسال إشعار دفع محلي للتأكد من أن كل شيء قد تم إعداده بشكل صحيح.
دعم صندوق الرمل متاح في SDK الإصدار 2.2.0 وأعلى
لدى Apple بيئتان مع دعم إشعار الدفع - الإنتاج وصندوق الرمل. تدعم بيئة الإنتاج إرسال إشعارات الدفع للمستخدمين الحقيقيين عند نشر تطبيق في متجر التطبيقات أو TestFlight. في المقابل ، فإن تطبيقات صندوق الرمل التي تدعم إشعارات الدفع هي تلك الموقعة مع شهادات تطوير iOS ، بدلاً من شهادات توزيع iOS. يعمل Sandbox كبيئة انطلاق ، مما يسمح لك باختبار تطبيقاتك في بيئة مماثلة ولكن متميزة عن الإنتاج دون الحاجة إلى القلق بشأن إرسال الرسائل إلى المستخدمين الحقيقيين.
يدعم SDK لدينا استخدام صندوق الرمل للدفع كذلك. ستحدد SDK من Klaviyo وتخزين البيئة التي ينتمي إليها الرمز المميز الخاص بك إلى الواجهة الخلفية الخاصة بنا ، مما يتيح لترسل الرموز الخاصة بك أن ترسل إلى البيئات الصحيحة. لا يوجد إعداد إضافي مطلوب. طالما قمت بنشر تطبيقك إلى Sandbox من خلال استخدام SDK لدينا لنقل الرموز المميزة إلى الواجهة الخلفية لدينا ، يجب أن تعمل القدرة على إرسال وتلقي تطبيقات صندوق الرمل هذه خارج الصندوق.
بدءًا من الإصدار 1.7.0 ، ستقوم SDK بتخزين البيانات الواردة وتدفقها إلى API Klaviyo على فاصل. يعتمد الفاصل الزمني على رابط الشبكة المستخدم حاليًا بواسطة التطبيق. يوضح الجدول أدناه الفاصل الزمني للتدفق المستخدم لكل نوع من التوصيل:
شبكة | فاصلة |
---|---|
wwan/wifi | 10 ثوان |
الخلوية | 30 ثانية |
يعتمد تحديد الاتصال على الإخطارات من خدمة الوصول لدينا. عندما لا تتوفر شبكة ، ستقوم SDK بتخزين بيانات حتى تصبح الشبكة متاحة مرة أخرى. يجب أن تكون جميع البيانات المرسلة من قبل SDK متوفرة بعد فترة وجيزة من مسحها بواسطة SDK.
ستقوم SDK بإعادة محاولة طلبات API التي تفشل في ظل ظروف معينة. على سبيل المثال ، في حالة حدوث مهلة الشبكة ، سيتم إعادة محاكمة الطلب على الفاصل الزمني القادم. بالإضافة إلى ذلك ، إذا تلقى SDK خطأ في الحد من 429
من API Klaviyo ، فسيستخدم التراجع الأسي مع jitter لإعادة محاولة الطلب التالي.
راجع الدليل المساهم لمعرفة كيفية المساهمة في Klaviyo Swift SDK. نرحب بتعليقاتك في قسم القضايا في مستودع GitHub العام الخاص بنا.
Klaviyoswift متاح تحت رخصة معهد ماساتشوستس للتكنولوجيا. انظر ملف الترخيص لمزيد من المعلومات.