web-dev-qa-db-fra.com

NSURL avec chaîne

J'ai un problème avec NSURL. J'essaie de créer NSURL avec une chaîne

code

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

a également essayé

    NSURL *url = [NSURL URLWithString:dialThis];

mais cela donne null. Qu'est-ce qui ne va pas ?

Merci..

33
Maulik

Votre problème est les espaces non échappés dans l'URL. Cela, par exemple, fonctionne:

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

Edit: Comme cela ..

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

Avant de passer une chaîne comme URL que vous ne contrôlez pas, vous devez encoder l'espace blanc:

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

En remarque, iOS ne composera aucune extension. L'utilisateur devra le faire manuellement.

De Référence du schéma d'URL Apple: Liens téléphoniques :

Pour empêcher les utilisateurs de rediriger par malveillance les appels téléphoniques ou de modifier le comportement d'un téléphone ou d'un compte, l'application Téléphone prend en charge la plupart des caractères spéciaux du schéma tel, mais pas tous. Plus précisément, si une URL contient les caractères * ou #, l'application Téléphone n'essaie pas de composer le numéro de téléphone correspondant.

3
Black Frog

Comme avec iOS 9.0,

stringByAddingPercentEscapesUsingEncoding:

est obsolète.

Utilisez la méthode suivante pour convertir String en NSURL .

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

Si vous avez quelque chose que vous pensez devrait être une chaîne URL mais que vous ne savez rien sur la façon dont les chaînes URL sont censées être construites, vous pouvez utiliser la méthode URLWithDataRepresentation:relativeToURL: De NSURL. Il analyse la chaîne URL (en octets dans un NSData) et code les caractères en pourcentage selon les besoins. Utilisez le NSUTF8StringEncoding Pour de meilleurs résultats lors de la conversion de votre NSString en NSData.

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

crée une URL avec la chaîne tel: 1234567890% 20ext.% 20101

Il tente de faire la bonne chose. Cependant, pour de meilleurs résultats, vous devez trouver la spécification du schéma d'URL que vous utilisez et suivre sa syntaxe pour créer votre chaîne d'URL. Pour le schéma tel, c'est https://tools.ietf.org/html/rfc3966 .

P.S. Vous aviez "tel: //" au lieu de "tel:" qui est incorrect pour une URL tel.

1
Jim Luther

Je ne suis pas sûr que le "ext." dans le numéro de téléphone peut être répondu par quelle valeur? mais vous pouvez essayer comme ça,

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 ','.

vous pouvez aller chercher l'ext. est équivalent à quel symbole dans le téléphone, puis remplacez-le.

mais il peut ne pas fonctionner en situation réelle ou non ....

1
Sola

Essayez celui-ci, cela fonctionne pour moi ....

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

Faites également une extension pour l'utiliser dans n'importe quelle partie du projet:

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

A partir de maintenant, vous pouvez utiliser

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

ou

myString.asNSURL
0
destino