日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

iOS10 优化APP首次安装网络权限提示方案

發(fā)布時(shí)間:2023/12/9 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 iOS10 优化APP首次安装网络权限提示方案 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

我剛經(jīng)歷了一場(chǎng)末日(停電),特別是在你想寫(xiě)文檔的時(shí)候。。。

言歸正傳,今天的問(wèn)題是解決iOS10系統(tǒng)下首次按鈕APP彈出的網(wǎng)絡(luò)權(quán)限提示所帶來(lái)了問(wèn)題以及優(yōu)化。

起因



查了相關(guān)文章知道由于大陸工信部出臺(tái)的新規(guī)指出,應(yīng)用在未經(jīng)用戶允許的前提下,系統(tǒng)不能授予其使用聯(lián)網(wǎng)、獲取定位的功能。Apple在iOS10系統(tǒng)中加入了關(guān)于應(yīng)用使用數(shù)據(jù)的授權(quán)彈窗提示,用戶在iOS系統(tǒng)及以上系統(tǒng)中第一次打開(kāi)應(yīng)用時(shí),會(huì)被要求對(duì)于是否授予應(yīng)用聯(lián)網(wǎng)權(quán)限進(jìn)行選擇。

問(wèn)題

Apple把自己的問(wèn)題解決了, 但是Apple沒(méi)有給出官方的獲取選擇事件的回調(diào),這樣就是給開(kāi)發(fā)者挖坑了。 對(duì)于很多開(kāi)發(fā)者習(xí)慣于把預(yù)加載接口放到AppDelegate的同志就很苦惱了。 這樣會(huì)造成配置接口請(qǐng)求失敗,首頁(yè)數(shù)據(jù)為空的情況,第一次獲取DeviceToken失敗,添加推送通知失敗,第三方初始化失敗,以至于導(dǎo)致很多延伸的問(wèn)題。

解決

1.根據(jù)CTCellularData類獲取網(wǎng)絡(luò)權(quán)限狀態(tài)以及監(jiān)聽(tīng)狀態(tài)改變回調(diào)(推薦)

我就在使用此方法。話不多說(shuō)上代碼,注釋很詳細(xì); 添加CoreTelephony系統(tǒng)庫(kù),在AppDelegate.m里#import<CoreTelephony/CTCellularData.h> [objc] view plain copy
  • -?(BOOL)application:(UIApplication?*)application?didFinishLaunchingWithOptions:(NSDictionary?*)launchOptions?{??
  • ????//?Override?point?for?customization?after?application?launch.??
  • ??????
  • ????//1.獲取網(wǎng)絡(luò)權(quán)限?根絕權(quán)限進(jìn)行人機(jī)交互??
  • ????if?(__IPHONE_10_0)?{??
  • ????????[self?networkStatus:application?didFinishLaunchingWithOptions:launchOptions];??
  • ????}else?{??
  • ????????//2.2已經(jīng)開(kāi)啟網(wǎng)絡(luò)權(quán)限?監(jiān)聽(tīng)網(wǎng)絡(luò)狀態(tài)??
  • ????????[self?addReachabilityManager:application?didFinishLaunchingWithOptions:launchOptions];??
  • ????}??
  • ??????
  • ????//初始化window??
  • ????self.window?=?[[UIWindow?alloc]?initWithFrame:[UIScreen?mainScreen].bounds];??
  • ????[self.window?setBackgroundColor:[UIColor?whiteColor]];??
  • ??????
  • //????//創(chuàng)建UI??
  • ????[self?createWindowRootWithType:2];??
  • ??????
  • ????[self.window?makeKeyAndVisible];??
  • ????return?YES;??
  • }??
  • ??
  • /*?
  • ?CTCellularData在iOS9之前是私有類,權(quán)限設(shè)置是iOS10開(kāi)始的,所以App?Store審核沒(méi)有問(wèn)題?
  • ?獲取網(wǎng)絡(luò)權(quán)限狀態(tài)?
  • ?*/??
  • -?(void)networkStatus:(UIApplication?*)application?didFinishLaunchingWithOptions:(NSDictionary?*)launchOptions?{??
  • ????//2.根據(jù)權(quán)限執(zhí)行相應(yīng)的交互??
  • ????CTCellularData?*cellularData?=?[[CTCellularData?alloc]?init];??
  • ??????
  • ????/*?
  • ?????此函數(shù)會(huì)在網(wǎng)絡(luò)權(quán)限改變時(shí)再次調(diào)用?
  • ?????*/??
  • ????cellularData.cellularDataRestrictionDidUpdateNotifier?=?^(CTCellularDataRestrictedState?state)?{??
  • ????????switch?(state)?{??
  • ????????????case?kCTCellularDataRestricted:??
  • ??????????????????
  • ????????????????NSLog(@"Restricted");??
  • ????????????????//2.1權(quán)限關(guān)閉的情況下?再次請(qǐng)求網(wǎng)絡(luò)數(shù)據(jù)會(huì)彈出設(shè)置網(wǎng)絡(luò)提示??
  • ????????????????[self?getAppInfo];??
  • ????????????????break;??
  • ????????????case?kCTCellularDataNotRestricted:??
  • ??????????????????
  • ????????????????NSLog(@"NotRestricted");??
  • ????????????????//2.2已經(jīng)開(kāi)啟網(wǎng)絡(luò)權(quán)限?監(jiān)聽(tīng)網(wǎng)絡(luò)狀態(tài)??
  • ????????????????[self?addReachabilityManager:application?didFinishLaunchingWithOptions:launchOptions];??
  • //????????????????[self?getInfo_application:application?didFinishLaunchingWithOptions:launchOptions];??
  • ????????????????break;??
  • ????????????case?kCTCellularDataRestrictedStateUnknown:??
  • ??????????????????
  • ????????????????NSLog(@"Unknown");??
  • ????????????????//2.3未知情況?(還沒(méi)有遇到推測(cè)是有網(wǎng)絡(luò)但是連接不正常的情況下)??
  • ????????????????[self?getAppInfo];??
  • ????????????????break;??
  • ??????????????????
  • ????????????default:??
  • ????????????????break;??
  • ????????}??
  • ????};??
  • }??
  • ??
  • /**?
  • ?實(shí)時(shí)檢查當(dāng)前網(wǎng)絡(luò)狀態(tài)?
  • ?*/??
  • -?(void)addReachabilityManager:(UIApplication?*)application?didFinishLaunchingWithOptions:(NSDictionary?*)launchOptions?{??
  • ????AFNetworkReachabilityManager?*afNetworkReachabilityManager?=?[AFNetworkReachabilityManager?sharedManager];??
  • ??????
  • ????//這個(gè)可以放在需要偵聽(tīng)的頁(yè)面??
  • ????//????[[NSNotificationCenter?defaultCenter]addObserver:self?selector:@selector(afNetworkStatusChanged:)?name:AFNetworkingReachabilityDidChangeNotification?object:nil];??
  • ????[afNetworkReachabilityManager?setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus?status)?{??
  • ????????switch?(status)?{??
  • ????????????case?AFNetworkReachabilityStatusNotReachable:{??
  • ????????????????NSLog(@"網(wǎng)絡(luò)不通:%@",@(status)?);??
  • ????????????????break;??
  • ????????????}??
  • ????????????case?AFNetworkReachabilityStatusReachableViaWiFi:{??
  • ????????????????NSLog(@"網(wǎng)絡(luò)通過(guò)WIFI連接:%@",@(status));??
  • ????????????????if?(self.mallConfigModel?==?nil)?{??
  • ???????????????????[self?getInfo_application:application?didFinishLaunchingWithOptions:launchOptions];??
  • ????????????????}??
  • ????????????????break;??
  • ????????????}??
  • ????????????case?AFNetworkReachabilityStatusReachableViaWWAN:{??
  • ????????????????NSLog(@"網(wǎng)絡(luò)通過(guò)無(wú)線連接:%@",@(status)?);??
  • ????????????????if?(self.mallConfigModel?==?nil)?{??
  • ????????????????????[self?getInfo_application:application?didFinishLaunchingWithOptions:launchOptions];??
  • ????????????????}??
  • ????????????????break;??
  • ????????????}??
  • ????????????default:??
  • ????????????????break;??
  • ????????}??
  • ????}];??
  • ??????
  • ????[afNetworkReachabilityManager?startMonitoring];??//開(kāi)啟網(wǎng)絡(luò)監(jiān)視器;??
  • }??
  • ??
  • -?(void)getInfo_application:(UIApplication?*)application?didFinishLaunchingWithOptions:(NSDictionary?*)launchOptions?{??
  • ??????
  • ????//第三方庫(kù)初始化??
  • ????[self?initValueThirdParty:application?didFinishLaunchingWithOptions:launchOptions];??
  • ??????
  • //????//獲取初始信息??
  • ????[self?initData];??
  • ??????
  • ????//添加通知??
  • ????[self?addNotification];??
  • }??



  • 這樣也同時(shí)解決了用戶如果選擇不允許和限制兩種情況,在用戶沒(méi)有統(tǒng)一聯(lián)網(wǎng)的情況下,APP會(huì)顯示沒(méi)有網(wǎng)絡(luò)的UI,重新進(jìn)入APP會(huì)調(diào)用在不允許狀態(tài)下會(huì)調(diào)用一個(gè)測(cè)試接口,APP會(huì)自動(dòng)彈出重新選擇網(wǎng)絡(luò)權(quán)限以及說(shuō)明的彈窗,進(jìn)入設(shè)置修改過(guò)APP聯(lián)網(wǎng)權(quán)限以后選擇回到APP就會(huì)觸發(fā)cellularDataRestrictionDidUpdateNotifier,在回調(diào)里進(jìn)行相應(yīng)的人機(jī)交互就可以了。




    2.延遲請(qǐng)求

    就是把配置請(qǐng)求放到首頁(yè)VC里,不要放到AppDelegate里,同時(shí)監(jiān)聽(tīng)網(wǎng)絡(luò)狀態(tài)(AF,其他第三方等)有個(gè)致命性的問(wèn)題就是獲取網(wǎng)絡(luò)狀態(tài)會(huì)有一定的延遲(親測(cè)),導(dǎo)致很多情況,還有就是要自己處理權(quán)限彈框以及對(duì)原有代碼邏輯要進(jìn)行修改。

    總結(jié)

    這個(gè)問(wèn)題遇到幾次了,原來(lái)都是用第二種方式進(jìn)行了一定的優(yōu)化,這次的APP有一個(gè)配置信息接口導(dǎo)致出現(xiàn)問(wèn)題,寫(xiě)下來(lái)作為記錄,方法還有很多種,不足的地方還有很多,僅供大家參考。

    轉(zhuǎn)載于:https://www.cnblogs.com/Free-Thinker/p/8303261.html

    總結(jié)

    以上是生活随笔為你收集整理的iOS10 优化APP首次安装网络权限提示方案的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。