2012-09-07 7 views
19

私は最近、2つのNSURLを比較して1つのNSURLとNSString(URLアドレス)を比較すると問題が発生しました。NSURLRequestがどこかで取得され、URLアドレスがわかるかどうかわかりません。2つのNSURLまたは1つのNSURLとNSStringを比較する信頼できる方法はありますか?

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

これはNOを返します:私はNSURLRequestのURLは私が持っていたURL文字列と同じでない場合は、今私がチェックする必要があり、URL NSStringのを持って、「http://m.google.com」と言いますは私に "http://m.google.com/"を与えていますが、NSURLRequestを作成しても最終的にスラッシュのない "http://m.google.com"という文字列が表示されます。

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

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

  1. チェック1の場合は、別のものを「含む」、これは「http://m.google.com/blabla」「http://m.google.com」が含まれて信頼性がありません。

  2. NSStringをNSURLに変換し、isEqualメソッドを使用して2つのNSURLを比較し、isEqualのNSURLの実装を把握できますか?

  3. ステップ2を基準にして、それぞれのNSURLをstandardizedURLを使用して標準URLに変換しますか?

ありがとうございます!

+0

第2のNSURLの末尾に「/」が付いていますか?それは 'isEqualToString'メソッドを捨てるのに十分でしょう。 – Robotnik

+0

はい、しかし、私が求めているのは、実際のURLが同じでないので、最後に '/'があることを確認する必要のない信頼できる方法ですあなたは持っているかどうか、最後には「/」がありません。 – hzxu

+0

いいえ、 'NSURL'の' isEqual: 'は"それを見つけません ":( – dasblinkenlight

答えて

28

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

しかし、私は、いくつかの標準に基づいた等価性を実装するNSURLのカテゴリメソッドの考え方を好んでいます(「等価」はおそらくこの場合は等価性よりも良い用語です)。

@RobNapierは、RFC2616を指す良い答えで関連する質問を参照しています。 URL構文の別の関連標準はRFC1808です。

タフな部分は、等価性が何を意味するかを決定しています。たとえば、異なるクエリやフラグメント(アンカーリンク)はどうでしょうか?以下のコード...これらの曖昧さのほとんどのための許容性の側にERRS

// 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; 
} 
+0

これはアプリケーション構造でどこに実装されるべきですか? – Ben

+1

@Ben、objective-cはクラスを拡張する(メソッドを追加する)方法があります(docのhttps://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/ProgrammingWithObjectiveC/CustomizingExistingClasses/CustomizingExistingClasses.htmlを参照)。ファイル命名規則は次のとおりです。 ExistingClass + DescriptionOfAddition.hと.m – danh

+2

これはメソッドを使用するのは本当に安全ではありません。 '' 'self.query == nil'''でもaURL.queryはメソッドではありませんreturn YES; – melbic

-8

簡単な方法は次のとおりです。

NSString*urlString=[NSString stringWithFormat:@"%@",request.URL]; 

ので、あなたがNSStringのメソッドのisEqualとの比較:

BOOL equalty=[urlString isEqual:anotherNSString]; 

XD

+6

これは悪いコードです。これは-description(NSURL)の実装に依存し、-isEqualToString:の代わりに-isEqual:を使用します。さらに、2つの「等しい」URLは異なる記述を生成することができるため、ソリューションは破損します。 「XD」する必要はありません。 –

+6

NSURL absoluteString'はこの実装より優れています。 – Jessedc

+2

私の考えは私のコメントを削除することを考えているが、Cristian KienleとKessedcが投稿したコメントを取り上げる。 – SyntheticMeshwork

2

私はこれが答えられていることを知っています。しかし、私は、その明確な、とは思わない。

以下をお勧めします。

if ([[url1 absoluteString] isEqualToString:[url2 absoluteString]]) 
{ 
    //Add your implementation here 
} 
関連する問題