关于HTTP和HTTPS的权限开关

今天在加载https站点的时候遇到如下的错误问题。所以对自己之前写的iOS内嵌webview做了一些修改,可以让它加载http站点也可以让它加载https站点、

下面是我加载https站点的时候出现的错误。

error: 

   NSURLConnection/CFURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9813)

HTTPS 超文本传输安全协议(缩写:HTTPS, 英语 :Hypertext Transfer Protocol Secure)是 超文本传输协议SSL/TLS 的组合,

HTTPS的主要思想是在不安全的网络上创建一安全信道,并可在使用适当的加密包和 服务器证书可被验证且可被信任时 ,对 窃听中间人攻击 提供合理的保护。

HTTPS的信任继承基于预先安装在浏览器中的 证书颁发机构 (如VeriSign、Microsoft等)(意即“我信任证书颁发机构告诉我应该信任的”)。因此,一个到某网站的HTTPS连接可被信任,如果服务器搭建自己的https 也就是说采用自认证的方式来建立https信道,这样一般在客户端是不被信任的,所以我们一般在浏览器访问一些https站点的时候会有一个提示,问你是否继续。

使用webview加载https站点的时候,也会出现这样的情况,也就是说我们必须在请求的时候将该站点设置为安全的,才能继续访问

所以我们需要在webview开始加载网页的时候首先判断判断该站点是不是https站点,如果是的话,先然他暂停加载,先用

NSURLConnection 来访问改站点,然后再身份验证的时候,将该站点置为可信任站点。然后在用webview重新加载请求。

#pragma mark - UIWebViewDelegate

- (BOOL)webView:(UIWebView *)awebView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
    NSString* scheme = [[request URL] scheme];
    NSLog(@"scheme = %@",scheme);
    //判断是不是https
    if ([scheme isEqualToString:HTTPS]) {
         //如果是https:的话,那么就用NSURLConnection来重发请求。从而在请求的过程当中吧要请求的URL做信任处理。
        if (!self.isAuthed) {
            originRequest = request;
            NSURLConnection* conn = [[NSURLConnection alloc] initWithRequest:request delegate:self];
            [conn start];
            [awebView stopLoading];
            return NO;
        }
    }

    [self reflashButtonState];
    [self freshLoadingView:YES];

    NSURL *theUrl = [request URL];
    self.currenURL = theUrl;
    return YES;
}

在NSURLConnection 代理方法中处理信任问题。

- (void)connection:(NSURLConnection *)connection willSendRequestForAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge
{

    if ([challenge previousFailureCount]== 0) {
    _authed = YES;

    //NSURLCredential 这个类是表示身份验证凭据不可变对象。凭证的实际类型声明的类的构造函数来确定。
    NSURLCredential* cre = [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust];
    [challenge.sender useCredential:cre forAuthenticationChallenge:challenge];
    }
    else<pre name="code" class="objc">
最后在NSURLConnection 代理方法中收到响应之后,再次使用web view加载https站点。
pragma mark ================= NSURLConnectionDataDelegate <NSURLConnectionDelegate>

- (NSURLRequest *)connection:(NSURLConnection *)connection willSendRequest:(NSURLRequest *)request redirectResponse:(NSURLResponse *)response
{

    NSLog(@"%@",request);
    return request;

}
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{

    self.authed = YES;
    //webview 重新加载请求。
    [webView loadRequest:originRequest];
    [connection cancel];
}

推荐两个 stackoverflow地址:

http://stackoverflow.com/questions/11573164/uiwebview-to-view-self-signed-websites-no-private-api-not-nsurlconnection-i

http://stackoverflow.com/questions/20365774/call-https-url-in-uiwebview

    </div>
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在使用 Appium 进行自动化测试时,可能需要获取应用的权限许可。以下是获取应用权限许可的 Python 代码示例: ``` from appium import webdriver from appium.webdriver.common.mobileby import MobileBy from appium.webdriver.common.touch_action import TouchAction from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By desired_caps = { "platformName": "Android", "platformVersion": "10", "deviceName": "your_device_name", "appPackage": "com.example.app", "appActivity": "com.example.app.MainActivity" } driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps) # 等待直到应用启动完成 WebDriverWait(driver, 30).until(EC.presence_of_element_located((MobileBy.ID, "com.example.app:id/button_login"))) # 获取应用权限许可 driver.start_activity("com.android.settings", ".Settings") driver.find_element(By.ID, "com.android.settings:id/search").click() driver.find_element(By.ID, "com.android.settings:id/search_src_text").send_keys("app permissions") driver.find_element(By.XPATH, "//androidx.recyclerview.widget.RecyclerView/android.widget.LinearLayout[1]").click() driver.find_element(By.XPATH, "//android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.view.ViewGroup/androidx.recyclerview.widget.RecyclerView/android.widget.LinearLayout[1]/android.widget.Switch").click() driver.press_keycode(4) driver.press_keycode(4) # 返回应用 driver.start_activity("com.example.app", "com.example.app.MainActivity") ``` 在上面的代码中,首先定义了一个 `desired_caps` 字典,其中包含了连接的设备信息和应用信息。然后使用该字典创建了一个 `webdriver` 对象。在等待应用启动完成后,使用 `start_activity` 方法打开系统设置应用,模拟用户点击进入应用权限页面,打开第一个权限开关,最后返回到测试应用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值