2015-09-22 15 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); 
    } 
}); 

A wynik pojawia się:Ajax nie pracuje w IOS 9.0 Cordova

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

próbuję dodać nagłówek w moim php, ale nadal nie działa. Kod ajax działa przed aktualizacją mojego xcode'a do wersji 7.0 i symulatora ios do wersji 9.0.

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

Odpowiedz

12

O ile zrozumiałem całą ATS (App Bezpieczeństwa Transportu - iOS 9) rzecz, zalecaną metodą z area28 nie powinno być z jednej używasz wewnątrz aplikacji.

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

To pozwoli wszystkie żądania zewnętrzne do każdej domeny, co nie jest definitywnie sposób należy go użyciu. Moim zdaniem należy zdefiniować nową <dict> wewnątrz info.plist i dodaj do niej poniższy kod (aby edytować info.plist można po prostu użyć zwykłego edytora tekstu jak Sublime Text etc.):

<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> 

Pozwoli to tylko żądania do określonej domeny. Opisany sposób to ten, który jabłko introduced on the WWDC 2015. Jak widać na zrzucie ekranu, jest to sposób, w jaki jabłko chce, aby użytkownicy z niego korzystali.

Jeśli nie podano nic, dostaniesz

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.

więc zmienić to jak powiedziałem, a błąd jest odszedł. enter image description here

+0

Zgadzam się. Oba będą działały, a w razie potrzeby możesz uzyskać bardziej szczegółowe informacje. – area28

+1

Nie możesz ** może **, ty ** powinieneś być bardziej konkretny! Są to tematy bezpieczeństwa, których nie można omówić w mojej opinii. – Sithys

+0

Drugie podejście obejmujące białą listę każdej domeny to zdecydowanie droga, pierwsza nie działa w systemie iOS przed iOS9.(Testowane na iOS 7) – maechler

5

Jeśli pracujesz w projekcie Xcode może trzeba edytować plik info.plist. Bezpieczeństwo zostało zmienione w iOS9. Firma Apple zdecydowanie zaleca stosowanie protokołu HTTPS w przypadku żądań internetowych, gdy jest to możliwe. Here jest odpowiedzią związaną z tym problemem.

Od tego posta:

Dodaj to do pliku info.plist.

<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

Dzięki za to, działa ~ – JohnLoong

+1

To działało dla mnie. Moja aplikacja nie ładowała się po aktualizacji urządzenia do iOS9, teraz działa jak urok. Life Saver, dzięki! –

1

Dla mnie była to kombinacja odpowiedzi @ area28's i @Sithys. Więc dodałem to do mojej info.plist:

<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

Dla tych z was, którzy mogą natknąć się na to w przyszłości. Miałem ten sam problem i okazało się, że to dlatego, że certyfikat SSL jest samopodpisany (serwer programistyczny). iOS 9 Cordova (UIWebView - nie wiem o WKWebView) po cichu zawiedzie i wróci readyState: 0, responseText: "", status: 0

Android 7 nie miał tego problemu.

Powiązane problemy