إنّ الأجهزة التي تعمل بنظام التشغيل Android 10 (المستوى 29 لواجهة برمجة التطبيقات) والإصدارات الأحدث تسمح لتطبيقك بإضافة شبكة.
بيانات الاعتماد الخاصة بالجهاز للاتصال التلقائي بنقطة وصول Wi-Fi. يمكنك توفير
اقتراحات للشبكة التي ينبغي الاتصال بها باستخدام
WifiNetworkSuggestion
تختار المنصة في النهاية نقطة الوصول التي يتم قبولها استنادًا إلى
مدخلاتك من تطبيقك وغيرها
في نظام التشغيل Android 11 (المستوى 30) والإصدارات الأحدث:
- جارٍ توفير المتطلبات اللازمة لـ
PasspointConfiguration
تدعمها واجهة برمجة تطبيقات الاقتراحات. قبل Android 11، توفيرPasspointConfiguration
استخدامaddOrUpdatePasspointConfiguration()
واجهة برمجة التطبيقات. - يفرض إطار العمل متطلبات الأمان على المؤسسات المستندة إلى بروتوكول أمان طبقة النقل (TLS).
الاقتراحات (EAP-TLS، EAP-TTLS، EAP-PEAP) الاقتراحات لمثل هذه الشبكات
يجب ضبط
Root CA certificate
وserver domain name
- يفرض إطار العمل متطلبات ملكية المؤسسات المستندة إلى شريحة SIM المضمّنة (EAP-SIM) اقتراحات (EAP-SIM، EAP-AKA، EAP-AKA-PRIME) مثل هذه الاقتراحات لا يُسمح به إلا من خلال التطبيقات الموقَّعة من مشغِّل شبكة الجوّال.
- بالنسبة إلى الاقتراحات التي يقدّمها تطبيق موقَّع من مشغّل شبكة الجوّال، يتم تلقائيًا استخدام إطار العمل. يعيّن لهم رقمًا تعريفيًا لمشغل شبكة يتوافق مع معرّف التطبيق توقيع مشغِّل شبكة الجوّال. مثل يتم إيقاف الاقتراحات تلقائيًا في حال إزالة شريحة SIM المقابلة. من الجهاز.
على نظام التشغيل Android 12 (المستوى 31) والإصدارات الأحدث:
يمكن تفعيل الخصوصية الإضافية من خلال التوزيع العشوائي غير الدائم لعنوان MAC. الذي يعيد ترتيب عنوان MAC العشوائي بشكل عشوائي. استخدام
setMacRandomizationSetting
لتحديد مستوى التوزيع العشوائي لشبكتك.isPasspointTermsAndConditionsSupported()
: الأحكام والشروط هي نقطة مرور التي تسمح لعمليات نشر الشبكة باستبدال البوابات المقيدة غير الآمنة، التي تستخدم الشبكات المفتوحة، من خلال شبكة نقطة مرور آمنة. الإشعار هو عرض الإعلان للمستخدم عندما يلزم قبول الأحكام والشروط. التطبيقات التي تقترح شبكات نقطة مرور مقفلة وفقًا للأحكام والشروط يجب استدعاء واجهة برمجة التطبيقات هذه أولاً للتأكد من أن الجهاز يدعم هذه الإمكانية. وإذا كان الجهاز لا يوفّر هذه الميزة، لن يتمكّن من الاتصال هذه الشبكة، ويجب اقتراح شبكة بديلة أو قديمة.isDecoratedIdentitySupported()
: عند المصادقة مع شبكات ذات بادئة ديكور، تسمح بادئة الهوية لمشغلي الشبكات بتحديث الوصول إلى الشبكة المعرف (NAI) لتنفيذ التوجيه الصريح من خلال خوادم وكيلة متعددة داخله لإحدى شبكات AAA (راجع RFC 7542 لنظام التشغيل المزيد حول هذا الموضوع).يستخدم Android 12 هذه الميزة للتوافق مع مواصفات WBA الخاصة PPS-MO الإضافات. يجب على التطبيقات التي تقترح شبكات نقطة مرور تتطلب هوية مزينة. باستدعاء واجهة برمجة التطبيقات هذه أولاً للتأكد من أن الجهاز يدعم هذه الإمكانية. في حال حذف إذا كان الجهاز لا يتيح هذه الميزة، فلن يتم تزيين الهوية وقد تفشل مصادقة الشبكة.
لإنشاء اقتراح "نقطة مرور"، يجب أن تستخدم التطبيقات
PasspointConfiguration
،
Credential
و
HomeSp
صف. هذه
الملف الشخصي لنقطة المرور، والمحدَّد في تحالف Wi-Fi Alliance
نقطة مرور
المواصفات.
يوضح نموذج الرمز البرمجي التالي كيفية تقديم بيانات الاعتماد لواحد مفتوح وآخر مفتوح. WPA2 وشبكة WPA3 واحدة وشبكة نقطة مرور واحدة:
Kotlin
val suggestion1 = WifiNetworkSuggestion.Builder() .setSsid("test111111") .setIsAppInteractionRequired(true) // Optional (Needs location permission) .build(); val suggestion2 = WifiNetworkSuggestion.Builder() .setSsid("test222222") .setWpa2Passphrase("test123456") .setIsAppInteractionRequired(true) // Optional (Needs location permission) .build(); val suggestion3 = WifiNetworkSuggestion.Builder() .setSsid("test333333") .setWpa3Passphrase("test6789") .setIsAppInteractionRequired(true) // Optional (Needs location permission) .build(); val passpointConfig = PasspointConfiguration(); // configure passpointConfig to include a valid Passpoint configuration val suggestion4 = WifiNetworkSuggestion.Builder() .setPasspointConfig(passpointConfig) .setIsAppInteractionRequired(true) // Optional (Needs location permission) .build(); val suggestionsList = listOf(suggestion1, suggestion2, suggestion3, suggestion4); val wifiManager = context.getSystemService(Context.WIFI_SERVICE) as WifiManager; val status = wifiManager.addNetworkSuggestions(suggestionsList); if (status != WifiManager.STATUS_NETWORK_SUGGESTIONS_SUCCESS) { // do error handling here } // Optional (Wait for post connection broadcast to one of your suggestions) val intentFilter = IntentFilter(WifiManager.ACTION_WIFI_NETWORK_SUGGESTION_POST_CONNECTION); val broadcastReceiver = object : BroadcastReceiver() { override fun onReceive(context: Context, intent: Intent) { if (!intent.action.equals(WifiManager.ACTION_WIFI_NETWORK_SUGGESTION_POST_CONNECTION)) { return; } // do post connect processing here } }; context.registerReceiver(broadcastReceiver, intentFilter);
Java
final WifiNetworkSuggestion suggestion1 = new WifiNetworkSuggestion.Builder() .setSsid("test111111") .setIsAppInteractionRequired(true) // Optional (Needs location permission) .build(); final WifiNetworkSuggestion suggestion2 = new WifiNetworkSuggestion.Builder() .setSsid("test222222") .setWpa2Passphrase("test123456") .setIsAppInteractionRequired(true) // Optional (Needs location permission) .build(); final WifiNetworkSuggestion suggestion3 = new WifiNetworkSuggestion.Builder() .setSsid("test333333") .setWpa3Passphrase("test6789") .setIsAppInteractionRequired(true) // Optional (Needs location permission) .build(); final PasspointConfiguration passpointConfig = new PasspointConfiguration(); // configure passpointConfig to include a valid Passpoint configuration final WifiNetworkSuggestion suggestion4 = new WifiNetworkSuggestion.Builder() .setPasspointConfig(passpointConfig) .setIsAppInteractionRequired(true) // Optional (Needs location permission) .build(); final List<WifiNetworkSuggestion> suggestionsList = new ArrayList<WifiNetworkSuggestion> {{ add(suggestion1); add(suggestion2); add(suggestion3); add(suggestion4); }}; final WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE); final int status = wifiManager.addNetworkSuggestions(suggestionsList); if (status != WifiManager.STATUS_NETWORK_SUGGESTIONS_SUCCESS) { // do error handling here… } // Optional (Wait for post connection broadcast to one of your suggestions) final IntentFilter intentFilter = new IntentFilter(WifiManager.ACTION_WIFI_NETWORK_SUGGESTION_POST_CONNECTION); final BroadcastReceiver broadcastReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { if (!intent.getAction().equals( WifiManager.ACTION_WIFI_NETWORK_SUGGESTION_POST_CONNECTION)) { return; } // do post connect processing here... } }; context.registerReceiver(broadcastReceiver, intentFilter);
وبعد أن يقدم التطبيق اقتراحًا لأول مرة، يبدأ المستخدم بشكل أفضل. يعتمد نوع الإشعار على إصدار Android المثبَّت على الجهاز. على الجهاز:
- في نظام التشغيل Android 11 (المستوى 30 لواجهة برمجة التطبيقات) والإصدارات الأحدث، يظهر للمستخدم مربّع حوار إذا كان التطبيق قيد التشغيل في المقدّمة، وإشعارًا إذا كان التطبيق قيد التشغيل في الخلفية.
- في نظام التشغيل Android 10 (مستوى واجهة برمجة التطبيقات 29)، يرى المستخدم إشعارًا، بغض النظر عن ما إذا كان التطبيق يعمل في المقدّمة أو في الخلفية
عند اتصال النظام الأساسي بأحد اقتراحات الشبكة، تعرض الإعدادات نص ينسب الاتصال بالشبكة إلى تطبيق الاقتراح المناسب.
التعامل مع عمليات إلغاء ربط المستخدمين
إذا كان المستخدم يستخدم أداة اختيار Wi-Fi لقطع الاتصال بشكل صريح من أحد الشبكة عند الاتصال بها، يتم تجاهل هذه الشبكة عند لا يزال في النطاق. وخلال هذه الفترة، لن يتم تضمين هذه الشبكة في للاتصال التلقائي، حتى إذا أزال التطبيق اقتراح الشبكة وأعاد إضافته المقابلة للشبكة. إذا كان المستخدم يستخدم أداة اختيار شبكة Wi-Fi بالاتصال بشبكة تم قطع اتصالها سابقًا، فسيتم نقل هذه الشبكة النظر في الاتصال التلقائي على الفور.
تغيير حالة الموافقة على التطبيق
يزيل مستخدم يرفض إشعار اقتراح الشبكة
إذن CHANGE_WIFI_STATE
من التطبيق. يمكن للمستخدم منح هذه الموافقة
لاحقًا عن طريق الانتقال إلى قائمة التحكم في شبكة Wi-Fi (الإعدادات >
التطبيقات الإشعارات > تطبيق خاص
وصول > التحكُّم في شبكة Wi-Fi > App name).