1
myscheme:?id=test

これを に渡して[NSURL URLWithString:]そのqueryプロパティを出力するとnil、 が得られますが、コロン (または 2 つまたは 3 つ) の直後にスラッシュを配置すると、正常に動作します。

これは実際には無効な URL ですか、それとも のバグNSURLですか?

一部の調査によると、有効な URL のようです。http://url.spec.whatwg.org/から:

絶対 URL はスキームである必要があり、その後に「:」が続き、その後にスキーム データが続き、オプションで「?」が続きます。とクエリ。

および (強調を追加)

スキーム データの構文はスキームに依存し、通常はスキームと一緒に定義されます。相対スキームの場合、スキーム データはスキーム相対 URL である必要があります。他のスキームの場合、仕様または標準では、0 個以上のURL 単位の制約内でスキーム データを定義する必要があります。

4

2 に答える 2

2

myscheme:?id=testは有効な URL であり、非fromNSURLを返すことによってそれを認識します。nil+URLWithString:

ただし、RFC 1808 では、文字をクエリ文字列を示すものとしてNSURL認識する方法に準拠していないため、 を返します。?-querynil

ここでの良いニュースは、例のクエリを示すものとして認識するパーサーNSURLComponentsわずかに異なることです。?

NSURLComponents *components = [NSURLComponents componentsWithString:@"myscheme:?id=test"];
return components.query; // returns @"id=test"

このコードで引き続き iOS 6 以前をターゲットにする必要がある場合は、KSURLComponents代わりに同じ解析アプローチを取る私のクラスを使用することをお勧めします。

于 2013-10-21T10:04:10.190 に答える
1

NSURL を考慮せずに、タイトルの部分 ( Is this a valid URL? ) に答えるだけです (これはわかりません。NSURL は有効な URL をまったく必要としない可能性があります)。

myscheme:?id=testは登録済みの URI スキームではないため、有効な URLではありません。myscheme有効な URI スキームはすべてhttp://www.iana.org/assignments/uri-schemes.htmlにあります。

各 URI スキームはそれ自体で有効なスキーム データを指定しますが、構文は絶対 URI の文法と一致する必要があります。

セクション 4.3で説明されているように、スキーム固有の構文に一致するすべての文字列が文法にも一致するように、URI スキームの仕様は独自の構文を定義する必要があります。

構文は次のように定義されます。

absolute-URI  = scheme ":" hier-part [ "?" query ]

しかしhier-part、空かもしれません(STD 66で何も見落としていなければ)。したがって、有効な URI スキームを使用している場合、その URI は有効であるように見えます (その URI スキームがスキーム データの特別なルールを定義していない限り、おそらく定義しているはずです)。

于 2013-10-16T10:16:52.150 に答える