web-dev-qa-db-ja.com

2つのNSURLまたは1つのNSURLとNSStringを比較する信頼できる方法は?

最近、2つのNSURLを比較し、1つのNSURLをNSString(URLアドレス)と比較するときに問題が発生しました。状況は、どこかからNSURLRequestを取得し、それが指すURLアドレスを知っている場合と知らない場合があります。 URL NSString、たとえば「http://m.google.com」の場合、そのNSURLRequestのURLが私が持っていたURL文字列と同じであるかどうかを確認する必要があります。

[[request.URL.absoluteString lowercaseString] isEqualToString: [self.myAddress lowercaseString]];

absoluteStringが「http://m.google.com/」を返すので、これはNOを返しますが、私の文字列は「http://m.google.com」であり、最後にスラッシュはありません。を使用してNSURLRequestを作成します

[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://m.google.com"]]

それでもabsoluteStringの「http://m.google.com/」が表示されますが、NSURLまたは1つのNSURLと1つのNSStringを比較する信頼できる方法はありますか?

  1. 'http://m.google.com/blabla'に 'http://m.google.com'が含まれているため、ある 'に'別の 'が含まれているかどうかを確認してください。

  2. nSStringをNSURLに変換し、isEqualメソッドを使用して2つのNSURLを比較し、NSURLのisEqualの実装でそれを理解できるといいのですが?

  3. 手順2に基づいていますが、standardizedURLを使用して各NSURLを標準URLに変換しますか?

どうもありがとう!

19
hzxu

末尾のスラッシュのあいまいさだけを気にする場合は、NSURLパスが末尾のスラッシュをトリミングすることを知っていると、この質問をすばやく省くことができます。

しかし、私は、いくつかの標準ベースの同等性を実装するNSURLのカテゴリメソッドのアイデアが好きです(この場合、「同等性」はおそらく同等性よりも優れた用語です)。

@RobNapierは、 RFC2616 を指す良い答えを持つ関連する質問を参照します。 URL構文に関連するもう1つの標準は、 RFC1808 です。

難しいのは、同等性とはどういう意味かを判断することです。たとえば、異なるクエリやフラグメント(アンカーリンク)についてはどうでしょうか。以下のコードは、これらのあいまいさのほとんどの許容性の側面で誤りを犯しています...

// in NSURL+uriEquivalence.m

- (BOOL)isEquivalent:(NSURL *)aURL {

    if ([self isEqual:aURL]) return YES;
    if ([[self scheme] caseInsensitiveCompare:[aURL scheme]] != NSOrderedSame) return NO;
    if ([[self Host] caseInsensitiveCompare:[aURL Host]] != NSOrderedSame) return NO;

    // NSURL path is smart about trimming trailing slashes
    // note case-sensitivty here
    if ([[self path] compare:[aURL path]] != NSOrderedSame) return NO;

    // at this point, we've established that the urls are equivalent according to the rfc
    // insofar as scheme, Host, and paths match

    // according to rfc2616, port's can weakly match if one is missing and the
    // other is default for the scheme, but for now, let's insist on an explicit match
    if ([self port] || [aURL port]) {
        if (![[self port] isEqual:[aURL port]]) return NO;
        if (![[self query] isEqual:[aURL query]]) return NO;
    }

    // for things like user/pw, fragment, etc., seems sensible to be
    // permissive about these.
    return YES;
}
28
danh

私はこれが答えられることを知っています。しかし、私はそうは思いません、それは明らかです。

以下をお勧めします。

if ([[url1 absoluteString] isEqualToString:[url2 absoluteString]]) 
{
   //Add your implementation here
}
3
arango_86

最近、[NSURL isEqual]https://www.google.com/のような2つのURLを比較すると、https://www.google.comメソッドがfalseを返す状況に遭遇しました。私は、URLByAppendingPathComponentを空の文字列として適用することを発見しました。両方のURLのパラメータは、正しい結果を返します。

だから次のようなもの:

[[urlOne URLByAppendingPathComponent:@""] isEqual:[urlTwo URLByAppendingPathComponent:@""]]

欠落している場合は末尾のスラッシュを追加し、すでに含まれている場合はそのままにして、比較が期待どおりに機能するようにします。

ある奇妙な行動に頼って別の奇妙な行動を回避しているように思えますが、他の方法で確信できない限り、これが私が行っていることです;-)。

1