web-dev-qa-db-ja.com

NSURLと文字列

NSURLに問題があります。 NSURLを文字列で作成しようとしています

コード

    NSString *prefix = (@"tel://1234567890 ext. 101");
    NSString *dialThis = [NSString stringWithFormat:@"%@", prefix];
    NSURL *url = [[NSURL alloc] initWithString:dialThis];
    NSLog(@"%@",url);

また試した

    NSURL *url = [NSURL URLWithString:dialThis];

しかし、それはnullを与えます。なにが問題ですか ?

ありがとう。

33
Maulik

問題は、URLのエスケープされていないスペースです。たとえば、これは機能します:

    NSURL *url = [NSURL URLWithString:@"tel://1234567890x101"];

編集:これと同じように..

    NSURL *url2 = [NSURL URLWithString:[@"tel://1234567890 ext. 101"
        stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
58
Jim Blackler

制御しないURLとして文字列を渡す前に、空白をエンコードする必要があります。

 NSString *dialThis = [prefix stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
 // tel://1234567890%20ext.%20101

サイドノートとして、iOSは内線番号をダイヤルしません。ユーザーはそれを手動で行う必要があります。

From Apple URLスキームリファレンス:電話リンク

ユーザーが電話を悪意を持ってリダイレクトしたり、電話やアカウントの動作を変更したりするのを防ぐために、電話アプリケーションはtelスキームのすべてではないがほとんどの特殊文字をサポートしています。具体的には、URLに*または#文字が含まれている場合、電話アプリケーションは対応する電話番号のダイヤルを試行しません。

3
Black Frog

IOS 9.0と同様に、

stringByAddingPercentEscapesUsingEncoding:

廃止されました。

String[〜#〜] nsurl [〜#〜]に変換するには、次のメソッドを使用します。

let URL = "URL GOES HERE"
let urlString = URL.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLFragmentAllowedCharacterSet())
1
Rajan Balana

何かを持っている場合thinkはURL文字列であるべきだが、URL文字列がどのように構築されるかについて何も知らない場合、NSURLのURLWithDataRepresentation:relativeToURL: 方法。 URL文字列(NSDataのバイトとして)を解析し、必要に応じて文字をパーセントエンコードします。使用 NSUTF8StringEncoding NSStringをNSDataに変換するときに最良の結果を得るには。

NSURL *url = [NSURL URLWithDataRepresentation:[@"tel:1234567890 ext. 101" dataUsingEncoding:NSUTF8StringEncoding] relativeToURL:nil];
NSLog(@"%@",url);

文字列tel:1234567890%20ext。%20101でURLを作成します

正しいことをする試み。ただし、最良の結果を得るには、使用しているURLスキームの仕様を見つけ、その構文に従ってURL文字列を作成する必要があります。 telスキームの場合、それは https://tools.ietf.org/html/rfc3966 です。

追伸「tel:」の代わりに「tel://」がありましたが、これはtel URLでは正しくありません。

1
Jim Luther

「ext」がわからない電話番号はどのような値で置き換えることができますか?しかし、あなたはこのように試すことができます、

NSString *prefix = [NSString stringWithString: @"tel://1234567890 ext. 101"];

    NSString *dialThis = [NSString stringWithFormat:@"%@", prefix];

    NSURL *url = [NSURL URLWithString:[dialThis stringByReplacingOccurrencesOfString:@" ext. " withString:@"#"]];
// it might also represent by the pause symbol ','.

あなたは内線を見つけるために行くことができます。電話機のどの記号に相当するか、それを置き換えます。

しかし、それは実際の状況で動作するかどうかわからない....

1
Sola

これを試してください、それは私のために働きます....

NSString *prefix = (@"tel://1234567890 ext. 101");
NSString *dialThis = [NSString stringWithFormat:@"%@", prefix];
NSURL *url = [NSURL URLWithString:[queryString stringByReplacingOccurrencesOfString:@" " withString:@"%20"]];
NSLog(@"%@",url);
0

プロジェクトの任意の部分で使用する拡張機能も作成します。

extension String {
    var asNSURL: NSURL! {
        return NSURL(string: self)
    }
}

今から使用できます

let myString = "http://www.example.com".asNSURL

または

myString.asNSURL
0
destino