Arabic (العربية/عربي) translation by B9 (you can also view the original English article)



المقدمة
"التطبيقات مدمجة المزايا" هي خاصية رائعة لكل مطورين التطبيقات الذين يرغبون في الحصول على الكثير من الأرباح المادية وتقديم محتوى ومزايا اضافية من خلال تطبيقاتهم. مثلاً في تطبيقات الألعاب، بإمكانك شراء جواهر أو عملات، وفي تطبيقات التصوير الفوتوغرافي بإمكانك اتاحة تأثيرات أو أدوات جديدة للمستخدمين. وتستطيع فعل كل ذلك من خلال استخدام بطاقة ائتمانية أو أي وسيلة دفع أخرى بدون الخروج من التطبيق.
في هذا الدرس سأقوم بتغطية كل الخطوات الضرورية لعمل هذا النوع من التطبيقات القابلة للاستعمال مرة واحدة أو قابلة للاستعمال مرات عديدة عن طريق متجر آي تونز كونكت، وسأريك الشيفرة البرمجية التي ستحتاجها لشراء هذان النوعان من التطبيقات. لقد قمت بعمل مشروع بسيط باستخدام برنامج إكس كود بوسم واحد وزرّين للضغط، لذلك قم بتحميل برنامج إكس كود وقم بمتابعة الخطوات في هذا الدرس لتفهم جيداً كيف يعمل البرنامج.
البدء بعمل مُخْتَبِر برنامج ساندبوكس في متجر آي تونز كونكت
أفترض أنك قمت تلقائياً بعمل تطبيق iOS ووضعته في قسم My Apps في متجر الآي تونز كونكت. وأول شئ يجب أن تقوم به هو اعداد مُخْتَبِر برنامج الساندبوكس ليقوم باختبار تطبيقك ذو المزايا المدمجة على جهازك الحقيقي (لا تجرب النظام المحاكي "الوهمي" لأنه لا يدعم التطبيقات مدمجة المزايا)
ادخل إلى Users and Roles ثم اذهب إلى تبويبة Sandbox Tester ثم اضغط على علامة (+) بالقرب من المُختَبِر الأول Tester



قم بتعبئة النموذج ليتم اضافة مختبر ساندبوكس جديد. وبعد أن تنتهي من حفظ المعلومات، عد مرةً أخرى إلى قسم My App واضغط على أيقونة التطبيق الخاص بك لادخال بيانات التطبيق وعمل منتجات التطبيقات مدمجة المزايا.
البدء بتجهيز منتجات التطبيقات مدمجة المزايا في متجر الآي تونز كونكت
التطبيقات ذات الاستعمال المتكرر
اذهب إلى تبويبة Features ثم اضغط على علامة (+) بالقرب من In-App Purchases بإمكانك عمل تطبيق واحد فقط في المرة الواحدة ولذلك سنبدأ ب Consumable التطبيق ذو الاستعمال المتكرر.



التطبيقات المدمجة المزايا ذات الاستخدام المتكرر Consumable، وكما هو واضح من اسمها فهي منتجات بالإمكان استخدامها لمرات عديدة. وسنستخدمها لكي نجمع "عملات" اضافية في نسخة التطبيق الترويجية.
اضغط على زر Create لتبدأ في التمهيد لتطبيقك. في الشاشة التالية، سيمكنك من اعداد كل المعلومات المطلوبة عن منتجك:
- Reference Name: "الاسم المرجعي" هذا الإسم سيتم استخدامه في متجر آي تونز كونكت وأيضاً في تقارير المبيعات والشيوع Sales and Trends. ولن يكون ظاهراً في متجر التطبيقات، وبإمكانك أن تضع أي اسم ترغب به ولكن لا يمكنك أن تضع اسماً يزيد عن 64 حرف.
- Product ID: "مُعَرّف المنتج" هو معرّف حرفي رقمي مميز سيتم إعداده من التطبيق نفسه ليتم تمييز تطبيقك في المتجر. عادةً يستخدم المطورون النص البرمجي web-reverse لتعريف المنتج. وفي هذا المثال قمنا باختيار هذه العبارة كتعريف للمنتج com.iaptutorial.coins ولاحقاً سنقوم بلصق هذا المُعَرّف كسلسلة نصية لشيفرتنا البرمجية
- Price: "السعر" اختر مستوى سعر من القائمة المنسدلة في المتجر وتذكر أنه من أجل أن تستطيع بيع منتجك التطبيقي مدمج المزايا في متجر التطبيقات فإن عليك أن تخضع للموافقة على الاتفاقية الخاصة بالتطبيقات المدفوعة Paid Application Agreement في قسم الاتفاقيات والضرائب والبنوك Agreements, Tax & Banking .
- Localizations: "الموقع" من أجل هذا الدرس فقط قمنا باختيار اللغة الإنجليزية، ولكن بإمكانك اضافة لغات أخرى بالضغط على زر ال (+). ثم اكتب الاسم الظاهر في خانة Display Name وأضف وصف لمنتجك في خانة Description كلا الاثنان الاسم الظاهر والوصف سيظهران للجميع في متجر التطبيقات.
- Screenshot: "لقطة شاشة" قم برفع لقطة شاشة من التطبيق ليتم مراجعتها. ولن تظهر في متجر التطبيقات ويجب أن تكون ذات مقاس صحيح يناسب منصة تطبيقك ولذلك إن كان تطبيقك عالمي فبإمكانك رفع لقطة شاشة لجهاز آي باد.
- Review Notes : "ملاحظات للمراجعة" أي معلومات اضافية يمكنك تقديمها عن تطبيقك مدمج المزايا بالإمكان أن تكون جدّ مفيدة للشخص المراجع للتطبيق.



متى ما انتهيت، اضغط زر Save للحفظ ومن ثم ستظهر لك هذه الرسالة:
تطبيقك الأول مدمج المزايا يجب أن ارساله مع نسخة تطبيق جديدة. قم باختيار هذه النسخة من قسم In-App Purchases ثم اضغط زر الإرسال submit.
التطبيقات ذات استعمال مرة واحدة
قم الآن بالضغط على زر In-App Purchases في القائمة اليسرى وأعلى مباشرة زر Game Center، وقم باضافة منتج مدمج المزايا جديد. هذه المرة سنختار خيار Non-Consumable "استعمال مرة واحدة":



اضغط على زر Create وقم بعمل نفس الخطوات التي قمنا بها سابقاً في الأعلى. وبما أن التطبيق سيكون Non-Consumable فسيتمكن المستخدمون من شرائه مرة واحدة فقط ولذلك تطلب أبل بتوفير القدرة على حفظ واستعادة هذا النوع من عمليات الشراء. وذلك يحدث عنما تقوم بإلغاء تثبيت التطبيق ثم تقوم بتثبيته مرة أخرى أو قد يحدث ذلك عندما تقوم بتحميل التطبيق من جهاز آخر وتستخدم معرّف أبل الخاص بك Apple ID وتحتاج أن تستعيد مشترياتك بدلاً من أن تدفع مرتين. ولذلك سنقوم لاحقاً باضافة خاصية Restore Purchase "استعادة المشتريات"
في شيفرتنا البرمجية.
مُعرّف المنتج الذي وضعناه هنا هو com.iaptutorial.premium مع مستوى سعر $2.99. وقمنا بتسميته "تفعيل النسخة المدفوعة" Unlock Premium Version .
متى ما انتهيت من ملء كل الحقول، قم بحفظ منتجك ثم عد مرة أخرى إلى صفحة In-App Purchases. والآن يجب أن يكون لديك قائمة بها اثنان من منتجاتك، مع الاسم Name ، النوع Type ، التعريف ID ، الحالة Status وبجوارهم جاهز للإرسال Ready to Submit.



عد مرة أخرى لصفحة تطبيقاتك وذلك بالضغط على App Store ثم زر Prepare for Submission. انتقل للأسفل إلى قسم In-App Purchases، ستجد في الأسفل مباشرة General App Information ثم قم بالضغط على زر (+) لتضيف تطبيقاتك مدمجة المزايا.



قم باختيار جميع الخيارات ثم اضغط على زر Done.



وأخيراً، اضغط زر الحفظ Save في أعلى الزاوية اليمنى من الشاشة وستكون قد انتهيت تماماً من تهيئة منتجاتك التطبيقية مدمجة المزايا في متجر آي تونز كونكت.
تسجيل الدخول إلى مُختّبر ساندبوكس في جهاز iOS
قبل أن تحصل على الشيفرة البرمجية لازال هناك أمر آخر يجب عليك أن تفعله. اذهب إلى Settings > iTunes & App Store على جهازك iOS. في حال قمت بتسجيل دخولك عبر معرّف أبل الخاص بك، قم باختياره واضغط على Sign Out لتسجيل الخروج. ثم بكل بساطة قم بالدخول مرة أخرى ببيانات التصديق التي قمت بعملها لمُختَبِر ساندبوكس بعد أن تقوم بتسجيل الدخول ستظهر لك هذه الرسالة:
قم بتجاهل هذه الرسالة واضغط زر Cancel. سيقوم جهازك بسؤالك مرة أخرى عن بيانات تسجيل الدخول الخاصة بساندبوكس أثناء محاولتك للقيام بعملية شراء وسينتبه أنك تقوم بعملية شراء من حساب لاختبار التطبيق ولذلك تأكد بأنك لن تدفع قرش واحدة من بطاقتك الإئتمانية لأي عمليات شرائية تقوم بها في التطبيق.
اخرج من Settings "الاعدادات"، قم بوصل جهازك iOS بجهاز ماكنتوش عبر سلك USB ولنبدأ أخيراً بإعداد الشيفرات البرمجية.
الشفيرة البرمجية
في حال كنت قد قمت بتحميل نسختنا الترويجية، فسترى أن جميع الشيفرات البرمجية المطلوبة لشراء التطبيقات مدمجة المزايا مكتوبة عليها ولذلك إن قمت بتشغيل التطبيق فسيظهر لك التالي:
في حال رغبت باختبار التطبيق فعليك أن تقوم بتغيير Bundle Identifier إلى معرّفك الخاص. وإلاّ فإن برنامج إكس كود لن يسمح لك بتشغيل التطبيق على جهاز حقيقي ولن يقوم التطبيق بتمييز التطبيقين المدمجين المزايا الذي قمت بصنعهما.
قم بإدخال الشيفرة التالية ViewController.swift ثم قم بفحصها. قبل كل شئ لقد قمنا باضافة جملة برمجية مستوردة لـ StoreKit
وللتفويض الذي سنحتاجه من أجل تتبع حركات الدفع وطلبات المنتج.
1 |
import StoreKit |
2 |
|
3 |
class ViewController: UIViewController, |
4 |
SKProductsRequestDelegate, |
5 |
SKPaymentTransactionObserver
|
6 |
{
|
بعد ذلك قمنا بالإعلان عن عدد من المشاهدات والتي ستكون مفيدة جداً.
1 |
/* Views */
|
2 |
@IBOutlet weak var coinsLabel: UILabel! |
3 |
@IBOutlet weak var premiumLabel: UILabel! |
4 |
@IBOutlet weak var consumableLabel: UILabel! |
5 |
@IBOutlet weak var nonConsumableLabel: UILabel! |
6 |
الشيفرات التالية coinsLabel
و premiumLabel
سيتم استخدامهما لعرض نتائج عمليات الشراء للتطبيقين. consumableLabel
و nonConsumableLabel
ستقوم بعرض
الوصف والسعر لكل تطبيق مدمج المزايا قمنا بعمله داخل آي تونز كونكت مسبقاً.
حان الوقت لإضافة بعض من المتغيرات البرمجية:
1 |
/* Variables */
|
2 |
let COINS_PRODUCT_ID = "com.iaptutorial.coins" |
3 |
let PREMIUM_PRODUCT_ID = "com.iaptutorial.premium" |
4 |
|
5 |
var productID = "" |
6 |
var productsRequest = SKProductsRequest() |
7 |
var iapProducts = [SKProduct]() |
8 |
var nonConsumablePurchaseMade = UserDefaults.standard.bool(forKey: "nonConsumablePurchaseMade") |
9 |
var coins = UserDefaults.standard.integer(forKey: "coins") |
10 |
السطران الأولان لاستدعاء تعاريف المنتج. من المهم جداً أن تكون هذه السلاسل النصية متطابقة مع المكتوبة في قسم In-App
Purchase في متجر آي تونز كونكت.
-
productID
هو سلسلة نصية سيتم استخدامها لاحقاً لمعرفة أي التطبيقات سنقوم باختيارها للشراء. -
productsRequest
هو حالة منSKProductsRequest
، ضروري للبحث عن تطبيقات مدمجة المزايا في قسم "تطبيقاتك" الموجود على آيتونز كونكت. - i
apProducts
هو مصفوفة بسيطة من SKProducts.
رجاءاً انتبه أن بادئة SK تعني StoreKit، إذ سيقوم بنية نظام الـ iOS باستخدامه ليتدبر عمليات الشراء.
آخر سطرين يحملان متغيرين من نوع Boolean
و Integer
وهما ضروريان لتتبع عمليات شراء العملات وشراء النسخة المدفوعة، على التوالي للتطبيقات ذو الاستعمال المتكرر والاستعمال مرة واحدة.
الشيفرة البرمجية التالية الموجودة في viewDidLoad()
ستقوم بأداء بعض الأشياء حالما يبدأ التطبيق في البدء:
1 |
// Check your In-App Purchases
|
2 |
print("NON CONSUMABLE PURCHASE MADE: \(nonConsumablePurchaseMade)") |
3 |
print("COINS: \(coins)") |
4 |
|
5 |
// Set text
|
6 |
coinsLabel.text = "COINS: \(coins)" |
7 |
|
8 |
if nonConsumablePurchaseMade { premiumLabel.text = "Premium version PURCHASED!" |
9 |
} else { premiumLabel.text = "Premium version LOCKED!"} |
10 |
|
11 |
// Fetch IAP Products available
|
12 |
fetchAvailableProducts() |
لقد قمنا أولاً بتسجيل كل عملية شراء في وحدة تحكم الإكس كود. ومن ثم قمنا باظهار العدد الكلي للعملات التي قمنا بشرائها بشيفرة coinsLabel
وبما أننا نعمل على نسخة ترويجية فسيظهر لنا للمرة الأولى أن عدد العملات = صفر
الجملة الشرطية if
ستقوم بإعداد نص الـ premiumLabel
بحسب ما إذا تم شراء المنتج ذو استعمال مرة واحدة. ولكي يبدأ، سيقوم بإظهار عبارة Premium version LOCKED! طالما لم نقم بشراء النسخة المدفوعة حتى الآن.
السطر الأخير من الشيفرة يقوم باستدعاء دالة سنراها لاحقاً، والتي ببساطة ستقوم بإحضار المنتج الذي قمنا بتخزينه في متجر آي تونز كونكت.
والآن هيا لنرى ما الذي ستقوم به أزرار الشراء التي قمنا بإعدادها في نسخة التطبيق الترويجية:
1 |
// MARK: - BUY 10 COINS BUTTON
|
2 |
@IBAction func buy10coinsButt(_ sender: Any) { |
3 |
purchaseMyProduct(product: iapProducts[0]) |
4 |
}
|
5 |
|
6 |
|
7 |
// MARK: - UNLOCK PREMIUM BUTTON
|
8 |
@IBAction func unlockPremiumButt(_ sender: Any) { |
9 |
purchaseMyProduct(product: iapProducts[1]) |
10 |
}
|
كلا الدالتين ستقوم باستدعاء تابع وظيفي سيقوم هذا التابع بتفحص إن كان يستطيع هذا الجهاز بالقيام بعمليات شراء، وفي حال لم يكن يستطيع فإن التطبيق سيقوم باستدعاء دوال التفويض الخاصة بـ StoreKit للقيام بعملية الشراء.
وكما ذكرنا سابقاً، نحن بحاجة إلى زر ثالث لإستعادة مشتريات التطبيق ذو استعمال مرة واحدة. وهذه هي الشيفرة البرمجية:
1 |
// MARK: - RESTORE NON-CONSUMABLE PURCHASE BUTTON
|
2 |
@IBAction func restorePurchaseButt(_ sender: Any) { |
3 |
SKPaymentQueue.default().add(self) |
4 |
SKPaymentQueue.default().restoreCompletedTransactions() |
5 |
}
|
6 |
|
7 |
func paymentQueueRestoreCompletedTransactionsFinished(_ queue: SKPaymentQueue) { |
8 |
nonConsumablePurchaseMade = true |
9 |
UserDefaults.standard.set(nonConsumablePurchaseMade, forKey: "nonConsumablePurchaseMade") |
10 |
|
11 |
UIAlertView(title: "IAP Tutorial", |
12 |
message: "You've successfully restored your purchase!", |
13 |
delegate: nil, cancelButtonTitle: "OK").show() |
14 |
}
|
15 |
التابع الوظيفي IBAction
، متصل بزر استعادة عملية الشراء Restore Purchase الموجود في Storyboard ومن ثم يبدأ بالاتصال بنظام In-App Purchase الخاص بمتجر أبل لاستعادة عملية الشراء في حال كانت تمت مسبقاً.
()paymentQueueRestoreCompletedTransactionsFinished
هي الدالة المفوضة من قبل بنية نظام StoreKit والتي ستقوم بحفظ متغيرنا البرمجي nonConsumablePurchaseMade
إلى الصواب بعد أن تتم استعادة عملية الشراء بنجاح.
وقد انتهينا من الأزار، هيا لنرى ماذا سيقوم به التابع الوظيفي التالي()fetchAvailableProducts
1 |
// MARK: - FETCH AVAILABLE IAP PRODUCTS
|
2 |
func fetchAvailableProducts() { |
3 |
|
4 |
// Put here your IAP Products ID's
|
5 |
let productIdentifiers = NSSet(objects: |
6 |
COINS_PRODUCT_ID, |
7 |
PREMIUM_PRODUCT_ID
|
8 |
)
|
9 |
|
10 |
productsRequest = SKProductsRequest(productIdentifiers: productIdentifiers as! Set<String>) |
11 |
productsRequest.delegate = self |
12 |
productsRequest.start() |
13 |
}
|
14 |
أولاً قمنا بعمل حالة من NSSet
والتي هي في الأساس مصفوفة سلاسل نصية. سنقوم بحفظ تعاريف المنتج الذي قمنا بالتصريح عنه مسبقاً.
ومن ثم قمنا ببدء SKProductsRequest
اعتماداً على هذه المعرفات، من
أجل أن يقوم التطبيق بعرض المعلومات عن منتجات التطبيقات مدمجة المزايا أي ( الوصف والسعر)، والتي ستتم من خلال الدالة المفوضة التالية:
1 |
// MARK: - REQUEST IAP PRODUCTS
|
2 |
func productsRequest (_ request:SKProductsRequest, didReceive response:SKProductsResponse) { |
3 |
if (response.products.count > 0) { |
4 |
iapProducts = response.products |
5 |
|
6 |
// 1st IAP Product (Consumable) ------------------------------------
|
7 |
let firstProduct = response.products[0] as SKProduct |
8 |
|
9 |
// Get its price from iTunes Connect
|
10 |
let numberFormatter = NumberFormatter() |
11 |
numberFormatter.formatterBehavior = .behavior10_4 |
12 |
numberFormatter.numberStyle = .currency |
13 |
numberFormatter.locale = firstProduct.priceLocale |
14 |
let price1Str = numberFormatter.string(from: firstProduct.price) |
15 |
|
16 |
// Show its description
|
17 |
consumableLabel.text = firstProduct.localizedDescription + "\nfor just \(price1Str!)" |
18 |
// ------------------------------------------------
|
19 |
|
20 |
|
21 |
|
22 |
// 2nd IAP Product (Non-Consumable) ------------------------------
|
23 |
let secondProd = response.products[1] as SKProduct |
24 |
|
25 |
// Get its price from iTunes Connect
|
26 |
numberFormatter.locale = secondProd.priceLocale |
27 |
let price2Str = numberFormatter.string(from: secondProd.price) |
28 |
|
29 |
// Show its description
|
30 |
nonConsumableLabel.text = secondProd.localizedDescription + "\nfor just \(price2Str!)" |
31 |
// ------------------------------------
|
32 |
}
|
33 |
}
|
34 |
كما نرى في الوظيفة في الأعلى، علينا أولاً أن نتفحص إن كان هناك منتجات أخرى مسجلة في متجر آي تونز كونكت ومن ثم نقوم بإعداد مصفوفتنا iapProducts
وفقاً لذلك. ثم بعد ذلك نستطيع تمهيد SKProducts للمنتجين وطباعة أوصافهما وسعرهما على الوسوم.
وقبل أن ندخل في صلب شيفرة شراء التطبيق مدمج المزايا، نحن بحاجة إلى اثنان من التوابع الوظيفية:
1 |
// MARK: - MAKE PURCHASE OF A PRODUCT |
2 |
func canMakePurchases() -> Bool { return SKPaymentQueue.canMakePayments() } |
3 |
func purchaseMyProduct(product: SKProduct) { |
4 |
if self.canMakePurchases() { |
5 |
let payment = SKPayment(product: product) |
6 |
SKPaymentQueue.default().add(self) |
7 |
SKPaymentQueue.default().add(payment) |
8 |
|
9 |
print("PRODUCT TO PURCHASE: \(product.productIdentifier)") |
10 |
productID = product.productIdentifier |
11 |
|
12 |
|
13 |
// IAP Purchases dsabled on the Device |
14 |
} else { |
15 |
UIAlertView(title: "IAP Tutorial", |
16 |
message: "Purchases are disabled in your device!", |
17 |
delegate: nil, cancelButtonTitle: "OK").show() |
18 |
} |
19 |
} |
التابع الوظيفي الأول سيقوم بتفحص إن كان جهازنا قادراً على القيام بعمليات شراء. أما الثاني فهو الذي نقوم باستدعائه من خلال الزرين الإثنين. حيث يقوم ببدء طابور الدفع ويقوم بتغيير المتغير الخاص بنا productID
إلى productIdentifier
الذي تم اختياره.
وها نحن أخيراً نعود إلى الدالة المفوضة الأخيرة، والمسؤولة عن معالجة نتائج الدفع.
1 |
// MARK:- IAP PAYMENT QUEUE
|
2 |
func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) { |
3 |
for transaction:AnyObject in transactions { |
4 |
if let trans = transaction as? SKPaymentTransaction { |
5 |
switch trans.transactionState { |
6 |
|
7 |
case .purchased: |
8 |
SKPaymentQueue.default().finishTransaction(transaction as! SKPaymentTransaction) |
9 |
|
10 |
// The Consumable product (10 coins) has been purchased -> gain 10 extra coins!
|
11 |
if productID == COINS_PRODUCT_ID { |
12 |
|
13 |
// Add 10 coins and save their total amount
|
14 |
coins += 10 |
15 |
UserDefaults.standard.set(coins, forKey: "coins") |
16 |
coinsLabel.text = "COINS: \(coins)" |
17 |
|
18 |
UIAlertView(title: "IAP Tutorial", |
19 |
message: "You've successfully bought 10 extra coins!", |
20 |
delegate: nil, |
21 |
cancelButtonTitle: "OK").show() |
22 |
|
23 |
|
24 |
|
25 |
// The Non-Consumable product (Premium) has been purchased!
|
26 |
} else if productID == PREMIUM_PRODUCT_ID { |
27 |
|
28 |
// Save your purchase locally (needed only for Non-Consumable IAP)
|
29 |
nonConsumablePurchaseMade = true |
30 |
UserDefaults.standard.set(nonConsumablePurchaseMade, forKey: "nonConsumablePurchaseMade") |
31 |
|
32 |
premiumLabel.text = "Premium version PURCHASED!" |
33 |
|
34 |
UIAlertView(title: "IAP Tutorial", |
35 |
message: "You've successfully unlocked the Premium version!", |
36 |
delegate: nil, |
37 |
cancelButtonTitle: "OK").show() |
38 |
}
|
39 |
|
40 |
break
|
41 |
|
42 |
case .failed: |
43 |
SKPaymentQueue.default().finishTransaction(transaction as! SKPaymentTransaction) |
44 |
break
|
45 |
case .restored: |
46 |
SKPaymentQueue.default().finishTransaction(transaction as! SKPaymentTransaction) |
47 |
break
|
48 |
|
49 |
default: break |
50 |
}}} |
51 |
}
|
التابع الوظيفي هذا لديه switch
وهي جملة برمجية تقوم بتفحص حالة كل عملية دفع. case
الأولى ستحصل على استدعاء في حال تمت عملية الشراء بنجاح واكتملت عملية التحويل المالي.
بداخل هذه الكتلة البرمجية، علينا تفحص أي معرف منتج قمنا باختياره ومن ثم القيام بالأمور الضرورية لتحديث التطبيق، لذلك في حال نحن المستخدمين قمنا بشراء 10 عملات اضافية، سنقوم باضافة الرقم 10 إلى متغير coins
الخاص بنا، وسنحفظ قيمته باستخدام UserDefaults
ليظهر العدد الجديد للعملات التي كسبناها ويُطلق تنبيهاً عنه.
رجاءاً انتبه أن بإمكانك القيام بعملية الشراء هذه لمرات كثيرة بدون حدود بما أن التطبيق ذو استعمال متعدد، ولا حاجة لتابع وظيفي لاستعادة المشتريات.
وبنفس الطريقة، في حال قمنا بشراء النسخة المدفوعة من المنتج ذو استعمال مرة واحدة، فإن التطبيق سيقوم بإعداد متغير nonConsumablePurchaseMade
إلى true
الصواب، ثم يحفظه ويغير نص premiumLabel
ويطلق تنبيه ليعلمك أن عملية الشراء تمت بنجاح.
الـ cases
الإثنان الأخريان سيتولان نتائج الدفع عند الفشل أو الاستعادة وسيطلق التطبيق بمفرده تنبيه مخصص في حال فشلت عملية التحويل المالي لأسباب معينة أو في حالة قمت باسترجاع عملية شراء سابقة لتطبيق ذو استعمال مرة واحدة.
هذا هو! والآن تأكد من تسجيل دخولك ببيانات مُختبر ساندبوكس وقم بتشغيل التطبيق لاختباره. في أول مرة ستظهر لك هذه الرسالة:
قم باختيار Use Existing Apple ID ثم أدخل اسم المستخدم والرقم السري لمُختبر ساندبوكس مرة أخرى لتتمكن من تسجيل الدخول. ويحدث هذا بسبب قدرة التطبيق على معرفة المستخدم الحقيقي من اعدادات المتجر iTunes & App Store وليس مستخدم ساندبوكس.
بمجرد أن تتم عملية الدخول ستكون قادراً على القيام بعمليات الشراء لكلا المنتجين.






نماذج CodeCanyon
في حال كنت تعمل مع أنظمة iOS وأردت أن تتعمق أكثر في لغة السويفت وتطوير التطبيقات، بإمكانك مراجعة نماذج تطبيقاتي iOS على موقع CodeCanyon
هناك المئات من نماذج أخرى لتطبيقات iOS على متجر Envato أيضاً، جاهزة لإعادة البناء وتضمن لك تسريع عملك. قم باختبارها! فقد توفر على نفسك الكثير من الساعات في بناء تطبيقك التالي.
الخاتمة:
في هذا الدرس، قمنا بتغطية كل الخطوات المطلوبة لبناء منتجات التطبيقات مدمجة المزايا في متجر آي تونز كونكت وكيف تقوم بكتابة الشيفرة البرمجية لتفعيلها في تطبيقك. آمل أنك ستستطيع أن تضع هذه المعلومات للاستخدام في تطبيقك الـ iOS التالي!
شكراً لقراءتك المقال، آراك مرة أخرى! وأرجوك أن تقوم بالإطلاع على دوراتنا التدريبية ودروسنا عن تطوير تطبيقات iOS باستخدام لغة السويفت.