الفرق بين المراجعتين ل"ReactNative/platform specific code"

من موسوعة حسوب
اذهب إلى التنقل اذهب إلى البحث
(أنشأ الصفحة ب'<noinclude>{{DISPLAYTITLE:كتابة شيفرة حسب المنصة في React Native}}</noinclude> عند إنشاء تطبيقٍ متعدّد المنصّات (أو ع...')
 
سطر 1: سطر 1:
 
<noinclude>{{DISPLAYTITLE:كتابة شيفرة حسب المنصة في React Native}}</noinclude>
 
<noinclude>{{DISPLAYTITLE:كتابة شيفرة حسب المنصة في React Native}}</noinclude>
عند إنشاء تطبيقٍ متعدّد المنصّات (أو عابرٍ للمنصّات: cross-platform)، ستحتاج إلى إعادة استخدام أكبر قدر ممكن من الشيفرة. لكن يُمكن أحيانًا أن يكون اختلاف الشيفرة حسب المنصّة منطقيًّا، فقد ترغب مثلًا بإنشاء مكونات مرئية منفصلة لنظامي التشغيل iOS و Android، بحيث يختلف مظهر التطبيق حسب نظام المستخدم.
+
عند إنشاء تطبيقٍ متعدّد المنصّات (أو عابرٍ للمنصّات: cross-platform)، ستحتاج إلى إعادة استخدام أكبر قدر ممكن من الشيفرة. لكن يُمكن أحيانًا أن يكون اختلاف الشيفرة حسب المنصّة منطقيًّا، فقد ترغب مثلًا بإنشاء مكونات مرئية منفصلة لنظامي التشغيل iOS وAndroid، بحيث يختلف مظهر التطبيق حسب نظام المستخدم.
  
 
يقدم React Native طريقتين لتنظيم الشيفرة وفصلها حسب المنصّة بسهولة:
 
يقدم React Native طريقتين لتنظيم الشيفرة وفصلها حسب المنصّة بسهولة:
  
* استخدام وحدة ‎<code>Platform</code>‎.
+
* [[ReactNative/platform specific code#.D8.A7.D9.84.D9.88.D8.AD.D8.AF.D8.A9 Platform|استخدام وحدة ‎<code>Platform</code>‎.]]
* استخدام امتدادات ملفّات (file extensions) محدّدة حسب المنصّة.
+
* [[ReactNative/platform specific code#.D8.A7.D9.85.D8.AA.D8.AF.D8.A7.D8.AF.D8.A7.D8.AA .D8.A7.D9.84.D9.85.D9.84.D9.81.D8.A7.D8.AA .D8.AD.D8.B3.D8.A8 .D8.A7.D9.84.D9.85.D9.86.D8.B5.D8.A9|استخدام امتدادات ملفّات (file extensions) محدّدة حسب المنصّة.]]
  
 
قد تحتوي بعض المكوّنات على خاصيّات تعمل على منصّة واحدة فقط. تُوضَع تعليقات لجميع هذه الخاصيّات باستخدام العلامة ‎<code>@platform</code>‎ إضافةً إلى شارة صغيرة بجوارها على [https://facebook.github.io/react-native/docs/getting-started توثيق المشروع].
 
قد تحتوي بعض المكوّنات على خاصيّات تعمل على منصّة واحدة فقط. تُوضَع تعليقات لجميع هذه الخاصيّات باستخدام العلامة ‎<code>@platform</code>‎ إضافةً إلى شارة صغيرة بجوارها على [https://facebook.github.io/react-native/docs/getting-started توثيق المشروع].
سطر 19: سطر 19:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
ستُساوي قيمةُ Platform.OS القيمةَ ‎<code>ios</code>‎ عند تشغيل التطبيق على iOS والقيمةَ ‎<code>android</code>‎ عند تشغيله على منصّة Android.
+
ستُساوي قيمةُ <code>Platform.OS</code> القيمةَ ‎<code>ios</code>‎ عند تشغيل التطبيق على iOS والقيمةَ ‎<code>android</code>‎ عند تشغيله على منصّة Android.
  
يُمكنك كذلك الاعتماد على التابع Platform.select، والذي يُعطى كائنًا يحتوي على قيمتي Platform.OS كمفاتيح، ويُعيدُ القيمة حسب المنصّة التي يشتغل عليها التطبيق.
+
يُمكنك كذلك الاعتماد على التابع <code>Platform.select</code>، والذي يُعطى كائنًا يحتوي على قيمتي <code>Platform.OS</code> كمفاتيح، ويُعيدُ القيمة حسب المنصّة التي يشتغل عليها التطبيق.
 
<syntaxhighlight lang="javascript">
 
<syntaxhighlight lang="javascript">
 
import {Platform, StyleSheet} from 'react-native';
 
import {Platform, StyleSheet} from 'react-native';
سطر 61: سطر 61:
 
</syntaxhighlight>
 
</syntaxhighlight>
 
==اكتشاف نسخة iOS==
 
==اكتشاف نسخة iOS==
على نظام التشغيل iOS، قيمة ‎<code>Version</code>‎ هي نتيجة ‎<code>-[UIDevice systemVersion]</code>‎، وهي سلسلة نصيّة (string) تحتوي على نسخة نظام التشغيل الحاليّة. مثلًا يُمكن لنسخة النظام أن تساويَ السلسلة النصيّة ‎<code>"10.3"</code>‎. وللحصول على رقم النسخة الرئيسي (major version number) على iOS، فيُمكنك استخدام الدالة ‎<code>parseInt</code>‎:
+
على نظام التشغيل iOS، قيمة ‎<code>Version</code>‎ هي نتيجة ‎<code>-[UIDevice systemVersion]</code>‎، وهي سلسلة نصيّة (string) تحتوي على نسخة نظام التشغيل الحاليّة. مثلًا يُمكن لنسخة النظام أن تساويَ السلسلة النصيّة ‎<code>"10.3"</code>‎. وللحصول على رقم النسخة الرئيسي (major version number) على iOS، فيُمكنك استخدام الدالة [[JavaScript/parseInt|‎<code>parseInt</code>‎]]:
 
<syntaxhighlight lang="javascript">
 
<syntaxhighlight lang="javascript">
 
import {Platform} from 'react-native';
 
import {Platform} from 'react-native';

مراجعة 11:23، 26 يناير 2019

عند إنشاء تطبيقٍ متعدّد المنصّات (أو عابرٍ للمنصّات: cross-platform)، ستحتاج إلى إعادة استخدام أكبر قدر ممكن من الشيفرة. لكن يُمكن أحيانًا أن يكون اختلاف الشيفرة حسب المنصّة منطقيًّا، فقد ترغب مثلًا بإنشاء مكونات مرئية منفصلة لنظامي التشغيل iOS وAndroid، بحيث يختلف مظهر التطبيق حسب نظام المستخدم.

يقدم React Native طريقتين لتنظيم الشيفرة وفصلها حسب المنصّة بسهولة:

قد تحتوي بعض المكوّنات على خاصيّات تعمل على منصّة واحدة فقط. تُوضَع تعليقات لجميع هذه الخاصيّات باستخدام العلامة ‎@platform‎ إضافةً إلى شارة صغيرة بجوارها على توثيق المشروع.

الوحدة Platform

يوفر React Native وحدةً تكتشف المنصّة التي يعمل عليها التطبيق. يمكنك استخدامها لكتابة شيفرة خاصّة بكل منصّة. استخدم هذا الخيار عندما تختلف أجزاءٌ صغيرةٌ فقط من المكوّن حسب المنصّة.

import {Platform, StyleSheet} from 'react-native';

const styles = StyleSheet.create({
  height: Platform.OS === 'ios' ? 200 : 100,
});

ستُساوي قيمةُ Platform.OS القيمةَ ‎ios‎ عند تشغيل التطبيق على iOS والقيمةَ ‎android‎ عند تشغيله على منصّة Android.

يُمكنك كذلك الاعتماد على التابع Platform.select، والذي يُعطى كائنًا يحتوي على قيمتي Platform.OS كمفاتيح، ويُعيدُ القيمة حسب المنصّة التي يشتغل عليها التطبيق.

import {Platform, StyleSheet} from 'react-native';

const styles = StyleSheet.create({
  container: {
    flex: 1,
    ...Platform.select({
      ios: {
        backgroundColor: 'red',
      },
      android: {
        backgroundColor: 'blue',
      },
    }),
  },
});

ستُنتِج الشيفرة أعلاه حاويةً ذات النمط ‎flex: 1‎ على كلا المنصّتين، مع خلفية حمراء على منصّة iOS، وخلفية زرقاء على Android.

ولأنه يقبل أي قيمةٍ كيفما كانت، فيمكنك أيضًا استخدام هذا التابع لإعادة مكوّنٍ كاملٍ حسب المنصّة كما هو موضّح أسفله:

const Component = Platform.select({
  ios: () => require('ComponentIOS'),
  android: () => require('ComponentAndroid'),
})();

<Component />;

اكتشاف نسخة Android

يمكن على نظام التشغيل Android استخدام الوحدة ‎Platform‎ للحصول على نسخة النظام الذي يعمل عليه التطبيق:

import {Platform} from 'react-native';

if (Platform.Version === 25) {
  console.log('Running on Nougat!');
}

اكتشاف نسخة iOS

على نظام التشغيل iOS، قيمة ‎Version‎ هي نتيجة ‎-[UIDevice systemVersion]‎، وهي سلسلة نصيّة (string) تحتوي على نسخة نظام التشغيل الحاليّة. مثلًا يُمكن لنسخة النظام أن تساويَ السلسلة النصيّة ‎"10.3"‎. وللحصول على رقم النسخة الرئيسي (major version number) على iOS، فيُمكنك استخدام الدالة parseInt:

import {Platform} from 'react-native';

const majorVersionIOS = parseInt(Platform.Version, 10);
if (majorVersionIOS <= 9) {
  console.log('Work around a change in behavior');
}

امتدادات الملفات حسب المنصة

إن كانت الشيفرة البرمجية الخاصة بالمنصّة لديك أكثر تعقيدًا، فسيتوجّب عليك تقسيم الشيفرة إلى ملفات منفصلة. سيكتشف React Native امتداد الملفّ ‎.ios.‎ أو ‎.android.‎ وسيُحمّل الملف المناسب عندما تتطلّبه (‎require‎) المكوّنات الأخرى.

لنقل مثلًا أنّ مشروعك يحتوي على الملفات التاليّة:

BigButton.ios.js
BigButton.android.js

يُمكنك استيراد المكوّن كما يلي:

const BigButton = require('./BigButton');

سيختار React Native الملفّ الصحيح تلقائيًا حسب النظام المُشغَّل.

إذا كنت تعتمد على شيفرة React Native الخاصّة بك في تطبيق ويب كذلك، فيمكنك أيضًا استخدام الاسم ‎BigButton.native.js‎ ليُستخدَم من طرف كلّ من iOS وAndroid، بينما سيستخدم تطبيق الويب الملفّ ‎BigButton.js‎.

مصادر