ما هو StoreKit ولماذا تحتاجه؟
StoreKit هو إطار عمل مدمج من Apple، مصمم لتنفيذ عمليات الشراء داخل التطبيق (In-App Purchases) والاشتراكات في تطبيقات iOS وmacOS وwatchOS وtvOS. يوفر للمطورين واجهة موحدة للتفاعل مع App Store: طلب المنتجات، معالجة المعاملات، التحقق من صلاحيات الوصول، وإدارة الاشتراكات.
المهام الرئيسية التي يحلها StoreKit:
- تحقيق الدخل — بيع المنتجات الرقمية (وصول مميز، عملة افتراضية، محتوى).
- إدارة الاشتراكات — التجديد التلقائي، الحالات، الفترات التجريبية.
- الأمان — معالجة المدفوعات عبر App Store دون نقل بيانات البطاقة المصرفية للمطور.
- استعادة المشتريات — يمكن للمستخدم نقل مشترياته إلى جهاز آخر.
من المهم أن تفهم: StoreKit ليس مكتبة خارجية، بل جزء من Xcode SDK. لا تحتاج إلى تثبيته بشكل منفصل، لكن يجب إعداده في App Store Connect وإضافته إلى المشروع.
التثبيت والإعداد
نظرًا لأن StoreKit هو إطار عمل نظامي، فإن تثبيته يقتصر على ربطه في مشروع Xcode:
- افتح مشروعك في Xcode.
- اختر الهدف (تطبيقك) → علامة التبويب "General".
- انتقل إلى قسم "Frameworks, Libraries, and Embedded Content".
- اضغط على "+" واختر StoreKit.framework.
- تأكد من أن حالة "Embed" مضبوطة على "Do Not Embed".
بعد ذلك، قم باستيراد الإطار في الملفات المطلوبة:
import StoreKit
كما يجب عليك إعداد المنتجات في App Store Connect:
- أنشئ معرفات المنتجات (مثل
com.example.premium). - حدد السعر، التوطين، النوع (قابل للاستهلاك/غير قابل للاستهلاك/اشتراك).
- للاشتراكات، قم بإعداد المجموعات والفترات التجريبية.
بداية سريعة مع مثال برمجي
مثال عملي بسيط لطلب منتج وشرائه:
import StoreKit
class StoreManager: NSObject, SKProductsRequestDelegate, SKPaymentTransactionObserver {
static let shared = StoreManager()
private var products: [SKProduct] = []
override private init() {
super.init()
SKPaymentQueue.default().add(self)
}
// 1. طلب المنتجات
func fetchProducts(productIDs: Set<String>) {
let request = SKProductsRequest(productIdentifiers: productIDs)
request.delegate = self
request.start()
}
// 2. تفويض استلام المنتجات
func productsRequest(_ request: SKProductsRequest, didReceive response: SKProductsResponse) {
self.products = response.products
for product in products {
print("تم العثور على منتج: \(product.localizedTitle) — \(product.price)")
}
}
// 3. الشراء
func purchase(product: SKProduct) {
let payment = SKPayment(product: product)
SKPaymentQueue.default().add(payment)
}
// 4. معالجة المعاملات
func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {
for transaction in transactions {
switch transaction.transactionState {
case .purchased:
// فتح المحتوى
print("تمت عملية الشراء بنجاح: \(transaction.payment.productIdentifier)")
SKPaymentQueue.default().finishTransaction(transaction)
case .failed:
if let error = transaction.error {
print("خطأ في الشراء: \(error.localizedDescription)")
}
SKPaymentQueue.default().finishTransaction(transaction)
case .restored:
print("تمت استعادة الشراء")
SKPaymentQueue.default().finishTransaction(transaction)