İOS 9'da NSURLSession / NSURLConnection HTTP yükü başarısız oldu


137

Mevcut uygulamamı iOS9'da çalıştırmayı denedim ancak kullanırken hata oluştu AFURLSessionManager.

__block NSURLSessionDataTask *task = [self.sessionManager dataTaskWithRequest:request completionHandler:^(NSURLResponse * __unused response, id responseObject, NSError *error) {
    if (error) {

    } else {

    }
}];

[task resume];

Aşağıdaki hatayı alıyorum:

Error Domain=NSURLErrorDomain Code=-999 "cancelled.

Ayrıca aşağıdaki günlükleri almak:

 NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9824
 CFNetwork SSLHandshake failed (-9824)

Güncelleme: Çözümüme birden fazla güncelleme ekledim: NSURLSession / NSURLConnection HTTP yükü iOS 9'da başarısız oldu


Hatanın ilk satırda olduğundan emin misiniz?
BSMP

1
Aynı sorunu yaşadım. Bu konuyu ele alıyor gibi görünüyordu: stackoverflow.com/questions/30720813/…
phillies2628

Yanıtlar:


240

Bulunan çözüm:

İOS9'da ATS, HTTPS kullanımı da dahil olmak üzere ağ aramaları sırasında en iyi uygulamaları uygular.

Apple belgelerinden:

ATS, yanlışlıkla açığa çıkmayı önler, güvenli varsayılan davranış sağlar ve benimsenmesi kolaydır. İster yeni bir uygulama oluşturuyor olun, ister mevcut bir uygulamayı güncelleyin, ATS'yi en kısa zamanda kabul etmelisiniz. Yeni bir uygulama geliştiriyorsanız, HTTPS'yi yalnızca kullanmalısınız. Mevcut bir uygulamanız varsa, HTTPS'yi şu anda kullanabildiğiniz kadar kullanmalı ve uygulamanızın geri kalanını mümkün olan en kısa sürede taşımak için bir plan oluşturmalısınız.

Beta 1'de, şu anda bunu info.plist içinde tanımlamanın bir yolu yoktur. Çözüm manuel olarak eklemektir:

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

resim açıklamasını buraya girin

Güncelleme1: Bu, iOS9 ATS desteğini kullanmaya hazır olana kadar geçici bir çözümdür.

Güncelleme2: Daha fazla ayrıntı için lütfen aşağıdaki bağlantıya bakın: http://ste.vn/2015/06/10/configuring-app-transport-security-ios-9-osx-10-11/

Update3: Yalnızca TLS 1.0 olan bir ana bilgisayara (YOURHOST.COM) bağlanmaya çalışıyorsanız

Bunları uygulamanızın Info.plist'e ekleyin

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>YOURHOST.COM</key>
        <dict>
            <key>NSIncludesSubdomains</key>
            <true/>
            <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
            <true/>
            <key>NSTemporaryExceptionMinimumTLSVersion</key>
            <string>1.0</string>
            <key>NSTemporaryExceptionRequiresForwardSecrecy</key>
            <false/>
        </dict>
    </dict>
</dict>

10
Application Transport Security uygulamasından tamamen kurtulduğunuzdan emin olun, böylece önemli bir iOS 9 özelliği uygulamanızdan yeni çıkmıştır. Bu bir hack, ve bu hack ap'nizi reddederse şaşırmam. Bu sözlüklere belirli web sitelerinin eklenmesine izin verilecektir.
gnasher729

2
@StevenPeterson Uygulamanın tamamını yalnızca Apple tarafından vaka bazında hariç tutabileceksiniz. Apple, uygulamanızı bu yetenekle kutsarsa, bu anahtarı eklemenizi söyleyeceklerini varsayıyorum. Apple'ın bunu nadiren yapmasını bekleyin.
mattyohe

8
Lütfen, lütfen, lütfen, lütfen, lütfen - sadece plisterinize istisna eklemeyin ve "sadece çalıştığı için" devam edin. Kullanıcı verilerinizin güvenliğini göz önünde bulundurun ve SSL ve diğer en iyi güvenlik uygulamalarını uygulayın.
Noel Baba

8
@ gnasher729, sadece ATS'yi devre dışı bırakmak yerine TLS 1.2'yi desteklemenin daha iyi olduğunu anlıyorum. Ancak, bir üçüncü taraf API / web hizmetine güveniyorsanız ne yapabilirsiniz? Onları yükseltmeye zorlayamıyorum, bu yüzden ne yapabilirim?
Woodstock

7
Bu cevapta küçük bir hata var: 1.0 yerine TLSv1.0NSTemporaryExceptionMinimumTLSVersion olmalı , bkz. NSAppTransportSecurity Özel Durum etki alanları sözlük anahtarları
mbi

54

İOS9'da SSL ile nasıl başa çıkılır? Bir çözüm aşağıdakileri yapmaktır:

As Elma söz hakkından: resim açıklamasını buraya girin resim açıklamasını buraya girin

resim açıklamasını buraya girin

iOS 9 ve OSX 10.11, uygulamanızın Info.plist dosyasında istisna alan adları belirtmediğiniz sürece veri istemeyi planladığınız tüm ana bilgisayarlar için TLSv1.2 SSL gerektirir.

Info.plist yapılandırmasının sözdizimi şöyle görünür:

<key>NSAppTransportSecurity</key>
<dict>
  <key>NSExceptionDomains</key>
  <dict>
    <key>yourserver.com</key>
    <dict>
      <!--Include to allow subdomains-->
      <key>NSIncludesSubdomains</key>
      <true/>
      <!--Include to allow insecure HTTP requests-->
      <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
      <true/>
      <!--Include to specify minimum TLS version-->
      <key>NSTemporaryExceptionMinimumTLSVersion</key>
      <string>TLSv1.1</string>
    </dict>
  </dict>
</dict>

Uygulamanızın (örneğin bir üçüncü taraf web tarayıcısı) rastgele ana bilgisayarlara bağlanması gerekiyorsa, uygulamayı şu şekilde yapılandırabilirsiniz:

<key>NSAppTransportSecurity</key>
<dict>
    <!--Connect to anything (this is probably BAD)-->
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>

Bunu yapmak zorundaysanız, muhtemelen sunucularınızı, henüz yapmadılarsa TLSv1.2 ve SSL kullanacak şekilde güncellemek en iyisidir. Bu geçici bir çözüm olarak düşünülmelidir.

Bugün itibariyle, yayın öncesi belgeler bu yapılandırma seçeneklerinden hiçbirini belirli bir şekilde belirtmemektedir. Bunu yaptıktan sonra cevabı ilgili belgelere bağlamak için güncelleyeceğim.

Daha fazla bilgi için iOS9AdaptationTips adresine gidin.


4
SSL ve TLS, HTTPS protokolleri tarafından kullanılan farklı şifreleme katmanlarıdır. Bu nedenle, SSL'yi tamamen devre dışı bırakmalı ve TLS v1.2 veya üstünü kullanmalıdır. Daha fazla bilgi için aşağıdaki kaynakla başlamanızı öneririm: SSL / TLS Güvenliği 2015 - Basitleştirilmiş Hızlı Kılavuz
Conrad Taylor

2
Sadece NSAllowsArbitraryLoads true olarak ayarladığınız alt örnek ile herhangi bir şans ekleyin. Sunucum sadece TLS v1.2 kullanıyor ve hala çalışmak için bunu yapmak zorundayım. Çok sinir bozucu.
Scooter

1
Peki, yeni uygulamamın App Store'da proxy hizmeti gibi onaylanacağından emin olmak için kullanabileceğim bir çözüm var mı?
Josh

41

Apple'ın Uygulama Taşıma Güvenliği Teknisyeni çok kullanışlıdır ; sorunumuza daha güvenli bir çözüm bulmamıza yardımcı oldu.

Umarım bu başka birine yardımcı olur. Mükemmel bir şekilde geçerli görünen Amazon S3 URL'lerine, TLSv12 HTTPS URL'lerine bağlanırken sorun yaşıyorduk. NSExceptionRequiresForwardSecrecyS3'ün kullandığı bir avuç daha fazla şifreyi etkinleştirmek için devre dışı bırakmamız gerektiği ortaya çıktı.

Bizim Info.plist:

<key>NSAppTransportSecurity</key>
<dict>
  <key>NSExceptionDomains</key>
  <dict>
    <key>amazonaws.com</key>
    <dict>
      <key>NSIncludesSubdomains</key>
      <true/>
      <key>NSExceptionRequiresForwardSecrecy</key>
      <false/>
    </dict>
  </dict>
</dict>

Bu benim tam sorunumdu ve anında düzeltti! Teşekkür! :)
Alex Zak

Bu benim yaşadığım problemi de çözüyor; farklı durumlar farklı ayarlar gerektirebilir. İyi haber şu ki, teknik bilgi, genel olarak doğru ayarları bulmanıza yardımcı olmak için nsurl'un nasıl kullanılacağı hakkında bilgi içeriyor.
ecotax

Amazon S3'ün önünde bir CDN kullandıysam, cloudfront.net için de aynısını yapmam gerekiyordu.
Raymond26

7

Benim gibi Amazon S3 ile bu sorunu yaşıyorsanız, bunu info.plist'e üst düzey etiketinizin doğrudan alt öğesi olarak yapıştırmayı deneyin.

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>amazonaws.com</key>
        <dict>
              <key>NSThirdPartyExceptionMinimumTLSVersion</key>
              <string>TLSv1.0</string>
              <key>NSThirdPartyExceptionRequiresForwardSecrecy</key>
              <false/>
              <key>NSIncludesSubdomains</key>
              <true/>
        </dict>
        <key>amazonaws.com.cn</key>
        <dict>
              <key>NSThirdPartyExceptionMinimumTLSVersion</key>
              <string>TLSv1.0</string>
              <key>NSThirdPartyExceptionRequiresForwardSecrecy</key>
              <false/>
              <key>NSIncludesSubdomains</key>
              <true/>
        </dict>
    </dict>
</dict>

Daha fazla bilgiyi şu adreste bulabilirsiniz:

http://docs.aws.amazon.com/mobile/sdkforios/developerguide/ats.html#resolving-the-issue


2
Tanrı seni korusun kardeşim
Vervatovskis

5

Buradan çözüm buldum . Ve bu benim için çalışıyor.

Bunu kontrol et, sana yardımcı olabilir.

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
         <dict>
             <key>myDomain.com</key>
                    <dict>
                      <!--Include to allow subdomains-->
                      <key>NSIncludesSubdomains</key>
                      <true/>
                      <!--Include to allow HTTP requests-->
                      <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
                      <true/>
                      <!--Include to specify minimum TLS version-->
                      <key>NSTemporaryExceptionMinimumTLSVersion</key>
                      <string>TLSv1.1</string>
                </dict>
          </dict>
</dict>

4

Aşağıdaki alanları .plist dosyanıza eklemeniz yeterlidir

resim açıklamasını buraya girin

Sözdizimi şöyle görünür:

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

Bu, tüm http isteklerine izin verecektir. Çalışır, ancak önerilmez.
KVISH

2

Güncelleme:

Xcode 7.1'den itibaren, NSAppTransportSecuritySözlük'ü manuel olarak girmenize gerek yoktur info.plist.

Artık sizin için otomatik tamamlayacak, bunun bir sözlük olduğunu fark edecek ve ardından Allows ArbitraryYükleri de otomatik olarak tamamlayacaktır . info.plist ekran görüntüsü


Bu, tüm http isteklerine izin verecektir. Çalışır, ancak önerilmez.
KVISH

2

NSURLConnection Http yüklenemedi hatasını çözme Sadece info.plist içinde aşağıdaki Dict'i ekle:

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

1

Ben info.plist içinde bazı anahtar ekleyerek çözdüm. İzlediğim adımlar:

Projemin info.plist dosyasını açtım

Sözlük olarak NSAppTransportSecurity adlı bir Anahtar eklendi.

NSAllowsArbitraryLoads adlı bir Alt anahtar Boole olarak eklendi ve değerini aşağıdaki gibi YES olarak ayarlayın. resim açıklamasını buraya girin

Projeyi Temizleyin ve Şimdi Herşey eskisi gibi iyi çalışıyor.

Ref Bağlantısı: https://stackoverflow.com/a/32609970


1

Bu hatayı aldığımda benim için işe yarayan buydu:

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>example.com</key>
        <dict>
            <key>NSExceptionRequiresForwardSecrecy</key>
            <false/>
            <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
            <true/>
            <key>NSIncludesSubdomains</key>
            <true/>
            <key>NSTemporaryExceptionMinimumTLSVersion</key>
            <string>TLSv1.0</string>
        </dict>
    </dict>
</dict>

1

Bu işlevi RCTHTTPRequestHandler.m dosyasına eklemeyi deneyebilirsiniz

- (void)URLSession:(NSURLSession *)session didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential *credential))completionHandler { completionHandler(NSURLSessionAuthChallengeUseCredential, [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust]); }


1

Yukarıda belirtilen cevaplara ek olarak, URL'nizi tekrar kontrol edin


Benim durumumda .html dosyasını yüklemeye çalışıyordum.
Vaishnavi

0

Sen eklemek gerekir App Transport Security Settingsetmek info.plistve eklemek Allow Arbitrary LoadsiçinApp Transport Security Settings

resim açıklamasını buraya girin

<key>NSAppTransportSecurity</key>
    <dict>
        <key>NSAllowsArbitraryLoads</key>
        <true/>
    </dict>
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.