【ios编程报错处理-1】错误提示:App transport security has blocked a exceptions can be configured via your app's

iOS9及更高版本默认启用App Transport Security,导致http请求被阻止。解决此问题有两种方法:一是通过在Info.plist文件中添加特定代码;二是使用Xcode的可视化界面,新增NSAppTransportSecurity项并设置NSAllowsArbitraryLoads为YES。

更新到Xcode7后大部分会发现自己的项目的数据加载出现了问题,控制台提示:
App transport security has blocked a exceptions can be configured via your app's info.plist file.

因为iOS9将不采用默认的http等不安全的请求。在iOS9 中,苹果将原http协议改成了https协议,使用 TLS1.2 SSL加密请求数据。
2种方式(相同结果)可以解决这个问题:

方式一:添加代码方式

  1. 可以在Info.plist文件中加入以下代码,来解决这个运行的问题。打开Info.plist文件的方式是:
    这里写图片描述

打开后可以看到:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>NSAppTransportSecurity</key>
    <dict>
        <key>NSAllowsArbitraryLoads</key>
        <true/>
    </dict>
    <key></
### Vue2 项目中 v-on 事件处理器出现 SecurityError 的解决方案 在 Vue2 项目中,当使用 `v-on` 事件处理器时,如果涉及跨域的 iframe,可能会遇到浏览器阻止某个 frame 的 origin 访问的问题。这种错误通常表现为 `SecurityError: Blocked a frame with origin from accessing a cross-origin frame`[^1]。 #### 错误原因分析 该问题的根本原因是浏览器的安全策略(Same-Origin Policy)。当父页面尝试访问嵌入的 iframe 内容时,如果两者来源(origin)不同,则浏览器会阻止这种跨域访问。例如,如果父页面的 URL 是 `https://www.example.com`,而 iframe 的 `src` 属性指向 `https://example.com`,即使域名相似,但由于子域名不同,浏览器仍然将其视为跨域请求[^2]。 #### 解决方案 ##### 方法一:确保 iframe 和父页面的 origin 一致 最直接的解决方法是确保父页面和 iframe 的来源一致。例如,如果父页面的 URL 是 `https://www.example.com`,则 iframe 的 `src` 属性也应指向 `https://www.example.com`。通过这种方式可以避免跨域问题的发生。 ##### 方法二:使用 `postMessage` 实现跨域通信 如果无法保证父页面和 iframe 的来源一致,可以通过 `postMessage` API 实现安全的跨域通信。以下是具体实现步骤: 1. **父页面向 iframe 发送消息**: 父页面可以通过以下代码向 iframe 发送消息: ```javascript const iframe = document.getElementById('myIframe'); // 获取 iframe 元素 iframe.contentWindow.postMessage({ action: 'greet', data: 'Hello from parent' }, '*'); ``` 2. **iframe 接收消息并响应**: 在 iframe 中监听 `message` 事件,并根据接收到的消息执行相应操作: ```javascript window.addEventListener('message', (event) => { if (event.origin !== 'https://www.example.com') return; // 验证消息来源 console.log(event.data); // 处理接收到的数据 }); ``` 3. **iframe 向父页面发送消息**: 如果需要从 iframe 向父页面发送消息,可以使用以下代码: ```javascript window.parent.postMessage({ action: 'response', data: 'Hello from iframe' }, '*'); ``` 4. **父页面接收消息**: 父页面同样需要监听 `message` 事件以处理来自 iframe 的消息: ```javascript window.addEventListener('message', (event) => { if (event.origin !== 'https://iframe-origin.com') return; // 验证消息来源 console.log(event.data); // 处理接收到的数据 }); ``` 通过上述方式,可以在不违反同源策略的情况下实现父子页面之间的通信[^3]。 ##### 方法三:调整服务器配置支持 CORS 如果 iframe 和父页面的来源确实不同,但你有权限修改服务器配置,可以考虑启用跨域资源共享(CORS)。通过在服务器端设置适当的响应头,允许特定来源的请求访问资源。例如,在服务器返回的 HTTP 响应中添加以下头信息: ```http Access-Control-Allow-Origin: https://www.example.com ``` 这将允许 `https://www.example.com` 来源的请求访问 iframe 资源。需要注意的是,这种方法仅适用于某些特定场景,可能不适用于所有情况。 #### 注意事项 - 在使用 `postMessage` 时,务必验证消息的来源(`event.origin`),以防止潜在的安全风险。 - 如果涉及敏感数据传输,建议使用 HTTPS 协议以确保通信安全。 ### 示例代码 以下是一个完整的示例,展示如何在 Vue2 项目中使用 `postMessage` 实现跨域通信: 父页面: ```html <template> <div> <iframe id="myIframe" src="https://iframe-origin.com"></iframe> <button @click="sendMessage">Send Message</button> </div> </template> <script> export default { methods: { sendMessage() { const iframe = document.getElementById('myIframe'); iframe.contentWindow.postMessage({ action: 'greet', data: 'Hello from parent' }, '*'); } } }; </script> ``` iframe 页面: ```javascript window.addEventListener('message', (event) => { if (event.origin !== 'https://www.example.com') return; console.log('Received message:', event.data); }); ``` #### 结论 通过确保来源一致、使用 `postMessage` 或调整服务器配置支持 CORS,可以有效解决 Vue2 项目中因跨域导致的 `SecurityError` 问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值