العمل مع S3 والتخزين السحابي في Swift (iOS/macOS)
في تطوير التطبيقات الحديثة للهواتف المحمولة وأجهزة سطح المكتب باستخدام Swift، غالباً ما تنشأ الحاجة لتخزين ونقل كميات كبيرة من البيانات: الصور، الفيديوهات، مستندات المستخدمين. Amazon S3 (Simple Storage Service) هو أحد أشهر الحلول السحابية لهذه المهام. في هذه المقالة، سنشرح كيفية دمج S3 في تطبيقات Swift لنظامي iOS وmacOS باستخدام SDK الرسمي من أمازون — AWSS3، بالإضافة إلى استعراض نهج أعلى مستوى من خلال إطار العمل Amplify.
لماذا نحتاج S3 في تطبيقات Swift؟
يوفر S3 تخزيناً قابلاً للتوسع وآمناً ومنخفض التكلفة للكائنات. استخدام S3 في Swift يتيح:
- تفريغ عبء تخزين الملفات من الجهاز إلى السحابة.
- ضمان الوصول إلى البيانات من أي جهاز للمستخدم.
- استخدام آليات التشفير والتحكم في الوصول المدمجة.
- التكامل مع خدمات AWS الأخرى (Lambda, Cognito, CloudFront).
إعداد البيئة
للبدء، ستحتاج إلى:
- حساب AWS وحاوية S3 منشأة.
- Xcode 14+ ومشروع Swift (iOS 15+ / macOS 12+).
- تثبيت التبعيات عبر Swift Package Manager (SPM).
تثبيت AWSS3 عبر SPM
أضف الحزمة في Package.swift أو عبر واجهة Xcode:
// File → Add Packages → بحث: https://github.com/aws-amplify/aws-sdk-ios-spm// اختر "AWSS3" من قائمة المنتجات.في الكود، استورد المكتبة:
import AWSS3مثال أساسي: رفع ملف إلى S3
لنستعرض سيناريو بسيطاً — رفع صورة من معرض المستخدم. للمصادقة، يُستخدم Cognito Identity Pool، لكن في وضع الاختبار يمكن تمرير المفاتيح مباشرة (غير موصى به للإنتاج).
تهيئة الخدمة
let credentialsProvider = AWSStaticCredentialsProvider( accessKey: "YOUR_ACCESS_KEY", secretKey: "YOUR_SECRET_KEY")let configuration = AWSServiceConfiguration( region: .USEast1, credentialsProvider: credentialsProvider)AWSServiceManager.default().defaultServiceConfiguration = configurationرفع الملف (upload)
func uploadImageToS3(imageData: Data, bucketName: String, key: String) { let request = AWSS3TransferManagerUploadRequest()! request.bucket = bucketName request.key = key request.body = imageData request.contentLength = Int64(imageData.count)
let transferManager = AWSS3TransferManager.default() transferManager?.upload(request).continueWith { task -> Any? in if let error = task.error { print("خطأ في الرفع: \\(error.localizedDescription)") } else { print("تم رفع الملف بنجاح: \\(bucketName)/\\(key)") } return nil }}تنزيل الملف (download)
func downloadFromS3(bucketName: String, key: String, localURL: URL) { let request = AWSS3TransferManagerDownloadRequest()! request.bucket = bucketName request.key = key request.downloadingFileURL = localURL
let transferManager = AWSS3TransferManager.default() transferManager?.download(request).continueWith { task -> Any? in if let error = task.error { print("خطأ في التنزيل: \\(error.localizedDescription)") } else { print("تم حفظ الملف في \\(localURL.path)") } return nil }}استخدام Amplify Storage لـ S3
يوفر Amplify واجهة برمجة تطبيقات أبسط، تخفي تفاصيل العمل مع S3. يتطلب إعداداً مسبقاً عبر CLI أو ملف amplifyconfiguration.json.
تثبيت Amplify
// أضف الحزمة: https://github.com/aws-ampl