做旅行網(wǎng)站的依據(jù)及意義國內(nèi)十大搜索引擎網(wǎng)站
情況說明
筆者項(xiàng)目在首次啟動(dòng),登錄界面點(diǎn)擊登錄按鈕會(huì)先HTTPS請(qǐng)求創(chuàng)建帳號(hào),但是在WIFI網(wǎng)絡(luò)下,請(qǐng)求后一直提示網(wǎng)絡(luò)連接失敗。但是切換到流量包后,則會(huì)彈出"無線數(shù)據(jù)"使用數(shù)據(jù)
的彈窗,選擇允許后則可順利進(jìn)入。
分析
錯(cuò)誤原因就是在WIFI環(huán)境下HTTPS請(qǐng)求未能彈出權(quán)限界面,導(dǎo)致當(dāng)前無線數(shù)據(jù)
的權(quán)限是關(guān)閉的,而使用流量時(shí)又可以內(nèi)部觸發(fā)彈出權(quán)限選擇界面。
具體的原因網(wǎng)上說法也很多,比如:
- WIFI設(shè)置了代理,流量未設(shè)置代理。導(dǎo)致WIFI環(huán)境下的HTTPS請(qǐng)求被攔截,未能彈出選擇窗口。
- Info.list下未配置NSAllowsArbitraryLoads權(quán)限為true
上述筆者這邊都排除了,但是有個(gè)可能是筆者這邊HTTPS請(qǐng)求是使用的是一個(gè)比較老的穩(wěn)定性挺好,且用于多個(gè)線上項(xiàng)目的Best HTTP插件,有可能是Unity升級(jí)后插件適配的問題?
解決方案
一般而言App首次啟動(dòng),網(wǎng)絡(luò)請(qǐng)求時(shí)都會(huì)彈出是否允許使用數(shù)據(jù)
的彈窗。但是這種坑就遇到了,又不想換Best HTTP插件。
遂寫了個(gè)iOS插件,在進(jìn)入登錄界面時(shí)模擬一次網(wǎng)絡(luò)請(qǐng)求。代碼如下:
#import <Foundation/Foundation.h>@interface IWebRequestPermission : NSObject#ifdef __cplusplus
extern "C" {
#endifBOOL IsConnectedToInternet();void TryRequestPermissionIfNeeded();
#ifdef __cplusplus
}
#endif
@end
#import "WebRequestPermission.h"
// 引入 SystemConfiguration.framework
#import <SystemConfiguration/SystemConfiguration.h>@implementation IWebRequestPermission
// 檢查當(dāng)前網(wǎng)絡(luò)連接狀態(tài)
BOOL IsConnectedToInternet() {BOOL isConnected = NO;SCNetworkReachabilityRef reachability = SCNetworkReachabilityCreateWithName(NULL, "www.baidu.com");SCNetworkReachabilityFlags flags;if (SCNetworkReachabilityGetFlags(reachability, &flags)) {isConnected = ((flags & kSCNetworkReachabilityFlagsReachable) != 0);}CFRelease(reachability);return isConnected;
}// 在應(yīng)用啟動(dòng)時(shí)嘗試發(fā)起一個(gè)簡單的網(wǎng)絡(luò)請(qǐng)求
void TryRequestPermissionIfNeeded() {if (IsConnectedToInternet()) {NSURL *url = [NSURL URLWithString:@"https://www.baidu.com"];NSURLSessionDataTask *dataTask = [[NSURLSession sharedSession] dataTaskWithURL:url completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {// 處理網(wǎng)絡(luò)請(qǐng)求的結(jié)果}];[dataTask resume];}
}
@end
在進(jìn)入登錄界面時(shí)Unity側(cè)調(diào)用TryRequestPermissionIfNeeded()即可