Xcodeを7.0またはiOS 9.0にアップデートしたときに問題が発生します。どういうわけかそれは私にTitledエラーを与え始めました
「App Transport Securityポリシーで安全な接続を使用する必要があるため、リソースをロードできませんでした」
Webサービスメソッド:
-(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];
}
このサービスはXcode以前のバージョンとiOS以前のバージョンでは問題なく動作していますが、iOS 9.0上のXcode 7.0にアップデートすると、上記のWebサービスメソッドを呼び出すときに次のような問題が発生し始めました。私が得ているログエラーは次のとおりです。
接続に失敗しました:エラーDomain = NSURLErrorDomain Code = -1022 "App Transport Securityポリシーで安全な接続を使用する必要があるため、リソースを読み込めませんでした。" UserInfo = {NSUnderlyingError = 0x7fada0f31880 {エラードメイン= kCFErrorDomainCFNetwork Code = -1022 "(null)"}、NSErrorFailingURLStringKey = MyServiceURL、NSErrorFailingURLKey = MyServiceURLロードされたアプリケーションはNSLocalになっている可能性があります。セキュリティポリシーでは安全な接続を使用する必要があります。
以下の質問と回答を試してみましたが、そこで結果が得られませんでした。そのサービスコールエラーを取り除くにはどうすればよいですか。
Info.plistにキーを追加して解決しました。私が従った手順は次のとおりです。
プロジェクトターゲットのinfo.plist
ファイルを開きました
NSAppTransportSecurity
としてDictionary
というキーを追加しました。
NSAllowsArbitraryLoads
としてBoolean
というサブキーを追加し、その値をYES
に設定します。プロジェクトをきれいにして今、すべてが以前と同じように問題なく実行されています。
参考リンク: https://stackoverflow.com/a/32609970
編集: OR info.plist
ファイルのソースコードで、次のように追加できます。
<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>
プロジェクトのNSAllowsArbitraryLoads = true
でinfo.plist
を使用すると、すべてのサーバーへのすべての接続が安全でなくなる可能性があります。安全でない接続を介して 特定のドメイン にのみアクセスできるようにしたい場合は、次の手順を試してください。
または、ソースコードとして:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSExceptionDomains</key>
<dict>
<key>domain.com</key>
<dict>
<key>NSExceptionAllowsInsecureHTTPLoads</key>
<true/>
<key>NSIncludesSubdomains</key>
<true/>
</dict>
</dict>
</dict>
編集後にプロジェクトをクリーン&ビルドします。
トランスポートセキュリティ は、iOS 9.0以降、およびOS X v10.11以降で提供されています。
そのため、デフォルトでは https の呼び出しのみがアプリで許可されています。 App Transport Securityを無効にするには、 info.plist fileに次の行を追加します。
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
IOS 10.xおよびSwift 3.xの場合(以下のバージョンもサポートされています)、 'info.plist'に以下の行を追加するだけです。
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
App Transport SecurityポリシーではSwift 4.03で機能する安全な接続の使用が必要なため、リソースをロードできませんでした。
PList.infoをソースコードとして開き、貼り付けます。
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
アップルのドキュメントから
新しいアプリを開発している場合は、HTTPSを排他的に使用する必要があります。既存のアプリを使用している場合は、今すぐできる限りHTTPSを使用し、残りのアプリをすぐに移行する計画を立てる必要があります。さらに、上位レベルのAPIを介した通信は、TLSバージョン1.2を使用して転送秘密で暗号化する必要がありますこの要件に従わない接続を確立しようとすると、エラーがスローされます。安全でないドメインにリクエストを送信するには、アプリのInfo.plistファイルでこのドメインを指定する必要があります。
App Transportのセキュリティを回避するには
<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>
安全でないドメインをすべて許可する
<key>NSAppTransportSecurity</key>
<dict>
<!--Include to allow all connections (DANGER)-->
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
URLにHTTPではなくHTTPSを使用するだけで十分です。
iOS 9(開発者)は App Transport Security を排他的に使用することを開発者に強いる可能性があります。私はこれがどこかでランダムに聞こえたので、これが私自身であるかどうかはわかりません。しかし、私はそれを疑い、この結論に至りました:
iOS 9上で実行されているアプリは(おそらく)SSLなしでMeteorサーバーに接続しなくなります。
これは、流星を実行するiosまたは流星を実行するios - デバイスが(おそらく?)もはや動作しないことを意味します。
アプリのinfo.plistでは、NSAppTransportSecurity [Dictionary]
はキーNSAllowsArbitraryLoads [Boolean]
をYES
に設定する必要があります。またはMeteorはすぐにlocalhost server
にhttps
を使用する必要があります。
Xcode 8.0から8.3.3およびSwift 2.2から3.0を使用している場合
私の場合はURLを変更する必要があります http:// から https:// (動作していない場合は試してみてください)
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
pList.info as ソースコード を開き、</dict>
の直前に以下のコードを追加してください。
<!--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-->
そして最後にあなたのベースURLでyour.domain.com
を変更します。ありがとう。
私はこれまでに述べた選択肢の多くを組み合わせて解決しました。これを機能させるために私がしなければならなかったことすべてのチェックリストを含めます。
要するに:
NSAllowsArbitraryLoads
をtrueに設定します。https
ではなくhttp
を使用していることを確認してください。ステップ1:
まず第一に、そして明らかに私は、私のwatch拡張機能のinfo.plist
に辞書としてNSAppTransportSecurity
キーを追加しなければなりませんでした。そして、NSAllowsArbitraryLoads
というサブキーをtrueに設定します。 Onlyこれをwatchの拡張子で設定し、watchアプリのplistでは設定しないでください。これはすべての接続を許可し、安全でない可能性があることに注意してください。
または
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
ステップ2:
次に、ロードしようとしているURLがhttps
ではなくhttp
であることを確認する必要がありました。まだhttpであったURLについては、私が使用しました:
スイフト :
let newURLString = oldURLString.stringByReplacingOccurrencesOfString("http", withString: "https")
Obj-C:
NSString *newURLString = [oldURLString stringByReplacingOccurrencesOfString:@“http” withString:@“https”];
必ず正しいinfo.plistファイルを変更してください _。
これはsecond timeです。MyProjectNameUITestsの下のinfo.plistを変更していることに気付かなかったので、この問題には時間を無駄にしています。
「NSAllowsArbitraryLoads」オプションではなく、1年間の署名付き証明書を使用して自己ホスト型解析サーバーを使用する場合は、この問題を解決しました。
任意のnode.jsサーバーとしてサーバーを解析し、 public https url を指定します。例えば:
parse-server --appId --masterKey --publicServerURL https://your.public.url/some_nodejs