2015-09-22 19 views
6
$.ajax({ 
    type: "GET", 
    url: "http://myweb/php", 
    success: function (data){ 
     alert(data); 
    }, 
    error:function(xhr,textStatus,err) 
    { 
     alert("readyState: " + xhr.readyState); 
     alert("responseText: "+ xhr.responseText); 
     alert("status: " + xhr.status); 
     alert("text status: " + textStatus); 
     alert("error: " + err); 
    } 
}); 

Và kết quả tôi nhận được là:Ajax Không làm việc trong IOS 9.0 Cordova

readyState:0 
responseText:"" 
status:0 
text status:error 
error:"" 

tôi cố gắng thêm tiêu đề trong php của tôi, nhưng vẫn không làm việc. Mã ajax hoạt động trước khi tôi cập nhật xcode của tôi lên 7.0 và ios giả lập thành 9.0.

header('Content-Type: application/json'); 
header('Access-Control-Allow-Origin: *'); 

Trả lời

12

Theo như tôi hiểu toàn bộ ATS (App Giao thông vận tải An ninh - iOS 9) điều, phương pháp được đề nghị từ area28 không phải là một trong những bạn đang sử dụng bên trong một ứng dụng.

<key>NSAppTransportSecurity</key> 
<dict> 
    <key>NSAllowsArbitraryLoads</key><true/> 
</dict> 

Điều này sẽ cho phép tất cả các yêu cầu bên ngoài để mỗi miền gì là dứt khoát không phải là cách bạn nên sử dụng nó. Theo tôi, bạn nên xác định một mới <dict> bên info.plist của bạn và thêm mã này vào nó (để chỉnh sửa info.plist bạn chỉ có thể sử dụng một trình soạn thảo văn bản thông thường như văn bản tuyệt vời, vv):

<key>NSAppTransportSecurity</key> 
    <dict> 
     <key>NSExceptionDomains</key> 
     <dict> 
      <key>domain.tld</key> 
      <dict> 
       <key>NSIncludesSubdomains</key> 
       <true/> 
       <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key> 
       <true/> 
       <key>NSTemporaryExceptionMinimumTLSVersion</key> 
       <string>TLSv1.1</string> 
      </dict> 
     </dict> 
    </dict> 

này sẽ chỉ cho phép các yêu cầu vào miền bạn đã chỉ định. Cách mô tả là một trong đó táo introduced on the WWDC 2015. Như bạn có thể thấy trên ảnh chụp màn hình, đó là cách mà Apple muốn người dùng sử dụng nó.

Nếu bạn chưa xác định bất cứ điều gì, bạn sẽ nhận được

Failed to load webpage with error: The resource could not be loaded because the App Transport Security policy requires the use of a secure connection.

Vì vậy, thay đổi nó như tôi đã nói và các lỗi đã biến mất đi. enter image description here

+0

Tôi đồng ý. Cả hai sẽ làm việc, và bạn có thể nhận được cụ thể hơn nếu cần thiết. – area28

+1

Không phải bạn ** có thể **, bạn ** nên ** cụ thể hơn! Đây là những chủ đề bảo mật mà tôi không thể bàn luận được. – Sithys

+0

Cách tiếp cận thứ hai với danh sách trắng tất cả các tên miền chắc chắn là con đường để đi, cái đầu tiên không hoạt động trong iOS trước iOS9.(Thử nghiệm trên iOS 7) – maechler

5

Nếu bạn đang làm việc trong dự án Xcode, bạn có thể phải chỉnh sửa tệp info.plist. Bảo mật đã thay đổi với iOS9. Apple khuyến nghị mạnh mẽ bằng cách sử dụng https cho các yêu cầu web khi có thể. Here là câu trả lời liên quan đến vấn đề này.

Từ bài đăng đó:

Thêm tệp này vào tệp info.plist của bạn.

<key>NSAppTransportSecurity</key> 
<dict> 
    <key>NSAllowsArbitraryLoads</key><true/> 
</dict> 

App Transport Security (ATS) enforces best practices in the secure connections between an app and its back end. ATS prevents accidental disclosure, provides secure default behavior, and is easy to adopt; it is also on by default in iOS 9 and OS X v10.11. You should adopt ATS as soon as possible, regardless of whether you’re creating a new app or updating an existing one.

If you’re developing a new app, you should use HTTPS exclusively. If you have an existing app, you should use HTTPS as much as you can right now, and create a plan for migrating the rest of your app as soon as possible. In addition, your communication through higher-level APIs needs to be encrypted using TLS version 1.2 with forward secrecy. If you try to make a connection that doesn't follow this requirement, an error is thrown. If your app needs to make a request to an insecure domain, you have to specify this domain in your app's Info.plist file.

+0

Cảm ơn vì nó, nó hoạt động ~ – JohnLoong

+1

Điều này làm việc cho tôi. Ứng dụng của tôi không tải sau khi cập nhật thiết bị lên iOS9, giờ đây ứng dụng này hoạt động như một biểu tượng quyến rũ. Cuộc sống tiết kiệm, cảm ơn! –

1

Đối với tôi đó là sự kết hợp giữa câu trả lời của @28 và @Sithys. Vì vậy, tôi đã kết thúc việc thêm thông tin này vào info.plist của tôi:

<dict> 
<key>NSAppTransportSecurity</key> 
<dict> 
    <key>NSAllowsArbitraryLoads</key> 
    <true/> 
    <key>NSExceptionDomains</key> 
    <dict> 
    <key>example.domain.com</key> 
    <dict> 
     <key>NSIncludesSubdomains</key> 
     <true/> 
     <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key> 
     <true/> 
     <key>NSTemporaryExceptionMinimumTLSVersion</key> 
     <string>TLSv1.1</string> 
    </dict> 
    </dict> 
</dict> 
0

Đối với những người có thể gặp phải điều này trong tương lai. Tôi đã có cùng một vấn đề và nó hóa ra là do chứng chỉ SSL được tự ký (máy chủ phát triển). iOS 9 Cordova (UIWebView - không chắc chắn về WKWebView) sẽ âm thầm thất bại và trả về readyState: 0, responseText: "", trạng thái: 0

Android 7 không có vấn đề này.

Các vấn đề liên quan