دستگاههایی که اندروید ۱۰ (سطح API ۲۹) و بالاتر را اجرا میکنند، به برنامه شما اجازه میدهند تا اعتبارنامههای شبکه را برای اتصال خودکار دستگاه به یک نقطه دسترسی Wi-Fi اضافه کند. میتوانید با استفاده از WifiNetworkSuggestion پیشنهادهایی برای اتصال به شبکه ارائه دهید. در نهایت، پلتفرم بر اساس ورودی برنامه شما و سایر ورودیها، نقطه دسترسی مورد نظر را انتخاب میکند.
در اندروید ۱۱ (سطح API 30) و بالاتر:
- ارائه
PasspointConfigurationتوسط API پیشنهادی پشتیبانی میشود. قبل از اندروید ۱۱، ارائهPasspointConfigurationنیاز به استفاده از APIaddOrUpdatePasspointConfiguration()داشت. - این چارچوب الزامات امنیتی را بر روی پیشنهادهای سازمانی مبتنی بر TLS (EAP-TLS، EAP-TTLS و EAP-PEAP) اعمال میکند؛ پیشنهادها به چنین شبکههایی باید یک
Root CA certificateو یکserver domain nameتنظیم کنند.
- این چارچوب الزامات مالکیت را برای پیشنهادهای سازمانی مبتنی بر EAP-SIM (EAP-SIM، EAP-AKA، EAP-AKA-PRIME) اعمال میکند؛ چنین پیشنهادهایی فقط توسط برنامههایی که توسط اپراتور امضا شدهاند، مجاز هستند.
- برای پیشنهادهایی که توسط یک برنامه با امضای اپراتور ارائه میشوند، چارچوب به طور خودکار یک شناسه اپراتور مربوط به امضای اپراتور برنامه به آنها اختصاص میدهد. اگر سیمکارت مربوطه از دستگاه خارج شود، چنین پیشنهادهایی به طور خودکار غیرفعال میشوند.
در اندروید ۱۲ (سطح API 31) و بالاتر:
حریم خصوصی بیشتر را میتوان از طریق تصادفیسازی غیرپایدار MAC فعال کرد، که به صورت دورهای آدرس MAC تصادفی را دوباره تصادفی میکند. از
setMacRandomizationSettingبرای تعیین سطح تصادفیسازی برای شبکه خود استفاده کنید.isPasspointTermsAndConditionsSupported(): شرایط و ضوابط یک ویژگی Passpoint است که به استقرارهای شبکه اجازه میدهد تا پورتالهای Captive ناامن، که از شبکههای باز استفاده میکنند، را با یک شبکه Passpoint امن جایگزین کنند. هنگامی که شرایط و ضوابط مورد نیاز برای پذیرش باشند، یک اعلان به کاربر نمایش داده میشود. برنامههایی که شبکههای Passpoint را پیشنهاد میدهند که توسط شرایط و ضوابط محدود شدهاند، ابتدا باید این API را فراخوانی کنند تا مطمئن شوند که دستگاه از این قابلیت پشتیبانی میکند. اگر دستگاه از این قابلیت پشتیبانی نکند، نمیتواند به این شبکه متصل شود و باید یک شبکه جایگزین یا قدیمی پیشنهاد شود.isDecoratedIdentitySupported(): هنگام احراز هویت در شبکههایی با پیشوند تزئینی، پیشوند هویت تزئینی به اپراتورهای شبکه اجازه میدهد تا شناسه دسترسی به شبکه (NAI) را بهروزرسانی کنند تا مسیریابی صریح را از طریق چندین پروکسی درون یک شبکه AAA انجام دهند (برای اطلاعات بیشتر در این مورد به RFC 7542 مراجعه کنید).اندروید ۱۲ این ویژگی را برای مطابقت با مشخصات WBA برای افزونههای PPS-MO پیادهسازی کرده است. برنامههایی که شبکههای Passpoint را پیشنهاد میدهند که نیاز به هویت تزئینشده دارند، ابتدا باید این API را فراخوانی کنند تا مطمئن شوند که دستگاه از این قابلیت پشتیبانی میکند. اگر دستگاه از این قابلیت پشتیبانی نکند، هویت تزئینشده نخواهد بود و احراز هویت در شبکه ممکن است با شکست مواجه شود.
برای ایجاد پیشنهاد Passpoint، برنامهها باید از کلاسهای PasspointConfiguration ، Credential و HomeSp استفاده کنند. این کلاسها، پروفایل Passpoint را که در مشخصات Wi-Fi Alliance Passpoint تعریف شده است، توصیف میکنند.
نمونه کد زیر نحوه ارائه اعتبارنامه برای یک شبکه باز، یک شبکه WPA2، یک شبکه WPA3 و یک شبکه Passpoint را نشان میدهد:
کاتلین
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);
جاوا
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);
بلافاصله پس از اینکه برنامه برای اولین بار پیشنهادی را ارائه میدهد، به کاربر اطلاع داده میشود. نوع اطلاعرسانی به نسخه اندروید موجود در دستگاه بستگی دارد:
- در اندروید ۱۱ (سطح API 30) و بالاتر، اگر برنامه در پیشزمینه اجرا شود، کاربر یک کادر محاورهای و اگر در پسزمینه اجرا شود، یک اعلان میبیند.
- در اندروید ۱۰ (سطح API 29)، کاربر صرف نظر از اینکه برنامه در پیشزمینه یا پسزمینه در حال اجرا باشد، یک اعلان (نوتیفیکیشن) مشاهده میکند.
وقتی پلتفرم به یکی از پیشنهادهای شبکه متصل میشود، تنظیمات متنی را نشان میدهد که اتصال شبکه را به برنامه پیشنهاددهنده مربوطه نسبت میدهد.
مدیریت قطع ارتباط کاربران
اگر کاربر هنگام اتصال به یکی از پیشنهادهای شبکه، از انتخابگر وایفای برای قطع ارتباط صریح با آن استفاده کند، آن شبکه وقتی هنوز در محدوده باشد، نادیده گرفته میشود. در این مدت، آن شبکه برای اتصال خودکار در نظر گرفته نمیشود، حتی اگر برنامه پیشنهاد شبکه مربوط به آن شبکه را حذف و دوباره اضافه کند. اگر کاربر از انتخابگر وایفای برای اتصال صریح به شبکهای که قبلاً قطع شده بود استفاده کند، آن شبکه بلافاصله برای اتصال خودکار در نظر گرفته میشود.
تغییر وضعیت تأیید برنامه
کاربر با رد کردن اعلان پیشنهاد شبکه، مجوز CHANGE_WIFI_STATE را از برنامه حذف میکند. کاربر میتواند بعداً با رفتن به منوی کنترل Wi-Fi ( تنظیمات > برنامهها و اعلانها > دسترسی ویژه به برنامه > کنترل Wi-Fi > App name ) این تأیید را اعطا کند.