Mam problem z aktualizacją Xcode do wersji 7.0 lub iOS 9.0. Jakoś to zaczęło dawać mi tytułowy błąd
„Nie można załadować zasobu, ponieważ zasada bezpieczeństwa aplikacji transportu wymaga użycia bezpiecznego połączenia”
Metoda usługi internetowej:
-(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];
}
Usługa działa poprawnie dla wcześniejszych wersji Xcode i wcześniejszych wersji iOS. Ale kiedy zaktualizowałem Xcode 7.0 do iOS 9.0, zaczęło mi pojawiać się problem, gdy wykonuję połączenie z powyższą metodą usługi internetowej. Błąd, który otrzymuję, to:
Połączenie nie powiodło się: Błąd Domena = NSURLErrorDomain Code = -1022 „Nie można załadować zasobu, ponieważ zasady zabezpieczeń transportu aplikacji wymagają bezpiecznego połączenia”. UserInfo = {NSUnderlyingError = 0x7fada0f31880 {Domena błędu = kCFErrorDomainCFNetwork Code = -1022 "(null)"}, NSErrorFailingURLStringKey = MyServiceURL , NSErrorFailingURLKey = MyServiceURL Zabezpieczenie nie wymaga zastosowania bezpieczeństwa, ponieważ nie można użyć tej metody bezpieczeństwa, ponieważ nie można użyć tej usługi. połączenie.}
Próbowałem następujących pytań i odpowiedzi, ale nie uzyskałem żadnego rezultatu, czy jest jakiś pomysł z wyprzedzeniem, jak mogę usunąć ten błąd wezwania serwisu?
źródło
Odpowiedzi:
Rozwiązałem to, dodając jakiś klucz do info.plist. Kroki, które wykonałem to:
Otworzyłem
info.plist
plik docelowy mojego projektuDodano klucz o nazwie
NSAppTransportSecurity
jakoDictionary
.NSAllowsArbitraryLoads
asBoolean
i ustaw jego wartość naYES
podobną do następującego obrazu.Wyczyść projekt i teraz wszystko działa poprawnie, jak wcześniej.
Link referencyjny: https://stackoverflow.com/a/32609970
EDYCJA: LUB W kodzie źródłowym
info.plist
pliku możemy dodać, że:źródło
NSExceptionDomains
. W przeciwnym razie będzie to wyjątekNSAllowArbitraryLoads
, aby to odwiedzić, musisz użyć httpsexception
App Transport Security Settings
iAllow Arbitrary Loads
odpowiednioNależy pamiętać, że użycie
NSAllowsArbitraryLoads = true
w projekcieinfo.plist
pozwala na niepewne połączenie z dowolnym serwerem. Jeśli chcesz się upewnić, że tylko określona domena jest dostępna przez niepewne połączenie, spróbuj tego:Lub jako kod źródłowy:
Wyczyść i zbuduj projekt po edycji.
źródło
Zabezpieczenia transportu są zapewnione w iOS 9.0 lub nowszym oraz w OS X 10.11 i nowszym.
Tak więc domyślnie dozwolone są tylko połączenia https w aplikacjach. Aby wyłączyć App Transport Security, dodaj następujące wiersze w pliku info.plist ...
Aby uzyskać więcej informacji:
https://developer.apple.com/library/content/documentation/General/Reference/InfoPlistKeyReference/Articles/CocoaKeys.html#//apple_ref/doc/uid/TP40009251-SW33
źródło
Na iOS 10.x i Swift 3.x [obsługiwane są również poniższe wersje] wystarczy dodać następujące wiersze w „info.plist”
źródło
W Swift 4 możesz używać
-> Przejdź do Info.plist
-> Kliknij plus listę właściwości informacji
-> Dodaj ustawienia zabezpieczeń transportu aplikacji jako słownik
-> Kliknij ikonę Plus Ustawienia zabezpieczeń transportu aplikacji
-> Dodaj Zezwalaj na obciążenia arbitralne ustaw TAK
Poniższy obraz wygląda
źródło
Rozwiązałem jako plik plist.
Dodaj NSAppTransportSecurity: Dictionary.
Dodaj podklucz o nazwie „NSAllowsArbitraryLoads” jako wartość logiczną: TAK
źródło
Nie można załadować zasobu, ponieważ zasada bezpieczeństwa aplikacji transportu wymaga użycia bezpiecznego połączenia działającego w Swift 4.03.
Otwórz pList.info jako kod źródłowy i wklej:
źródło
Z dokumentacji Apple
Jeśli opracowujesz nową aplikację, powinieneś używać wyłącznie HTTPS. Jeśli masz już istniejącą aplikację, powinieneś w tej chwili używać HTTPS i stworzyć plan jak najszybszej migracji reszty aplikacji. Ponadto komunikacja za pośrednictwem interfejsów API wyższego poziomu musi być szyfrowana przy użyciu TLS w wersji 1.2 z zachowaniem tajemnicy przekazywania. Jeśli spróbujesz nawiązać połączenie, które nie spełnia tego wymagania, generowany jest błąd. Jeśli aplikacja musi wysłać żądanie do niezabezpieczonej domeny, musisz określić tę domenę w pliku Info.plist aplikacji.
Aby ominąć zabezpieczenia transportu aplikacji:
Aby zezwolić na wszystkie niepewne domeny
Czytaj więcej: Konfigurowanie wyjątków bezpieczeństwa transportu aplikacji w iOS 9 i OSX 10.11
źródło
Jeśli używasz Xcode 8.0 i swift 3.0 lub 2.2
źródło
W Xcode 7.1 i nowszych (swift 2.0)
źródło
W ten sposób Apple wymusza ściślejsze zabezpieczenia api (zmuszony do korzystania z https przez http). Wyjaśnię, jak usunąć to ustawienie bezpieczeństwa.
Większość odpowiedzi tutaj wskazuje na dodanie tego klucza do swojej info.plist
Samo to nie rozwiązało dla mnie tego problemu. Musiałem dodać ten sam klucz do środka
Project -> Targets -> Info -> Custom iOS Target Properties
Pozwoli to jednak na nawiązanie niezabezpieczonych połączeń od kogokolwiek. Jeśli chcesz zezwolić tylko określonej domenie na używanie niezabezpieczonych połączeń, możesz dodać następujące informacje do swojej info.plist.
źródło
Wystarczy użyć HTTPS, a nie HTTP w adresie URL, a to zadziała
źródło
Jeśli nie jesteś wielkim fanem XML, po prostu dodaj poniższy znacznik w pliku plist.
źródło
iOS 9 (może) zmusza programistów do korzystania wyłącznie z aplikacji App Transport Security . Słyszałem to gdzieś losowo, więc sam nie wiem, czy to prawda. Ale podejrzewam to i doszedłem do tego wniosku:
Aplikacja działająca na iOS 9 (może) nie będzie już łączyć się z serwerem Meteor bez SSL.
Oznacza to, że uruchomione urządzenie meteor z systemem iOS lub urządzenie z systemem Meteor działa (prawdopodobnie?) Już nie będzie działać.
W info.plist aplikacji
NSAppTransportSecurity [Dictionary]
musiNSAllowsArbitraryLoads [Boolean]
być ustawiony klucz, w przeciwnym razieYES
Meteor będzie musiałhttps
golocalhost server
wkrótce użyć .źródło
Jeśli używasz Xcode 8.0 do 8.3.3 i szybkich 2.2 do 3.0
źródło
Otwórz pList.info jako kod źródłowy i na dole tuż przed
</dict>
dodaniem następującego kodu,I na koniec zmień
your.domain.com
swój podstawowy adres URL. Dzięki.źródło
Dla tych z was, którzy rozwijają się na localhost, wykonaj następujące kroki:
Information Property List
a następnie dodajApp Transport Security Settings
i przypisz muDictionary
TypApp Transport Security Settings
wpisu, dodajNSExceptionAllowsInsecureHTTPLoads
typBoolean
i ustaw jego wartość naYES
.NSExceptionAllowsInsecureHTTPLoads
wpis prawym przyciskiem myszy i kliknij opcję „Shift Row Right”, aby uczynić go dzieckiem powyższego wpisu.NSExceptionAllowsInsecureHTTPLoads
wpisu, dodajAllow Arbitrary Loads
typBoolean
i ustaw jego wartość naYES
Uwaga: powinno to ostatecznie wyglądać jak na poniższym obrazku
źródło
Udało mi się to rozwiązać za pomocą kombinacji wielu wymienionych opcji. Dołączę listę kontrolną wszystkich rzeczy, które musiałem zrobić, aby to zadziałało.
W skrócie:
NSAllowsArbitraryLoads
na true dla mojego rozszerzenia zegarka (nie dla mojej aplikacji zegarka).https
i niehttp
.Krok pierwszy:
Po pierwsze i oczywiście musiałem dodać
NSAppTransportSecurity
klucz jako słownik w moim rozszerzeniu zegarkainfo.plist
z podkluczem o nazwieNSAllowsArbitraryLoads
boolean ustawionym na true. Ustaw to tylko w rozszerzeniu zegarka, a nie na liście aplikacji zegarka. Pamiętaj jednak, że pozwala to na wszystkie połączenia i może być niepewne.lub
Krok drugi:
Potem musiałem się upewnić, że adres URL, który próbowałem załadować, był
https
nie tylkohttp
. W przypadku adresów URL, które nadal były http, użyłem:Szybki :
let newURLString = oldURLString.stringByReplacingOccurrencesOfString("http", withString: "https")
Obj-C:
NSString *newURLString = [oldURLString stringByReplacingOccurrencesOfString:@“http” withString:@“https”];
źródło
Upewnij się, że zmienisz właściwy plik info.plist .
Po raz drugi tracę czas na ten problem, ponieważ nie zauważyłem, że zmieniam info.plist w MyProjectNameUITests.
źródło
Jeśli użyjesz bazy ogniowej, zostanie dodana
NSAllowsArbitraryLoadsInWebContent = true
wNSAppTransportSecurity
sekcji iNSAllowsArbitraryLoads = true
nie będzie działaćźródło
Rozwiązałem ten problem w przypadku hostowanego parsowania serwera przy użyciu certyfikatu z rocznym podpisem, a nie opcji „NSAllowsArbitraryLoads”
Przetwarzaj serwer jako dowolny serwer node.js przedstawia publiczny adres URL https , który musisz określić. Na przykład:
parsuj serwer --appId --masterKey --publicServerURL https: //y.p.picic.url/some_nodejs
Zapraszam do przejrzenia moich plików konfiguracyjnych
źródło