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