iOS10 優化APP首次安裝網絡權限提示方案

我剛經歷了一場末日(停電),特別是在你想寫文檔的時候。。。

言歸正傳,今天的問題是解決iOS10系統下首次按鈕APP彈出的網絡權限提示所帶來了問題以及優化。

起因



查了相關文章知道由于大陸工信部出臺的新規指出,應用在未經用戶允許的前提下,系統不能授予其使用聯網、獲取定位的功能。Apple在iOS10系統中加入了關于應用使用數據的授權彈窗提示,用戶在iOS系統及以上系統中第一次打開應用時,會被要求對于是否授予應用聯網權限進行選擇。

問題

Apple把自己的問題解決了, 但是Apple沒有給出官方的獲取選擇事件的回調,這樣就是給開發者挖坑了。
對于很多開發者習慣于把預加載接口放到AppDelegate的同志就很苦惱了。
這樣會造成配置接口請求失敗,首頁數據為空的情況,第一次獲取DeviceToken失敗,添加推送通知失敗,第三方初始化失敗,以至于導致很多延伸的問題。

解決

1.根據CTCellularData類獲取網絡權限狀態以及監聽狀態改變回調(推薦)

我就在使用此方法。話不多說上代碼,注釋很詳細;
添加CoreTelephony系統庫,在AppDelegate.m里#import<CoreTelephony/CTCellularData.h>
[objc] view plain copy
  1. -?(BOOL)application:(UIApplication?*)application?didFinishLaunchingWithOptions:(NSDictionary?*)launchOptions?{??
  2. ????//?Override?point?for?customization?after?application?launch.??
  3. ??????
  4. ????//1.獲取網絡權限?根絕權限進行人機交互??
  5. ????if?(__IPHONE_10_0)?{??
  6. ????????[self?networkStatus:application?didFinishLaunchingWithOptions:launchOptions];??
  7. ????}else?{??
  8. ????????//2.2已經開啟網絡權限?監聽網絡狀態??
  9. ????????[self?addReachabilityManager:application?didFinishLaunchingWithOptions:launchOptions];??
  10. ????}??
  11. ??????
  12. ????//初始化window??
  13. ????self.window?=?[[UIWindow?alloc]?initWithFrame:[UIScreen?mainScreen].bounds];??
  14. ????[self.window?setBackgroundColor:[UIColor?whiteColor]];??
  15. ??????
  16. //????//創建UI??
  17. ????[self?createWindowRootWithType:2];??
  18. ??????
  19. ????[self.window?makeKeyAndVisible];??
  20. ????return?YES;??
  21. }??
  22. ??
  23. /*?
  24. ?CTCellularData在iOS9之前是私有類,權限設置是iOS10開始的,所以App?Store審核沒有問題?
  25. ?獲取網絡權限狀態?
  26. ?*/??
  27. -?(void)networkStatus:(UIApplication?*)application?didFinishLaunchingWithOptions:(NSDictionary?*)launchOptions?{??
  28. ????//2.根據權限執行相應的交互??
  29. ????CTCellularData?*cellularData?=?[[CTCellularData?alloc]?init];??
  30. ??????
  31. ????/*?
  32. ?????此函數會在網絡權限改變時再次調用?
  33. ?????*/??
  34. ????cellularData.cellularDataRestrictionDidUpdateNotifier?=?^(CTCellularDataRestrictedState?state)?{??
  35. ????????switch?(state)?{??
  36. ????????????case?kCTCellularDataRestricted:??
  37. ??????????????????
  38. ????????????????NSLog(@"Restricted");??
  39. ????????????????//2.1權限關閉的情況下?再次請求網絡數據會彈出設置網絡提示??
  40. ????????????????[self?getAppInfo];??
  41. ????????????????break;??
  42. ????????????case?kCTCellularDataNotRestricted:??
  43. ??????????????????
  44. ????????????????NSLog(@"NotRestricted");??
  45. ????????????????//2.2已經開啟網絡權限?監聽網絡狀態??
  46. ????????????????[self?addReachabilityManager:application?didFinishLaunchingWithOptions:launchOptions];??
  47. //????????????????[self?getInfo_application:application?didFinishLaunchingWithOptions:launchOptions];??
  48. ????????????????break;??
  49. ????????????case?kCTCellularDataRestrictedStateUnknown:??
  50. ??????????????????
  51. ????????????????NSLog(@"Unknown");??
  52. ????????????????//2.3未知情況?(還沒有遇到推測是有網絡但是連接不正常的情況下)??
  53. ????????????????[self?getAppInfo];??
  54. ????????????????break;??
  55. ??????????????????
  56. ????????????default:??
  57. ????????????????break;??
  58. ????????}??
  59. ????};??
  60. }??
  61. ??
  62. /**?
  63. ?實時檢查當前網絡狀態?
  64. ?*/??
  65. -?(void)addReachabilityManager:(UIApplication?*)application?didFinishLaunchingWithOptions:(NSDictionary?*)launchOptions?{??
  66. ????AFNetworkReachabilityManager?*afNetworkReachabilityManager?=?[AFNetworkReachabilityManager?sharedManager];??
  67. ??????
  68. ????//這個可以放在需要偵聽的頁面??
  69. ????//????[[NSNotificationCenter?defaultCenter]addObserver:self?selector:@selector(afNetworkStatusChanged:)?name:AFNetworkingReachabilityDidChangeNotification?object:nil];??
  70. ????[afNetworkReachabilityManager?setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus?status)?{??
  71. ????????switch?(status)?{??
  72. ????????????case?AFNetworkReachabilityStatusNotReachable:{??
  73. ????????????????NSLog(@"網絡不通:%@",@(status)?);??
  74. ????????????????break;??
  75. ????????????}??
  76. ????????????case?AFNetworkReachabilityStatusReachableViaWiFi:{??
  77. ????????????????NSLog(@"網絡通過WIFI連接:%@",@(status));??
  78. ????????????????if?(self.mallConfigModel?==?nil)?{??
  79. ???????????????????[self?getInfo_application:application?didFinishLaunchingWithOptions:launchOptions];??
  80. ????????????????}??
  81. ????????????????break;??
  82. ????????????}??
  83. ????????????case?AFNetworkReachabilityStatusReachableViaWWAN:{??
  84. ????????????????NSLog(@"網絡通過無線連接:%@",@(status)?);??
  85. ????????????????if?(self.mallConfigModel?==?nil)?{??
  86. ????????????????????[self?getInfo_application:application?didFinishLaunchingWithOptions:launchOptions];??
  87. ????????????????}??
  88. ????????????????break;??
  89. ????????????}??
  90. ????????????default:??
  91. ????????????????break;??
  92. ????????}??
  93. ????}];??
  94. ??????
  95. ????[afNetworkReachabilityManager?startMonitoring];??//開啟網絡監視器;??
  96. }??
  97. ??
  98. -?(void)getInfo_application:(UIApplication?*)application?didFinishLaunchingWithOptions:(NSDictionary?*)launchOptions?{??
  99. ??????
  100. ????//第三方庫初始化??
  101. ????[self?initValueThirdParty:application?didFinishLaunchingWithOptions:launchOptions];??
  102. ??????
  103. //????//獲取初始信息??
  104. ????[self?initData];??
  105. ??????
  106. ????//添加通知??
  107. ????[self?addNotification];??
  108. }??



這樣也同時解決了用戶如果選擇不允許和限制兩種情況,在用戶沒有統一聯網的情況下,APP會顯示沒有網絡的UI,重新進入APP會調用在不允許狀態下會調用一個測試接口,APP會自動彈出重新選擇網絡權限以及說明的彈窗,進入設置修改過APP聯網權限以后選擇回到APP就會觸發cellularDataRestrictionDidUpdateNotifier,在回調里進行相應的人機交互就可以了。




2.延遲請求

就是把配置請求放到首頁VC里,不要放到AppDelegate里,同時監聽網絡狀態(AF,其他第三方等)有個致命性的問題就是獲取網絡狀態會有一定的延遲(親測),導致很多情況,還有就是要自己處理權限彈框以及對原有代碼邏輯要進行修改。

總結

這個問題遇到幾次了,原來都是用第二種方式進行了一定的優化,這次的APP有一個配置信息接口導致出現問題,寫下來作為記錄,方法還有很多種,不足的地方還有很多,僅供大家參考。

轉載于:https://www.cnblogs.com/Free-Thinker/p/8303261.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/281369.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/281369.shtml
英文地址,請注明出處:http://en.pswp.cn/news/281369.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

su命令

從一個用戶切換到另一個用戶&#xff1a;su - ceshi(ceshi是用戶名) 查看當前用戶&#xff1a;whoami 在不切換用戶的情況執行另一個用戶的命令&#xff1a;例&#xff1a;su - -c "touch /tmp/111.txt" admin 若用戶沒有加目錄需要添加家目錄&#xff0c;并更改所有…

C語言基礎知識【數據類型】

C 數據類型1.在 C 語言中&#xff0c;數據類型指的是用于聲明不同類型的變量或函數的一個廣泛的系統。變量的類型決定了變量存儲占用的空間&#xff0c;以及如何解釋存儲的位模式。2.C 中的類型可分為以下幾種&#xff1a;序號 類型與描述1 基本類型&#xff1a;它們是算…

PS批量替換內容

在制作圖片物料的時候&#xff0c;有時會碰到需要制作大量內容格式一致&#xff0c;但部分文字或圖片不同的圖片&#xff0c;這里我們使用PS的變量功能 物料準備&#xff1a;準備好需要替換的圖片和文字&#xff0c;使用excel制作出需要替換的內容&#xff0c;第一行name和pic…

在 .NET 中執行 JavaScript 代碼

你好&#xff0c;這里是 Dotnet 工具箱&#xff0c;定期分享 Dotnet 有趣&#xff0c;實用的工具和組件&#xff0c;希望對您有用&#xff01;Jint 簡介如果您想在您的 .NET 程序中使用 Javascript&#xff0c;那么我推薦您使用 Jint。Jint 是適用于 .NET 的 開源 Javascript 解…

【本周面試題】第5周 - 開發工具相關

待整理轉載于:https://www.cnblogs.com/padding1015/p/10095424.html

JS 返回上一步(退回上一步上一個網頁)

鏈接式&#xff1a; <a href"javascript:history.go(-1)">返回上一步</a> <a href"<%Request.ServerVariables("HTTP_REFERER")%>">返回上一步</a> 按鈕式&#xff1a; <INPUT name"pclog" type&quo…

jmeter多用戶登錄跨線程組操作傳值

項目需求&#xff1a; 需要登錄兩個用戶A、B&#xff0c;用戶A操作完后會通知B&#xff0c;然后B再操作&#xff0c;B操作完結束或者再通知A。 實現思路&#xff1a; 1. 設置兩個線程組Ⅰ、Ⅱ&#xff0c;組Ⅰ添加cookie管理器&#xff0c;里面添加用戶A的操作&#xff1b;組Ⅱ…

手動修改美化7zip圖標 - 附替換文件

手動修改7zip圖標理論知識制作ico圖標文件替換資源重建圖標緩存效果圖替換文件7-Zip的自帶圖標是公認的丑&#xff0c;所以網上有很多7-Zip的圖標美化工具&#xff0c;用的最多的就是 7-Zip Theme Manager&#xff0c;自帶很多主題&#xff0c;但是最近我再使用7zTM修改圖標是卻…

.NET性能優化-復用StringBuilder

在之前的文章中&#xff0c;我們介紹了 dotnet 在字符串拼接時可以使用的一些性能優化技巧。比如&#xff1a;為StringBuilder設置 Buffer 初始大小使用ValueStringBuilder等等 不過這些都多多少少有一些局限性&#xff0c;比如StringBuilder還是會存在new StringBuilder()這樣…

如何使用vue組件搭建網頁并打包發布

vue組件化項目搭建及編譯打包發布引言開發環境開發環境介紹開發環境安裝使用模板創建項目編譯及打包發布引言 最近開始學習Vue&#xff0c;Vue 是一個前端框架&#xff0c;特點是數據綁定和組件化。網上很多教程&#xff0c;數據綁定和組件學習起來也都不困難&#xff0c;但是…

MyBatis 分頁插件 PageHelper

插件官網 簡介&#xff1a; 支持常見的 12 種數據庫。Oracle,MySql,MariaDB,SQLite,DB2,PostgreSQL,SqlServer 等&#xff1b; 支持常見的RowBounds(PageRowBounds)&#xff0c;PageHelper.startPage 方法調用&#xff0c;Mapper 接口參數調用&#xff1b; 獲取maven配置 示例&…

Facebook揭秘其應用測試平臺,并開源核心技術

本周&#xff0c;Facebook讓一群記者參觀了它位于俄勒岡州普賴恩維爾市的數據中心&#xff0c;在這個過程中也展示了他們的一個移動應用測試實驗室&#xff0c;用來測試Facebook app、 Messenger 和Instagram。 目前 這個實驗室總共含有60個機架&#xff0c;每個機架上放置32臺…

責任鏈模式 職責鏈模式 Chain of Responsibility Pattern 行為型 設計模式(十七)

責任鏈模式&#xff08;Chain of Responsibility Pattern&#xff09;職責鏈模式意圖 使多個對象都有機會處理請求&#xff0c;從而避免請求的發送者和接受者之間的耦合關系將這些對象連接成一條鏈&#xff0c;并沿著這條鏈傳遞請求&#xff0c;直到有一個對象處理它為止。責任…

YOLOv7 在 ML.NET 中使用 ONNX 檢測對象

本文介紹如何在 ML.NET 中使用 YOLOv7 的 ONNX 模型來檢測圖像中的對象。什么是 YOLOYOLO&#xff08;You Only Look Once&#xff09;是一種先進的實時目標檢測系統。它是一個在COCO數據集上預訓練的物體檢測架構和模型系列&#xff0c;其版本也是在不斷優化更新。2022年7月&a…

Vue中render: h = h(App)的含義

原文地址&#xff1a;Explanation for render: h > h(App) please 翻譯如下&#xff1a; render: h > h(App) 是下面內容的縮寫&#xff1a; render: function (createElement) {return createElement(App); }進一步縮寫為(ES6 語法)&#xff1a; render (createElem…

NppFTP小插件的使用

大家在Linux系統中配置運行環境時&#xff0c;一定會遇到相關配置文件的修改&#xff0c;雖說在Linux系統中可以使用vi,vim的命令進行文本編輯&#xff0c;但是操作起來還是沒有在Windows系統中用的爽&#xff0c;特別是操作大文本量的文件時。Notepad里提供了一個小插件&#…

『實戰』使用Excel催化劑二維碼功能批量生成帶不同圖案二維碼。

熟悉Excel催化劑的老讀者都知道&#xff0c;每逢圖書大促&#xff0c;筆者都會向出版社申請優惠碼優惠券來惠及廣大粉絲。當然公眾號上幫出版社推薦圖書&#xff0c;會有傭金回報&#xff0c;這也是筆者唯一能接受的推廣方式。公眾號自創立以來&#xff0c;沒有接過軟文&#x…

springboot ElasticSearch 簡單的全文檢索高亮

前陣子和張三豐聊天提到了es。這次正好有機會學習并使用 首先引入依賴 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-elasticsearch</artifactId> </dependency> 配置文件 spring.data.…

JavaScriptSerializer類 對象序列化為JSON,JSON反序列化為對象

JavaScriptSerializer 類由異步通信層內部使用&#xff0c;用于序列化和反序列化在瀏覽器和 Web 服務器之間傳遞的數據。說白了就是能夠直接將一個C#對象傳送到前臺頁面成為javascript對象。要添加System.Web.Extensions.dll的引用。該類位于System.Web.Script.Serialization命…

nodejs 實踐:express 最佳實踐(六) express 自省獲得所有的路由

nodejs 實踐&#xff1a;express 最佳實踐(六) express 自省獲得所有的路由 某些情況下&#xff0c;你需要知道你的應用有多少路由&#xff0c;這在 express 中沒有方法可以。因此我這邊曲線了一下&#xff0c;做成了一個函數進行處理。遍歷所有的方法進行處理。 代碼 const _ …