3

このコードの結果は、url が null であるということです

NSString* home = [NSHomeDirectory() stringByAppendingPathComponent:@"/Library/Application Support/"];
NSURL *url = [NSURL URLWithString:home];

これもそうです:

NSString* home = [NSHomeDirectory() stringByAppendingPathComponent:@"/Library/Application Support/"];
home = [home stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSURL *url = [NSURL URLWithString:home];
4

4 に答える 4

11

あなたの質問は、スペースを含む文字列から URL を作成することではなく、スペースを含むパス文字列からURL作成することに関するものです。

パスには、 を使用しないでくださいURLWithString。Mac OS X と iOS には、ファイル パスの NSURL を構築するための便利な関数が含まれており、これが自動的に処理されます。代わりにそれらのいずれかを使用してください。

Apple のドキュメントに[NSURL fileURLWithPath: path]は次のように書かれています。

このメソッドは、パスがスラッシュで終わる場合、パスがディレクトリであると想定します。パスがスラッシュで終わっていない場合、メソッドはファイル システムを調べて、パスがファイルかディレクトリかを判断します。pathがファイル システムに存在し、それがディレクトリである場合、メソッドは末尾にスラッシュを追加します。pathがファイル システムに存在しない場合、メソッドはそれがファイルを表していると想定し、末尾のスラッシュを追加しません。

別の方法として、 を使用することを検討してください。これにより、返されたオブジェクトがファイルまたはディレクトリを表すfileURLWithPath:isDirectory:かどうかを明示的に指定できます。NSURL

また、NSSearchPathForDirectoriesInDomainsApplication Support ディレクトリを見つけるために を使用する必要があります。

これをすべてまとめると、次のようになります。

NSArray *paths = NSSearchPathForDirectoriesInDomains(
                     NSApplicationSupportDirectory, NSUserDomainMask, YES);
NSString *applicationSupportDirectory = [paths objectAtIndex:0];
NSURL *url = [NSURL fileURLWithPath: applicationSupportDirectory isDirectory: YES];

ソース:

于 2012-07-18T19:52:29.807 に答える
4

スウィフト 2.0 バージョン:

let encodedPath = path?.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLQueryAllowedCharacterSet())!
于 2016-04-10T03:04:30.283 に答える
4

実際には、パーセントエスケープを削除するのではなく、追加する必要があります:

NSString* home = [NSHomeDirectory() stringByAppendingPathComponent:@"/Library/Application Support/"];
    NSURL *url = [NSURL URLWithString:[home stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
    NSLog(@"%@", url);

これは次を印刷します:

2012-07-18 13:44:54.738 Test[1456:907] /var/mobile/Applications/FF6E6881-1D1B-4B74-88DF-06A2B62CCFE6/Library/Application%20Support
于 2012-07-18T19:45:30.630 に答える
1

まず、実際にアプリケーションのアプリケーション サポート ディレクトリを取得しようとしている場合は、ジョブに適切なメソッド (この場合は on NSFileManager) を使用して、URL を直接処理します。

NSURL* appSupport = [[NSFileManager defaultManager] URLForDirectory: NSApplicationSupportDirectory inDomain:NSUserDomainMask appropriateForURL:nil create:YES error:NULL];

本当にパスを作成したい場合は、適切な初期化子を使用します。この場合、URL にファイル パス URL であることを伝えて、スペースを自然に処理し、おそらく URL パスを作成できるようにします (この例はもっと上記のコードのように):

NSString* home = [NSHomeDirectory() stringByAppendingPathComponent:@"/Library/Application Support/"];
// Here, use the appropriate initializer for NSURL
NSURL *url = [NSURL fileURLWithPath:home];

これで、URL は適切にパーセント エンコードされ、問題はなくなります (返されたときに nil にはなりません)。

于 2012-07-18T20:08:46.823 に答える