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有一個配置信息接口導致出現問題,寫下來作為記錄,方法還有很多種,不足的地方還有很多,僅供大家參考。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM