Uygulama Aktarımı Güvenliği ilkesi güvenli bir bağlantı kullanımını gerektirdiğinden kaynak yüklenemedi


491

Xcode'umu 7.0 veya iOS 9.0 sürümüne güncellediğimde sorunla karşılaşıyorum. Bir şekilde bana Başlıklı hata vermeye başladı

"Uygulama Aktarımı Güvenliği ilkesi güvenli bir bağlantı kullanılmasını gerektirdiğinden kaynak yüklenemedi"

Web Hizmeti Yöntemi:

-(void)ServiceCall:(NSString*)ServiceName :(NSString *)DataString
{
NSURLSessionConfiguration *sessionConfiguration = [NSURLSessionConfiguration defaultSessionConfiguration];
    [sessionConfiguration setAllowsCellularAccess:YES];
    [sessionConfiguration setHTTPAdditionalHeaders:@{ @"Accept" : @"application/json" }];
    NSURLSession *session = [NSURLSession sessionWithConfiguration:sessionConfiguration];

    NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"%@",ServiceURL]];
    NSLog(@"URl %@%@",url,DataString);
    // Configure the Request
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
    [request setValue:[NSString stringWithFormat:@"%@=%@", strSessName, strSessVal] forHTTPHeaderField:@"Cookie"];
    request.HTTPBody = [DataString dataUsingEncoding:NSUTF8StringEncoding];
    request.HTTPMethod = @"Post";

    // post the request and handle response
    NSURLSessionDataTask *postDataTask = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error)
                                          {
                                              // Handle the Response
                                              if(error)
                                              {
                                                  NSLog(@"%@",[NSString stringWithFormat:@"Connection failed: %@", [error description]]);

                                                  // Update the View
                                                  dispatch_async(dispatch_get_main_queue(), ^{

                                                      // Hide the Loader
                                                      [MBProgressHUD hideHUDForView:[[UIApplication sharedApplication] delegate].window animated:YES];


                                                  });
                                                  return;
                                              }
                                              NSArray * cookies = [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookiesForURL:request.URL];
                                              for (NSHTTPCookie * cookie in cookies)
                                              {
                                                  NSLog(@"%@=%@", cookie.name, cookie.value);
                                                  strSessName=cookie.name;
                                                  strSessVal=cookie.value;

                                              }

                                              NSString *retVal = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
}];
[postDataTask resume];

}

Hizmet, Xcode'un önceki sürümleri ve iOS önceki sürümleri için iyi çalışıyor Ancak iOS 9.0'da bulunan Xcode 7.0'a güncellediğimde, yukarıdaki web hizmeti yöntemini çağırdığımda bana aşağıdaki gibi bir sorun vermeye başladı. Aldığım Günlüğe Kaydedilen Hata:

Bağlantı başarısız oldu: Hata Domain = NSURLErrorDomain Code = -1022 "Uygulama Aktarımı Güvenliği ilkesi güvenli bir bağlantı kullanılmasını gerektirdiğinden kaynak yüklenemedi." UserInfo = {NSUnderlyingError = 0x7fada0f31880 {Hata Etki Alanı = kCFErrorDomainCFNetwork Kodu = -1022 "(null)"}, NSErrorFailingURLStringKey = MyServiceURL , NSErrorFailingURLKey = MyServiceURL = MyServiceURL = NSEocizedDeğiştirilen bir kaynak olabilir. bağ.}

Aşağıdaki Soruları ve cevapları denedim ama herhangi bir sonuç alamadım, bu servis çağrısı hatasını nasıl kaldırabileceğim konusunda önceden bir fikrim var mı?

  1. Kaynak yüklenemedi ios9
  2. Uygulama Taşıma Güvenliği Xcode 7 beta 6
  3. https://stackoverflow.com/a/32609970

Yanıtlar:


935

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

  1. Proje hedefimin info.plistdosyasını açtım

  2. Adlı bir Anahtarı eklendi NSAppTransportSecuritybir şekilde Dictionary.

  3. NSAllowsArbitraryLoadsAs olarak adlandırılan bir Alt anahtar eklendi Booleanve değerini YESaşağıdaki görüntüdeki gibi 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

DÜZENLEME: VEYA info.plistDosyanın kaynak koduna şunu ekleyebiliriz:

<key>NSAppTransportSecurity</key>
    <dict>
        <key>NSAllowsArbitraryLoads</key>
        <true/>
        <key>NSExceptionDomains</key>
        <dict>
            <key>yourdomain.com</key>
            <dict>
                <key>NSIncludesSubdomains</key>
                <true/>
                <key>NSThirdPartyExceptionRequiresForwardSecrecy</key>
                <false/>
            </dict>
       </dict>
  </dict>

5
İlk başta işe yaramıyor. Anahtarları Project> Target içine de eklemeniz gerekiyor
orafaelreis

4
İşte bazı yararlı Apple belgeleri geliştirici.apple.com
library/ios/

1
@MihirOza: Evet, ulaşım güvenliği iOS 9'un yeni bir özelliğidir.
Dominic K

2
İstisna alan adınız yoksa, altındaki tüm anahtarları kaldırın NSExceptionDomains. Ya da başka bir istisna olacak NSAllowArbitraryLoads, o zaman bunu ziyaret etmek için https kullanmalısınızexception
DawnSong

7
Xcode 8.3 / Swift 3 için App Transport Security Settingsve Allow Arbitrary Loadssırasıyla
Swapna Lekshmanan

280

NSAllowsArbitraryLoads = trueProjenin içinde kullanmak , info.plistherhangi bir sunucuya tüm bağlantının güvenli olmamasına izin verir. Güvenli olmayan bir bağlantı üzerinden yalnızca belirli bir alana erişilebildiğinden emin olmak için şunu deneyin:

resim açıklamasını buraya girin

Veya kaynak kodu olarak:

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>domain.com</key>
        <dict>
            <key>NSExceptionAllowsInsecureHTTPLoads</key>
            <true/>
            <key>NSIncludesSubdomains</key>
            <true/>
        </dict>
    </dict>
</dict>

Düzenledikten sonra projeyi temizleyin ve oluşturun.


Cevabınız için teşekkürler sadece NSAllowArbitaryLoads benim için NSExceptionAllowsInsecureHTTPLoads ekleyerek işe yaramadı
neeta

1
Bu iki anahtarı da ekledim: <! - HTTP isteklerine izin vermeyi dahil et -> <key> NSTemporaryExceptionAllowsInsecureHTTPLoads </key> <true /> <! - Minimum TLS sürümünü belirtmeyi dahil et -> <key> NSTemporaryExceptionMinimumTLSVersion </ key> <string> TLSv1.1 </string> Bir LOT daha hızlı yüklemesini sağladı.
Sandy

Not: Şimdi XCode 8 kullanıyorum: Bunu manuel olarak yapıyorsanız, "..AllowsInsecure ..." ve "... IncludesSubdomains" i eklemek için alan> Değer Türü> Sözlük'e sağ tıkladığınızdan emin olun
ArielSD

Domain.com'dan sonra bağlantı noktası numarasını belirtirsem çalışmıyor. (örneğin domain.com:3001)
Shamsiddin

43

Taşıma güvenliği iOS 9.0 veya sonraki sürümlerde ve OS Xv10.11 ve sonraki sürümlerinde sağlanır.

Bu nedenle, varsayılan olarak yalnızca uygulamalarda yalnızca https çağrılarına izin verilir. Uygulama Aktarımı Güvenliği'ni kapatmak için info.plist dosyasına aşağıdaki satırları ekleyin ...

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

Daha fazla bilgi için:
https://developer.apple.com/library/content/documentation/Genel/Reference/InfoPlistKeyReference/Articles/CocoaKeys.html#//apple_ref/doc/uid/TP40009251-SW33


Ancak, bu hala herhangi bir alana HTTP çağrısı yapmama izin vermiyor. Neden olduğuna dair bir ipucu var mı?
Ocak'ta

Bir HTTP URL'si bile olsa, URL onaylanmalıdır veya vlid SSL sertifikası olmalıdır.
Teja Kumar Bethina

35

İOS 10.x ve Swift 3.x için [aşağıdaki sürümler de desteklenmektedir] 'info.plist' içine aşağıdaki satırları eklemeniz yeterlidir

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

1
10.x ve Swift 3.x için, başka yerlerde anahtarların aslında AppTransportSecurity ve AllowsArbitraryLoads olduğunu gördüm ama bunlar yanlıştı. Swift 3.x için bile bu tuşlar için NS öneki hala gereklidir. Bu anahtarlar için NS önekine güvendiğimde hata ortadan kalktı.
Jazzmine

27

Swift 4'te şunları kullanabilirsiniz:

-> Go Info.plist

-> Bilgi özellikleri listesinin artı işaretini tıklayın

-> Uygulama Aktarımı Güvenlik Ayarlarını sözlük olarak ekle

-> Artı simgesini tıklayın Uygulama Aktarımı Güvenlik Ayarları

-> Add Keyfi Yükler izin ver set EVET

Feryat görüntü benziyor

resim açıklamasını buraya girin


23

Plist dosyası olarak çözdüm.

Bir NSAppTransportSecurity: Sözlük ekleyin.

Boole olarak "NSAllowsArbitraryLoads" adlı Alt Anahtarı ekleyin: YES

resim açıklamasını buraya girin


18

App Transport Security ilkesi Swift 4.03'te çalışan güvenli bir bağlantı kullanılmasını gerektirdiğinden kaynak yüklenemedi.

PList.info'nuzu kaynak kodu olarak açın ve yapıştırın:

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

13

Apple belgelerinden

Yeni bir uygulama geliştiriyorsanız, HTTPS'yi yalnızca kullanmalısınız. Mevcut bir uygulamanız varsa, şu anda olabildiğince HTTPS 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. Ayrıca, üst düzey API'ler aracılığıyla iletişiminizin, ileri gizlilikle TLS sürüm 1.2 kullanılarak şifrelenmesi gerekir. Bu gereksinime uymayan bir bağlantı kurmaya çalışırsanız bir hata atılır. Uygulamanızın güvenli olmayan bir alan adı için istekte bulunması gerekiyorsa, bu alan adını uygulamanızın Info.plist dosyasında belirtmeniz gerekir.

Uygulama Taşıma Güvenliğini Atlamak için:

<key>NSAppTransportSecurity</key>
<dict>
  <key>NSExceptionDomains</key>
  <dict>
    <key>yourserver.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>

Tüm güvenli olmayan alanlara izin vermek için

<key>NSAppTransportSecurity</key>
<dict>
  <!--Include to allow all connections (DANGER)-->
  <key>NSAllowsArbitraryLoads</key>
  <true/>
</dict>

Devamını Oku: iOS 9 ve OSX 10.11'de Uygulama Aktarımı Güvenlik İstisnalarını Yapılandırma



9

Xcode 7.1'den itibaren (hızlı 2.0)

resim açıklamasını buraya girin


9

Bu, Apple'ın API'larınızda daha sıkı güvenliği zorlamanın yoludur (http üzerinden https kullanmak zorunda). Bu güvenlik ayarının nasıl kaldırılacağını açıklayacağım.


Buradaki yanıtların çoğu bu anahtarı info.plist'inize eklediğine işaret ediyor. resim açıklamasını buraya girin

Bu tek başına benim için bu sorunu çözmedi. İçeriye aynı anahtarı eklemek zorunda kaldım

Project -> Targets -> Info -> Custom iOS Target Properties resim açıklamasını buraya girin


Ancak bu, herhangi birinden güvenli olmayan bağlantıların yapılmasına izin verecektir. Yalnızca belirli bir alan adının güvenli olmayan bağlantılar kullanmasına izin vermek istiyorsanız, info.plistinize aşağıdakileri ekleyebilirsiniz.

resim açıklamasını buraya girin


Teşekkürler, bu benim için çalıştı! Ben sadece önce işe yaramadı plist dosyasını düzenledi. Diğer insanların nasıl bu şekilde çalıştığını şaşırttı
Jones

8

URL'nizde HTTP değil HTTPS kullanmanız yeterlidir ve çalışır


3
Tabii ki HTTPS kullanamazsanız, çünkü Apple kendinden imzalı sertifikaları sevmez. Bu problemin yok mu?
Tony B

1
Benim durumumda, HTTPS olarak değiştirildiğimden beri mükemmel çalışıyor
pierre23

1
kendinden imzalı veya CA imzalı bir sertifika kullanıyor musunuz? Sadece merak. Tabii ki ayrı bir konu, ama sormak düşündüm.
Tony B

Sunucu tarafında çalışmadım, dürüst olmayı bilmiyorum :(
pierre23

Bazı sunucu ortamlarında (paylaşılan barındırma) HTTPS bağlantısı kurmak zor olabilir.
Raptor

7

XML'in büyük bir hayranı değilseniz, plist dosyanıza aşağıdaki etiketi ekleyin.

resim açıklamasını buraya girin


5

iOS 9 (geliştiriciler) geliştiricileri yalnızca App Transport Security uygulamasını kullanmaya zorlayabilir . Bunu rastgele bir yerde duydum, bu yüzden bunun doğru olup olmadığını bilmiyorum. Ama bundan şüpheleniyorum ve şu sonuca vardım:

İOS 9'da çalışan uygulama artık SSL olmadan bir Meteor sunucusuna bağlanmayacak (belki de).

Bu, meteor çalıştırma ios veya meteor çalıştırma ios-cihaz (muhtemelen?) Artık çalışmaz demektir.

Uygulamanın Info.plist içinde, NSAppTransportSecurity [Dictionary]anahtar olması gerekir NSAllowsArbitraryLoads [Boolean]için ayarlanacak YESveya Meteor kullanması gerekir httpsonun için localhost serveryakında.


5

Xcode 8.0 ila 8.3.3 kullanıyorsanız ve 2.2 ila 3.0'ı hızlıca kullanıyorsanız

URL değişikliği benim durumda muhtaç http: // için https: // (deneyin çalışmıyor ise)

Add an App Transport Security Setting: Dictionary.
Add a NSAppTransportSecurity: Dictionary.
Add a NSExceptionDomains: Dictionary.
Add a yourdomain.com: Dictionary.  (Ex: stackoverflow.com)

Add Subkey named " NSIncludesSubdomains" as Boolean: YES
Add Subkey named " NSExceptionAllowsInsecureHTTPLoads" as Boolean: YES

resim açıklamasını buraya girin


3

PList.info'nuzu Kaynak Kodu olarak açın ve </dict>aşağıdaki kodu eklemeden hemen önce ,

 <!--By Passing-->
    <key>NSAppTransportSecurity</key>
    <dict>
        <key>NSExceptionDomains</key>
        <dict>
            <key>your.domain.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>
    <!--End Passing-->

Ve son olarak your.domain.comtemel URL'nizle değiştirin . Teşekkürler.


3

Localhost üzerinde geliştirenler için şu adımları izleyin:

  1. Yanındaki "+" düğmesine hafifçe vurun ve bir Tür Information Property Listekleyin App Transport Security Settingsve atayınDictionary
  2. Yeni oluşturulan App Transport Security Settingsgirişin yanındaki "+" düğmesine dokunun ve NSExceptionAllowsInsecureHTTPLoadstür ekleyin Booleanve değerini olarak ayarlayın YES.
  3. NSExceptionAllowsInsecureHTTPLoadsGirişi sağ tıklayın ve yukarıdaki girişin alt öğesi yapmak için "Satırı Sağa Kaydır" seçeneğini tıklayın.
  4. NSExceptionAllowsInsecureHTTPLoadsGirişin ve Allow Arbitrary Loadstürün eklenmesinin yanındaki "+" düğmesine hafifçe vurun Booleanve değeriniYES

Not: Sonunda aşağıdaki resimde sunulan gibi görünmelidir.

resim açıklamasını buraya girin


2

Bunu, bahsedilen seçeneklerin birçoğu ile çözmeyi başardım. Bunu çalıştırmak için yapmam gereken tüm şeylerin bir kontrol listesini ekleyeceğim.

Kısacası:

  1. NSAllowsArbitraryLoadsSaat uzantım için true olarak ayarlayın (saat uygulamam için değil).
  2. Ben kullanıyordum olun httpsve http.

Adım bir:

Öncelikle ve en açık şekilde NSAppTransportSecurity, saat uzantımda bir boolean true olarak info.plistadlandırılan bir alt anahtarla bir anahtar eklemek zorunda kaldım NSAllowsArbitraryLoads. Bunu sadece saat uzantısında ayarlayın, saat uygulamasının plist'inde değil. Her ne kadar bunun tüm bağlantılara izin verdiğini ve güvensiz olabileceğini unutmayın.

resim açıklamasını buraya girin

veya

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

İkinci adım:

Sonra yüklemeye çalıştığım url'nin httpssadece olduğundan emin olmak zorunda kaldım http. Hala http olan herhangi bir url için kullandım:

Swift :

let newURLString = oldURLString.stringByReplacingOccurrencesOfString("http", withString: "https")

Obj-C:

NSString *newURLString = [oldURLString stringByReplacingOccurrencesOfString:@“http” withString:@“https”];


2

Doğru info.plist dosyasını değiştirdiğinizden emin olun .

Bu ikinci kez ben MyProjectNameUITests altında info.plist değiştiriyorum o haber vermedi, çünkü bu konuda ben atık süresi.


1

Firebase kullanırsanız NSAllowsArbitraryLoadsInWebContent = true, NSAppTransportSecuritybölüme eklenir ve NSAllowsArbitraryLoads = trueçalışmaz


Bu bilgi için teşekkürler. Bana saatlerce sorun giderme yaptın.
pAkY88

0

"NSAllowsArbitraryLoads" seçeneği yerine bir yıllık imzalı bir sertifika kullanarak kendi kendine barındırılan bir ayrıştırma sunucusu durumunda bu sorunu çözdüm

Sunucuyu herhangi bir node.js sunucusu olarak ayrıştırmanız , belirtmeniz gereken genel bir https URL'si sunar . Örneğin:

ayrıştırma sunucusu --appId --masterKey --publicServerURL https: //your.public.url/some_nodejs

Yapılandırma dosyalarıma bir göz atmaktan çekinmeyin

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.