菜鸟教程小白 发表于 2022-12-13 02:53:22

ios - NSURLConnection 仅在第二次尝试时进行身份验证


                                            <p><p>我正在尝试在 UIWebView 中加载安全网站,我的基本方法是创建一个 NSURL,然后创建一个 NSURLRequest,然后创建一个 NSURLConnection,然后在 UIWebView 中加载 NSURLRequest。当网站加载时,我会收到</p>

<pre><code>- (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge
</code></pre>

<p>我用</p>回复挑战发送者

<pre><code>- (void)useCredential:(NSURLCredential *)credential forAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge
</code></pre>

<p>但在那之后我什么也没有得到......它只是挂起。我设置了断点,所以我知道</p>

<pre><code>- (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge
</code></pre>

<p> 正在被调用。如果我等到我确定 NSURLConnection 不会完成,然后重新加载 View ,不会发送身份验证质询,但会加载 View 。我对服务器没有任何控制权。我愿意使用 AFNetworking,但仅限于必要时。</p>

<p>源代码的完整列表如下:</p>

<pre><code> - (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:

    (NSURLAuthenticationChallenge *)challenge
    {
      NSUserDefaults *userDefaults = ;
      if ( == 0)
{
    NSString *username = @&#34;username&#34;;
    NSString *password = @&#34;passsword&#34;;
    NSURLCredential * cred = [NSURLCredential credentialWithUser:username
                                                      password:password
                                                   persistence:NSURLCredentialPersistenceForSession];
    [ useCredential:cred forAuthenticationChallenge:challenge];
}
else
{

}
}

-(void)updateCard
{
NSURL * url = ;
NSURLRequest * request = [NSURLRequest requestWithURL:url
                                          cachePolicy:NSURLRequestUseProtocolCachePolicy
                                        timeoutInterval:50.0];
self.webView =[ initWithFrame:self.bounds];
self.webView.delegate = self;
;
self.connection = [[ NSURLConnection alloc]initWithRequest:request delegate:self];
;
}
</code></pre>

<p>我哪里做错了?</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>您需要先检索服务器请求的“身份验证方法”:</p>

<pre><code>[ authenticationMethod]
</code></pre>

<p>这些是上面的表达式返回的身份验证方法(它们是字符串常量):</p>

<pre><code>NSURLAuthenticationMethodDefault
NSURLAuthenticationMethodHTTPBasic
NSURLAuthenticationMethodHTTPDigest
NSURLAuthenticationMethodHTMLForm
NSURLAuthenticationMethodNegotiate
NSURLAuthenticationMethodNTLM
NSURLAuthenticationMethodClientCertificate
NSURLAuthenticationMethodServerTrust
</code></pre>

<p>然后,您有以下选择:</p>

<ol>
<li><p>如果要为给定的身份验证方法提供凭据,请调用
<code>useCredential:forAuthenticationChallenge:</code></p></li>
<li><p>如果您不想自己处理该身份验证方法并希望系统尝试
要进行身份验证,您可以调用 <code>performDefaultHandlingForAuthenticationChallenge:</code>
然后可能会失败,具体取决于系统是否能够处理该类型
身份验证以及它是否可以在众所周知的存储中找到凭据。</p></li>
<li><p>如果您无法处理该身份验证方法 - 说身份验证方法
   <code>NSURLAuthenticationMethodNTLM</code> 例如——你可以跳过这个保护
    空间并尝试另一个保护空间,如果另一个
    存在于此身份验证质询中。那么你可能会得到一个
    验证方法 <code>NSURLAuthenticationMethodHTTPBasic</code> 你
    有能力处理。
    为了拒绝当前保护空间你发送的方法
    <code>rejectProtectionSpaceAndContinueWithChallenge:</code> 到
    身份验证质询发送者。然后,<code>NSURLConnection</code> 将发送
    再次 <code>willSendRequestForAuthenticationChallenge:</code> 到您的
    如果还有其他保护空间,请委托(delegate)另一个保护空间。</p></li>
<li><p>您可以尝试在不提供凭据的情况下继续。
    很可能,身份验证将失败。你可以通过试试
    发送消息 <code>continueWithoutCredentialForAuthenticationChallenge:</code>
    到身份验证质询发送者。</p></li>
<li><p>最后,您可以通过取消
    身份验证质询:发送 <code>cancelAuthenticationChallenge:</code> 到
    身份验证质询发送者。</p></li>
</ol>

<p>注意:<code>NSURLAuthenticationMethodHTTPBasic</code> 和 <code>NSURLAuthenticationMethodHTTPDigest</code> 身份验证方法可以使用由 <code>+credentialWithUser:password:persistence 创建的相同 <code>NSURLCredential</code> 对象处理:</code></p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - NSURLConnection 仅在第二次尝试时进行身份验证,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/17120392/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/17120392/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - NSURLConnection 仅在第二次尝试时进行身份验证