يمكنك استخدام ML Kit للتعرّف على النص في الصور. تتضمّن حزمة تعلُّم الآلة واجهة برمجة تطبيقات عامة الأغراض مناسبة للتعرّف على النص في الصور، مثل نص لوحة إرشادية في الشارع، وواجهة برمجة تطبيقات محسَّنة للتعرّف على نص المستندات. تتضمّن واجهة برمجة التطبيقات للأغراض العامة نماذج على الجهاز ونماذج مستندة إلى السحابة الإلكترونية. لا يتوفّر التعرّف على نص المستند إلا كنموذج مستند إلى السحابة الإلكترونية. يمكنك الاطّلاع على النظرة العامة لمقارنة النماذج المستندة إلى السحابة الإلكترونية والنماذج التي تعمل على الجهاز.
قبل البدء
- إذا لم يسبق لك إضافة Firebase إلى تطبيقك، يمكنك إجراء ذلك باتّباع الخطوات الواردة في دليل بدء الاستخدام.
- أدرِج مكتبات ML Kit في ملف Podfile:
بعد تثبيت أو تعديل Pods في مشروعك، احرص على فتح مشروع Xcode باستخدامpod 'Firebase/MLVision', '6.25.0' # If using an on-device API: pod 'Firebase/MLVisionTextModel', '6.25.0'
.xcworkspace
. - في تطبيقك، استورِد Firebase:
Swift
import Firebase
Objective-C
@import Firebase;
-
إذا كنت تريد استخدام النموذج المستند إلى السحابة الإلكترونية ولم يسبق لك تفعيل واجهات برمجة التطبيقات المستندة إلى السحابة الإلكترونية لمشروعك، عليك إجراء ذلك الآن باتّباع الخطوات التالية:
- افتح صفحة واجهات برمجة التطبيقات في ML Kit ضمن Firebase.
-
إذا لم يسبق لك ترقية مشروعك إلى خطة أسعار Blaze، انقر على ترقية لإجراء ذلك. (لن يُطلب منك الترقية إلا إذا لم يكن مشروعك مشتركًا في خطة Blaze).
يمكن للمشاريع على مستوى Blaze فقط استخدام واجهات برمجة التطبيقات المستندة إلى السحابة الإلكترونية.
- إذا لم تكن واجهات برمجة التطبيقات المستندة إلى السحابة الإلكترونية مفعّلة، انقر على تفعيل واجهات برمجة التطبيقات المستندة إلى السحابة الإلكترونية.
يمكنك تخطّي هذه الخطوة إذا كنت تريد استخدام النموذج على الجهاز فقط.
أنت الآن جاهز لبدء التعرّف على النص في الصور.
إرشادات حول الصور المدخَلة
-
لكي يتعرّف ML Kit على النص بدقة، يجب أن تحتوي الصور المدخلة على نص يمثّله عدد كافٍ من وحدات البكسل. من المفترض أن يكون حجم كل حرف 16×16 بكسل على الأقل بالنسبة إلى النصوص اللاتينية. بالنسبة إلى النصوص الصينية واليابانية والكورية (التي تتوافق فقط مع واجهات برمجة التطبيقات المستندة إلى السحابة الإلكترونية)، يجب أن يكون حجم كل حرف 24 × 24 بكسل. وبالنسبة إلى جميع اللغات، لا تتحسّن الدقة بشكل عام إذا كان حجم الأحرف أكبر من 24 × 24 بكسل.
على سبيل المثال، قد تكون صورة بحجم 640x480 مناسبة لمسح بطاقة عمل ضوئيًا تشغل العرض الكامل للصورة. لمسح مستند ضوئيًا مطبوع على ورق بحجم Letter، قد تحتاج إلى صورة بحجم 720x1280 بكسل.
-
يمكن أن يؤدي عدم وضوح الصورة إلى انخفاض دقة التعرّف على النص. إذا لم تحصل على نتائج مقبولة، اطلب من المستخدم إعادة التقاط الصورة.
-
إذا كنت تستخدم تطبيقًا يتعرّف على النص في الوقت الفعلي، قد تحتاج أيضًا إلى مراعاة الأبعاد الإجمالية للصور المدخلة. يمكن معالجة الصور الأصغر حجمًا بشكل أسرع، لذا لتقليل وقت الاستجابة، التقط الصور بدقة أقل (مع مراعاة متطلبات الدقة المذكورة أعلاه) وتأكَّد من أنّ النص يشغل أكبر قدر ممكن من الصورة. يمكنك أيضًا الاطّلاع على نصائح لتحسين الأداء في الوقت الفعلي.
التعرّف على النص في الصور
للتعرّف على نص في صورة باستخدام نموذج على الجهاز أو نموذج مستند إلى السحابة الإلكترونية، شغِّل أداة التعرّف على النص كما هو موضّح أدناه.
1. تشغيل أداة التعرّف على النص
مرِّر الصورة كـ `UIImage` أو `CMSampleBufferRef` إلى طريقة `process(_:completion:)` في `VisionTextRecognizer`:- احصل على مثيل من
VisionTextRecognizer
عن طريق استدعاءonDeviceTextRecognizer
أوcloudTextRecognizer
:Swift
لاستخدام النموذج على الجهاز، اتّبِع الخطوات التالية:
let vision = Vision.vision() let textRecognizer = vision.onDeviceTextRecognizer()
لاستخدام النموذج السحابي، اتّبِع الخطوات التالية:
let vision = Vision.vision() let textRecognizer = vision.cloudTextRecognizer() // Or, to provide language hints to assist with language detection: // See https://cloud.google.com/vision/docs/languages for supported languages let options = VisionCloudTextRecognizerOptions() options.languageHints = ["en", "hi"] let textRecognizer = vision.cloudTextRecognizer(options: options)
Objective-C
لاستخدام النموذج على الجهاز، اتّبِع الخطوات التالية:
FIRVision *vision = [FIRVision vision]; FIRVisionTextRecognizer *textRecognizer = [vision onDeviceTextRecognizer];
لاستخدام النموذج السحابي، اتّبِع الخطوات التالية:
FIRVision *vision = [FIRVision vision]; FIRVisionTextRecognizer *textRecognizer = [vision cloudTextRecognizer]; // Or, to provide language hints to assist with language detection: // See https://cloud.google.com/vision/docs/languages for supported languages FIRVisionCloudTextRecognizerOptions *options = [[FIRVisionCloudTextRecognizerOptions alloc] init]; options.languageHints = @[@"en", @"hi"]; FIRVisionTextRecognizer *textRecognizer = [vision cloudTextRecognizerWithOptions:options];
-
أنشئ عنصر
VisionImage
باستخدامUIImage
أوCMSampleBufferRef
.لاستخدام
UIImage
:- إذا لزم الأمر، عليك تدوير الصورة بحيث تكون قيمة السمة
imageOrientation
هي.up
. - أنشئ كائن
VisionImage
باستخدامUIImage
الذي تم تدويره بشكل صحيح. يجب عدم تحديد أي بيانات وصفية خاصة بالتدوير، بل استخدام القيمة التلقائية.topLeft
.Swift
let image = VisionImage(image: uiImage)
Objective-C
FIRVisionImage *image = [[FIRVisionImage alloc] initWithImage:uiImage];
لاستخدام
CMSampleBufferRef
:-
أنشئ عنصر
VisionImageMetadata
يحدّد اتجاه بيانات الصورة الواردة في المخزن المؤقتCMSampleBufferRef
.للحصول على اتجاه الصورة، اتّبِع الخطوات التالية:
Swift
func imageOrientation( deviceOrientation: UIDeviceOrientation, cameraPosition: AVCaptureDevice.Position ) -> VisionDetectorImageOrientation { switch deviceOrientation { case .portrait: return cameraPosition == .front ? .leftTop : .rightTop case .landscapeLeft: return cameraPosition == .front ? .bottomLeft : .topLeft case .portraitUpsideDown: return cameraPosition == .front ? .rightBottom : .leftBottom case .landscapeRight: return cameraPosition == .front ? .topRight : .bottomRight case .faceDown, .faceUp, .unknown: return .leftTop } }
Objective-C
- (FIRVisionDetectorImageOrientation) imageOrientationFromDeviceOrientation:(UIDeviceOrientation)deviceOrientation cameraPosition:(AVCaptureDevicePosition)cameraPosition { switch (deviceOrientation) { case UIDeviceOrientationPortrait: if (cameraPosition == AVCaptureDevicePositionFront) { return FIRVisionDetectorImageOrientationLeftTop; } else { return FIRVisionDetectorImageOrientationRightTop; } case UIDeviceOrientationLandscapeLeft: if (cameraPosition == AVCaptureDevicePositionFront) { return FIRVisionDetectorImageOrientationBottomLeft; } else { return FIRVisionDetectorImageOrientationTopLeft; } case UIDeviceOrientationPortraitUpsideDown: if (cameraPosition == AVCaptureDevicePositionFront) { return FIRVisionDetectorImageOrientationRightBottom; } else { return FIRVisionDetectorImageOrientationLeftBottom; } case UIDeviceOrientationLandscapeRight: if (cameraPosition == AVCaptureDevicePositionFront) { return FIRVisionDetectorImageOrientationTopRight; } else { return FIRVisionDetectorImageOrientationBottomRight; } default: return FIRVisionDetectorImageOrientationTopLeft; } }
بعد ذلك، أنشئ عنصر بيانات التعريف:
Swift
let cameraPosition = AVCaptureDevice.Position.back // Set to the capture device you used. let metadata = VisionImageMetadata() metadata.orientation = imageOrientation( deviceOrientation: UIDevice.current.orientation, cameraPosition: cameraPosition )
Objective-C
FIRVisionImageMetadata *metadata = [[FIRVisionImageMetadata alloc] init]; AVCaptureDevicePosition cameraPosition = AVCaptureDevicePositionBack; // Set to the capture device you used. metadata.orientation = [self imageOrientationFromDeviceOrientation:UIDevice.currentDevice.orientation cameraPosition:cameraPosition];
- أنشئ عنصر
VisionImage
باستخدام عنصرCMSampleBufferRef
وبيانات الدوران الوصفية:Swift
let image = VisionImage(buffer: sampleBuffer) image.metadata = metadata
Objective-C
FIRVisionImage *image = [[FIRVisionImage alloc] initWithBuffer:sampleBuffer]; image.metadata = metadata;
- إذا لزم الأمر، عليك تدوير الصورة بحيث تكون قيمة السمة
-
بعد ذلك، مرِّر الصورة إلى طريقة
process(_:completion:)
:Swift
textRecognizer.process(visionImage) { result, error in guard error == nil, let result = result else { // ... return } // Recognized text }
Objective-C
[textRecognizer processImage:image completion:^(FIRVisionText *_Nullable result, NSError *_Nullable error) { if (error != nil || result == nil) { // ... return; } // Recognized text }];
2. استخراج النص من كتل النص التي تم التعرّف عليها
في حال نجاح عملية التعرّف على النص، سيتم عرض عنصر [`VisionText`][VisionText]. يحتوي عنصر `VisionText` على النص الكامل الذي تم التعرّف عليه في الصورة وعلى صفر أو أكثر من عناصر [`VisionTextBlock`][VisionTextBlock]. يمثّل كل `VisionTextBlock` مقطعًا نصيًا مستطيلاً يحتوي على صفر أو أكثر من عناصر [`VisionTextLine`][VisionTextLine]. يحتوي كل عنصر `VisionTextLine` على صفر أو أكثر من عناصر [`VisionTextElement`][VisionTextElement]، والتي تمثّل الكلمات والكيانات الشبيهة بالكلمات (التواريخ والأرقام وما إلى ذلك). بالنسبة إلى كل عنصر من عناصر `VisionTextBlock` و`VisionTextLine` و `VisionTextElement`، يمكنك الحصول على النص الذي تم التعرّف عليه في المنطقة وإحداثيات حدود المنطقة. على سبيل المثال:Swift
let resultText = result.text for block in result.blocks { let blockText = block.text let blockConfidence = block.confidence let blockLanguages = block.recognizedLanguages let blockCornerPoints = block.cornerPoints let blockFrame = block.frame for line in block.lines { let lineText = line.text let lineConfidence = line.confidence let lineLanguages = line.recognizedLanguages let lineCornerPoints = line.cornerPoints let lineFrame = line.frame for element in line.elements { let elementText = element.text let elementConfidence = element.confidence let elementLanguages = element.recognizedLanguages let elementCornerPoints = element.cornerPoints let elementFrame = element.frame } } }
Objective-C
NSString *resultText = result.text; for (FIRVisionTextBlock *block in result.blocks) { NSString *blockText = block.text; NSNumber *blockConfidence = block.confidence; NSArray<FIRVisionTextRecognizedLanguage *> *blockLanguages = block.recognizedLanguages; NSArray<NSValue *> *blockCornerPoints = block.cornerPoints; CGRect blockFrame = block.frame; for (FIRVisionTextLine *line in block.lines) { NSString *lineText = line.text; NSNumber *lineConfidence = line.confidence; NSArray<FIRVisionTextRecognizedLanguage *> *lineLanguages = line.recognizedLanguages; NSArray<NSValue *> *lineCornerPoints = line.cornerPoints; CGRect lineFrame = line.frame; for (FIRVisionTextElement *element in line.elements) { NSString *elementText = element.text; NSNumber *elementConfidence = element.confidence; NSArray<FIRVisionTextRecognizedLanguage *> *elementLanguages = element.recognizedLanguages; NSArray<NSValue *> *elementCornerPoints = element.cornerPoints; CGRect elementFrame = element.frame; } } }
نصائح لتحسين الأداء في الوقت الفعلي
إذا كنت تريد استخدام النموذج على الجهاز للتعرّف على النص في تطبيق يعمل في الوقت الفعلي، اتّبِع الإرشادات التالية لتحقيق أفضل معدّلات عرض اللقطات:
- تقليل عدد طلبات التعرّف على النص إذا توفّر إطار فيديو جديد أثناء تشغيل أداة التعرّف على النصوص، يجب تجاهل الإطار.
- إذا كنت تستخدم ناتج أداة التعرّف على النصوص لتراكب الرسومات على صورة الإدخال، احصل أولاً على النتيجة من "حزمة تعلُّم الآلة"، ثم اعرض الصورة والتراكب في خطوة واحدة. وبذلك، يتم العرض على مساحة العرض مرة واحدة فقط لكل إطار إدخال. يمكنك الاطّلاع على الفئتَين previewOverlayView وFIRDetectionOverlayView في تطبيق العرض التوضيحي النموذجي للحصول على مثال.
- ننصحك بالتقاط الصور بدقة أقل. ومع ذلك، يجب أيضًا مراعاة متطلبات أبعاد الصورة في واجهة برمجة التطبيقات هذه.
الخطوات التالية
- قبل نشر تطبيق يستخدم إحدى واجهات Cloud API في مرحلة الإنتاج، عليك اتّخاذ بعض الخطوات الإضافية لمنع تأثير الوصول غير المصرّح به إلى واجهة برمجة التطبيقات والحدّ منه.
التعرّف على النص في صور المستندات
للتعرّف على نص مستند، اضبط مشغّل التعرّف على نص المستند المستند إلى السحابة الإلكترونية وشغّله كما هو موضّح أدناه.
توفّر واجهة برمجة التطبيقات للتعرّف على نص المستندات، الموضّحة أدناه، واجهة تهدف إلى تسهيل التعامل مع صور المستندات. ومع ذلك، إذا كنت تفضّل الواجهة التي توفّرها واجهة برمجة التطبيقات الخاصة بالنص المتفرّق، يمكنك استخدامها بدلاً من ذلك لفحص المستندات من خلال ضبط أداة التعرّف على النص في السحابة الإلكترونية على استخدام نموذج النص الكثيف.
لاستخدام واجهة برمجة التطبيقات للتعرّف على نص المستند، اتّبِع الخطوات التالية:
1. تشغيل أداة التعرّف على النص
مرِّر الصورة كـUIImage
أو CMSampleBufferRef
إلى طريقة process(_:completion:)
في VisionDocumentTextRecognizer
:
- يمكنك الحصول على مثيل من
VisionDocumentTextRecognizer
من خلال استدعاءcloudDocumentTextRecognizer
:Swift
let vision = Vision.vision() let textRecognizer = vision.cloudDocumentTextRecognizer() // Or, to provide language hints to assist with language detection: // See https://cloud.google.com/vision/docs/languages for supported languages let options = VisionCloudDocumentTextRecognizerOptions() options.languageHints = ["en", "hi"] let textRecognizer = vision.cloudDocumentTextRecognizer(options: options)
Objective-C
FIRVision *vision = [FIRVision vision]; FIRVisionDocumentTextRecognizer *textRecognizer = [vision cloudDocumentTextRecognizer]; // Or, to provide language hints to assist with language detection: // See https://cloud.google.com/vision/docs/languages for supported languages FIRVisionCloudDocumentTextRecognizerOptions *options = [[FIRVisionCloudDocumentTextRecognizerOptions alloc] init]; options.languageHints = @[@"en", @"hi"]; FIRVisionDocumentTextRecognizer *textRecognizer = [vision cloudDocumentTextRecognizerWithOptions:options];
-
أنشئ عنصر
VisionImage
باستخدامUIImage
أوCMSampleBufferRef
.لاستخدام
UIImage
:- إذا لزم الأمر، عليك تدوير الصورة بحيث تكون قيمة السمة
imageOrientation
هي.up
. - أنشئ كائن
VisionImage
باستخدامUIImage
الذي تم تدويره بشكل صحيح. يجب عدم تحديد أي بيانات وصفية خاصة بالتدوير، بل استخدام القيمة التلقائية.topLeft
.Swift
let image = VisionImage(image: uiImage)
Objective-C
FIRVisionImage *image = [[FIRVisionImage alloc] initWithImage:uiImage];
لاستخدام
CMSampleBufferRef
:-
أنشئ عنصر
VisionImageMetadata
يحدّد اتجاه بيانات الصورة الواردة في المخزن المؤقتCMSampleBufferRef
.للحصول على اتجاه الصورة، اتّبِع الخطوات التالية:
Swift
func imageOrientation( deviceOrientation: UIDeviceOrientation, cameraPosition: AVCaptureDevice.Position ) -> VisionDetectorImageOrientation { switch deviceOrientation { case .portrait: return cameraPosition == .front ? .leftTop : .rightTop case .landscapeLeft: return cameraPosition == .front ? .bottomLeft : .topLeft case .portraitUpsideDown: return cameraPosition == .front ? .rightBottom : .leftBottom case .landscapeRight: return cameraPosition == .front ? .topRight : .bottomRight case .faceDown, .faceUp, .unknown: return .leftTop } }
Objective-C
- (FIRVisionDetectorImageOrientation) imageOrientationFromDeviceOrientation:(UIDeviceOrientation)deviceOrientation cameraPosition:(AVCaptureDevicePosition)cameraPosition { switch (deviceOrientation) { case UIDeviceOrientationPortrait: if (cameraPosition == AVCaptureDevicePositionFront) { return FIRVisionDetectorImageOrientationLeftTop; } else { return FIRVisionDetectorImageOrientationRightTop; } case UIDeviceOrientationLandscapeLeft: if (cameraPosition == AVCaptureDevicePositionFront) { return FIRVisionDetectorImageOrientationBottomLeft; } else { return FIRVisionDetectorImageOrientationTopLeft; } case UIDeviceOrientationPortraitUpsideDown: if (cameraPosition == AVCaptureDevicePositionFront) { return FIRVisionDetectorImageOrientationRightBottom; } else { return FIRVisionDetectorImageOrientationLeftBottom; } case UIDeviceOrientationLandscapeRight: if (cameraPosition == AVCaptureDevicePositionFront) { return FIRVisionDetectorImageOrientationTopRight; } else { return FIRVisionDetectorImageOrientationBottomRight; } default: return FIRVisionDetectorImageOrientationTopLeft; } }
بعد ذلك، أنشئ عنصر بيانات التعريف:
Swift
let cameraPosition = AVCaptureDevice.Position.back // Set to the capture device you used. let metadata = VisionImageMetadata() metadata.orientation = imageOrientation( deviceOrientation: UIDevice.current.orientation, cameraPosition: cameraPosition )
Objective-C
FIRVisionImageMetadata *metadata = [[FIRVisionImageMetadata alloc] init]; AVCaptureDevicePosition cameraPosition = AVCaptureDevicePositionBack; // Set to the capture device you used. metadata.orientation = [self imageOrientationFromDeviceOrientation:UIDevice.currentDevice.orientation cameraPosition:cameraPosition];
- أنشئ عنصر
VisionImage
باستخدام عنصرCMSampleBufferRef
وبيانات الدوران الوصفية:Swift
let image = VisionImage(buffer: sampleBuffer) image.metadata = metadata
Objective-C
FIRVisionImage *image = [[FIRVisionImage alloc] initWithBuffer:sampleBuffer]; image.metadata = metadata;
- إذا لزم الأمر، عليك تدوير الصورة بحيث تكون قيمة السمة
-
بعد ذلك، مرِّر الصورة إلى طريقة
process(_:completion:)
:Swift
textRecognizer.process(visionImage) { result, error in guard error == nil, let result = result else { // ... return } // Recognized text }
Objective-C
[textRecognizer processImage:image completion:^(FIRVisionDocumentText *_Nullable result, NSError *_Nullable error) { if (error != nil || result == nil) { // ... return; } // Recognized text }];
2. استخراج النص من كتل النص التي تم التعرّف عليها
في حال نجاح عملية التعرّف على النص، سيتم عرض عنصرVisionDocumentText
. يحتوي عنصر VisionDocumentText
على النص الكامل الذي تم التعرّف عليه في الصورة وعلى تسلسل هرمي للعناصر يعكس بنية المستند الذي تم التعرّف عليه:
بالنسبة إلى كل عنصر من عناصر VisionDocumentTextBlock
وVisionDocumentTextParagraph
وVisionDocumentTextWord
وVisionDocumentTextSymbol
، يمكنك الحصول على النص الذي تم التعرّف عليه في المنطقة وإحداثيات حدود المنطقة.
على سبيل المثال:
Swift
let resultText = result.text for block in result.blocks { let blockText = block.text let blockConfidence = block.confidence let blockRecognizedLanguages = block.recognizedLanguages let blockBreak = block.recognizedBreak let blockCornerPoints = block.cornerPoints let blockFrame = block.frame for paragraph in block.paragraphs { let paragraphText = paragraph.text let paragraphConfidence = paragraph.confidence let paragraphRecognizedLanguages = paragraph.recognizedLanguages let paragraphBreak = paragraph.recognizedBreak let paragraphCornerPoints = paragraph.cornerPoints let paragraphFrame = paragraph.frame for word in paragraph.words { let wordText = word.text let wordConfidence = word.confidence let wordRecognizedLanguages = word.recognizedLanguages let wordBreak = word.recognizedBreak let wordCornerPoints = word.cornerPoints let wordFrame = word.frame for symbol in word.symbols { let symbolText = symbol.text let symbolConfidence = symbol.confidence let symbolRecognizedLanguages = symbol.recognizedLanguages let symbolBreak = symbol.recognizedBreak let symbolCornerPoints = symbol.cornerPoints let symbolFrame = symbol.frame } } } }
Objective-C
NSString *resultText = result.text; for (FIRVisionDocumentTextBlock *block in result.blocks) { NSString *blockText = block.text; NSNumber *blockConfidence = block.confidence; NSArray<FIRVisionTextRecognizedLanguage *> *blockRecognizedLanguages = block.recognizedLanguages; FIRVisionTextRecognizedBreak *blockBreak = block.recognizedBreak; CGRect blockFrame = block.frame; for (FIRVisionDocumentTextParagraph *paragraph in block.paragraphs) { NSString *paragraphText = paragraph.text; NSNumber *paragraphConfidence = paragraph.confidence; NSArray<FIRVisionTextRecognizedLanguage *> *paragraphRecognizedLanguages = paragraph.recognizedLanguages; FIRVisionTextRecognizedBreak *paragraphBreak = paragraph.recognizedBreak; CGRect paragraphFrame = paragraph.frame; for (FIRVisionDocumentTextWord *word in paragraph.words) { NSString *wordText = word.text; NSNumber *wordConfidence = word.confidence; NSArray<FIRVisionTextRecognizedLanguage *> *wordRecognizedLanguages = word.recognizedLanguages; FIRVisionTextRecognizedBreak *wordBreak = word.recognizedBreak; CGRect wordFrame = word.frame; for (FIRVisionDocumentTextSymbol *symbol in word.symbols) { NSString *symbolText = symbol.text; NSNumber *symbolConfidence = symbol.confidence; NSArray<FIRVisionTextRecognizedLanguage *> *symbolRecognizedLanguages = symbol.recognizedLanguages; FIRVisionTextRecognizedBreak *symbolBreak = symbol.recognizedBreak; CGRect symbolFrame = symbol.frame; } } } }
الخطوات التالية
- قبل نشر تطبيق يستخدم إحدى واجهات Cloud API في مرحلة الإنتاج، عليك اتّخاذ بعض الخطوات الإضافية لمنع تأثير الوصول غير المصرّح به إلى واجهة برمجة التطبيقات والحدّ منه.