Analysieren Sie die NSURL-Abfrageeigenschaft

82

Ich habe eine URL wie myApp://action/1?parameter=2&secondparameter=3

Mit der Eigenschaftsabfrage erhalte ich folgenden Teil meiner URL

parameter=2&secondparameter=3

Gibt es eine Möglichkeit, dies einfach in ein NSDictionaryoder ein zu setzen Array?

Vielen Dank

gabac
quelle

Antworten:

54

Sowas in der Art:

NSMutableDictionary *params = [[NSMutableDictionary alloc] init];
for (NSString *param in [url componentsSeparatedByString:@"&"]) {
  NSArray *elts = [param componentsSeparatedByString:@"="];
  if([elts count] < 2) continue;
  [params setObject:[elts lastObject] forKey:[elts firstObject]];
}

Hinweis : Dies ist ein Beispielcode. Alle Fehlerfälle werden nicht verwaltet.

Benoît
quelle
2
Dieser Code stürzt bei einer fehlerhaften Abfrage ab. Siehe sichere Lösung unten.
BadPirate
2
Ok, Sie fügen nur eine Überprüfung der Arraygröße hinzu! Dieser Code war nur ein Anfang (wie immer auf SO). Wenn Sie mit allen URLs kompatibel sein möchten, haben Sie mehr Arbeiten, um Escape-Strings, Fragmente (# Teil am Ende), ...
Benoît
Fügen Sie eine Bearbeitung für Sie ein. Nur nach unten gestimmt, um Ihre Aufmerksamkeit auf das Problem mit der Antwort zu lenken. Sobald die Bearbeitung abgeschlossen ist, kann ich sie wieder aufrufen.
BadPirate
1
Dieser Code ist bis auf die einfachsten Fallwerte ohne Sonderzeichen nicht annähernd korrekt.
Nick Snyder
Sie sollten stattdessen das letzte und erste Objekt verwenden: [params setObject:[elts lastObject] forKey:[elts firstObject]];es ist sicherer
Laszlo
147

Sie können queryItemsin verwenden URLComponents.

Wenn Sie den Wert dieser Eigenschaft erhalten, analysiert die NSURLComponents-Klasse die Abfragezeichenfolge und gibt ein Array von NSURLQueryItem-Objekten zurück, von denen jedes ein einzelnes Schlüssel-Wert-Paar in der Reihenfolge darstellt, in der sie in der ursprünglichen Abfragezeichenfolge angezeigt werden.

Schnell

let url = "http://example.com?param1=value1&param2=param2"
let queryItems = URLComponents(string: url)?.queryItems
let param1 = queryItems?.filter({$0.name == "param1"}).first
print(param1?.value)

Alternativ können Sie der URL eine Erweiterung hinzufügen, um die Arbeit zu vereinfachen.

extension URL {
    var queryParameters: QueryParameters { return QueryParameters(url: self) }
}

class QueryParameters {
    let queryItems: [URLQueryItem]
    init(url: URL?) {
        queryItems = URLComponents(string: url?.absoluteString ?? "")?.queryItems ?? []
        print(queryItems)
    }
    subscript(name: String) -> String? {
        return queryItems.first(where: { $0.name == name })?.value
    }
}

Sie können dann über den Namen auf den Parameter zugreifen.

let url = "http://example.com?param1=value1&param2=param2"
print(url.queryParameters["param1"])
Onato
quelle
11
Abfrage seit iOS7. queryItems seit iOS8.
Onato
Danke für diese Antwort. Darüber hinaus fand ich den folgenden Artikel sehr hilfreich, um mehr über NSURLComponents zu erfahren: nshipster.com/nsurl
xaphod
Gute Antwort. Vielen Dank!
Dpigera
Seltsamerweise funktioniert NSURLComponents nicht, wenn die URL ein # -Zeichen enthält. Wie http://example.com/abc#abc?param1=value1&param2=param2 queryItems wird null sein
Pedro
Das liegt daran, dass das Fragment (#abc) am Ende gehört.
Onato
55

Ich hatte Grund, einige Erweiterungen für dieses Verhalten zu schreiben, die sich als nützlich erweisen könnten. Zuerst der Header:

#import <Foundation/Foundation.h>

@interface NSString (XQueryComponents)
- (NSString *)stringByDecodingURLFormat;
- (NSString *)stringByEncodingURLFormat;
- (NSMutableDictionary *)dictionaryFromQueryComponents;
@end

@interface NSURL (XQueryComponents)
- (NSMutableDictionary *)queryComponents;
@end

@interface NSDictionary (XQueryComponents)
- (NSString *)stringFromQueryComponents;
@end

Diese Methoden erweitern NSString, NSURL und NSDictionary, damit Sie Zeichenfolgen und Wörterbuchobjekte, die die Ergebnisse enthalten, in und aus Abfragekomponenten konvertieren können.

Nun der zugehörige .m-Code:

#import "XQueryComponents.h"

@implementation NSString (XQueryComponents)
- (NSString *)stringByDecodingURLFormat
{
    NSString *result = [self stringByReplacingOccurrencesOfString:@"+" withString:@" "];
    result = [result stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
    return result;
}

- (NSString *)stringByEncodingURLFormat
{
    NSString *result = [self stringByReplacingOccurrencesOfString:@" " withString:@"+"];
    result = [result stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
    return result;
}

- (NSMutableDictionary *)dictionaryFromQueryComponents
{
    NSMutableDictionary *queryComponents = [NSMutableDictionary dictionary];
    for(NSString *keyValuePairString in [self componentsSeparatedByString:@"&"])
    {
        NSArray *keyValuePairArray = [keyValuePairString componentsSeparatedByString:@"="];
        if ([keyValuePairArray count] < 2) continue; // Verify that there is at least one key, and at least one value.  Ignore extra = signs
        NSString *key = [[keyValuePairArray objectAtIndex:0] stringByDecodingURLFormat];
        NSString *value = [[keyValuePairArray objectAtIndex:1] stringByDecodingURLFormat];
        NSMutableArray *results = [queryComponents objectForKey:key]; // URL spec says that multiple values are allowed per key
        if(!results) // First object
        {
            results = [NSMutableArray arrayWithCapacity:1];
            [queryComponents setObject:results forKey:key];
        }
        [results addObject:value];
    }
    return queryComponents;
}
@end

@implementation NSURL (XQueryComponents)
- (NSMutableDictionary *)queryComponents
{
    return [[self query] dictionaryFromQueryComponents];
}
@end

@implementation NSDictionary (XQueryComponents)
- (NSString *)stringFromQueryComponents
{
    NSString *result = nil;
    for(__strong NSString *key in [self allKeys])
    {
        key = [key stringByEncodingURLFormat];
        NSArray *allValues = [self objectForKey:key];
        if([allValues isKindOfClass:[NSArray class]])
            for(__strong NSString *value in allValues)
            {
                value = [[value description] stringByEncodingURLFormat];
                if(!result)
                    result = [NSString stringWithFormat:@"%@=%@",key,value];
                else 
                    result = [result stringByAppendingFormat:@"&%@=%@",key,value];
            }
        else {
            NSString *value = [[allValues description] stringByEncodingURLFormat];
            if(!result)
                result = [NSString stringWithFormat:@"%@=%@",key,value];
            else 
                result = [result stringByAppendingFormat:@"&%@=%@",key,value];
        }
    }
    return result;
}
@end
BadPirate
quelle
Zwei Probleme: 1) Sie müssen sowohl den Schlüssel als auch den Wert per URL dekodieren, bevor Sie sie im Wörterbuch speichern. 2) Nach den Regeln der URLs dürfen Sie denselben Schlüssel mehrmals angeben. IOW, es sollte ein Schlüssel sein, der einem Array von Werten zugeordnet ist, nicht einem einzelnen Wert.
Dave DeLong
Ok, Sie fügen nur eine Überprüfung der Arraygröße hinzu (erfordert dies eine Abwertung meiner Antwort?)! Dieser Code war nur ein Anfang (wie immer auf SO). Wenn Sie mit allen URLs kompatibel sein möchten, haben Sie mehr Arbeiten, um Escape-Strings, Fragmente (# Teil am Ende), ...
Benoît
Dave - Gute Punkte. War für meine Bedürfnisse nicht erforderlich, aber da ich versuche, eine Antwort zu finden, die für alle Besucher dieses allgemeinen Problems funktioniert, habe ich die erwähnte Funktionalität hinzugefügt ... Benoit - Machen Sie Ihre Antwort mit Ihrer Antwort nur auf das Problem aufmerksam. Ich habe eine Bearbeitung eingereicht. Wahrscheinlich nicht die beste Form, um auf kleinere Probleme in ansonsten guten Antworten aufmerksam zu machen. Ich werde dies in Zukunft unterlassen. Die
Abwärtsabstimmung
In stringByDecodingURLFormat sollte der Typ für 'result' NSString * sein.
ThomasW
Ich habe gerade ein anderes Problem bemerkt. Der Schlüssel und der Wert werden verwechselt, der Schlüssel sollte der objectAtIndex: 0 und der Wert der objectAtIndex: 1 sein.
ThomasW
13

Versuche dies ;)!

NSString *query = @"parameter=2&secondparameter=3"; // replace this with [url query];
NSArray *components = [query componentsSeparatedByString:@"&"];
NSMutableDictionary *parameters = [[NSMutableDictionary alloc] init];
for (NSString *component in components) {
    NSArray *subcomponents = [component componentsSeparatedByString:@"="];
    [parameters setObject:[[subcomponents objectAtIndex:1] stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]
                   forKey:[[subcomponents objectAtIndex:0] stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
}
elslooo
quelle
1
Beachten Sie außerdem - über das von BadPirate festgestellte Absturzproblem hinaus - (1), dass die Wörterbuchschlüssel / -werte umgekehrt sind; (2) die Schlüssel / Werte sind immer noch codiert, so dass Sie stringByDecodingURLFormat
dpjanes
Wirklich schöne Art, es zu tun
Burf2000
9

Alle vorherigen Beiträge führen die URL-Codierung nicht ordnungsgemäß durch. Ich würde folgende Methoden vorschlagen:

+(NSString*)concatenateQuery:(NSDictionary*)parameters {
    if([parameters count]==0) return nil;
    NSMutableString* query = [NSMutableString string];
    for(NSString* parameter in [parameters allKeys])
        [query appendFormat:@"&%@=%@",[parameter stringByAddingPercentEncodingWithAllowedCharacters:NSCharacterSet.URLQueryAllowedCharacterSet],[[parameters objectForKey:parameter] stringByAddingPercentEncodingWithAllowedCharacters:NSCharacterSet.URLQueryAllowedCharacterSet]];
    return [[query substringFromIndex:1] copy];
}
+(NSDictionary*)splitQuery:(NSString*)query {
    if([query length]==0) return nil;
    NSMutableDictionary* parameters = [NSMutableDictionary dictionary];
    for(NSString* parameter in [query componentsSeparatedByString:@"&"]) {
        NSRange range = [parameter rangeOfString:@"="];
        if(range.location!=NSNotFound)
            [parameters setObject:[[parameter substringFromIndex:range.location+range.length] stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding] forKey:[[parameter substringToIndex:range.location] stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
        else [parameters setObject:[[NSString alloc] init] forKey:[parameter stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
    }
    return [parameters copy];
}
Kristian Kraljic
quelle
if(!query||[query length] == 0)ist redundant. Sie können sicher überprüfen, ob if([query length] == 0)für den Fall, dass der query == nilWert zurückgegeben wird, 0wenn Sie versuchen, die Länge darauf aufzurufen.
JRG-Entwickler
Sollte dies nicht objectForKey und nicht valueforkey sein?
SLF
Schöner Code. Ich schlage vor, NSUTF8StringEncodingin splitQueryzu verwenden, um alle Zeichensätze zu unterstützen :) Auch [string stringByAddingPercentEncodingWithAllowedCharacters:NSCharacterSet.URLQueryAllowedCharacterSet]ist eine neuere Art der Codierung für concatenateQuery.
William Denniss
Ich denke, es ist eine gute Praxis, eine unveränderliche Instanz zurückzugeben. Vielleicht sollten Sie die letzte Zeile ändern, um [parameter copy] zurückzugeben.
Glenn Howes
Vielen Dank. Ich habe den Code gemäß Ihren Kommentaren angepasst!
Kristian Kraljic
7

Hier ist die Erweiterung in Kürze:

extension NSURL{
        func queryParams() -> [String:AnyObject] {
            var info : [String:AnyObject] = [String:AnyObject]()
            if let queryString = self.query{
                for parameter in queryString.componentsSeparatedByString("&"){
                    let parts = parameter.componentsSeparatedByString("=")
                    if parts.count > 1{
                        let key = (parts[0] as String).stringByReplacingPercentEscapesUsingEncoding(NSUTF8StringEncoding)
                        let value = (parts[1] as String).stringByReplacingPercentEscapesUsingEncoding(NSUTF8StringEncoding)
                        if key != nil && value != nil{
                            info[key!] = value
                        }
                    }
                }
            }
            return info
        }
    }
Mukaissi
quelle
7

Nach der schon sehr sauberen Antwort von Onato ich in Swift eine Erweiterung für NSURL geschrieben, in der Sie einen Abfrageparameter wie diesen erhalten können:

Beispiel: Die URL enthält das Paar param = some_value

let queryItem = url.queryItemForKey("param")
let value = queryItem.value // would get String "someValue"

Die Erweiterung sieht aus wie:

extension NSURL {

  var allQueryItems: [NSURLQueryItem] {
      get {
          let components = NSURLComponents(URL: self, resolvingAgainstBaseURL: false)!
          let allQueryItems = components.queryItems!
          return allQueryItems as [NSURLQueryItem]
      }
  }

  func queryItemForKey(key: String) -> NSURLQueryItem? {

      let predicate = NSPredicate(format: "name=%@", key)!
      return (allQueryItems as NSArray).filteredArrayUsingPredicate(predicate).first as? NSURLQueryItem

  }
}
Hendrik
quelle
Das ist die beste Antwort! Warum haben sie die API-Dokumente nicht überprüft?
Jamin Zhang
5

Für diejenigen, die Bolts Framework verwenden , können Sie Folgendes verwenden:

NSDictionary *parameters = [BFURL URLWithURL:yourURL].inputQueryParameters;

Denken Sie daran zu importieren:

#import <Bolts/BFURL.h>

Wenn Sie zufällig ein Facebook SDK in Ihrem Projekt haben, haben Sie auch Bolts . Facebook nutzt dieses Framework als Abhängigkeit.

RaffAl
quelle
In Swift with Bolts:BFURL(url: url)?.inputQueryParameters?["myKey"] as? String
JAL
4

Der bevorzugte Weg, mit URLs umzugehen, ist jetzt NSURLComponents. Insbesondere die queryItemsEigenschaft, die einen NSArrayvon params zurückgibt.

Wenn Sie die Parameter in a NSDictionaryhaben möchten , finden Sie hier eine Methode:

+(NSDictionary<NSString *, NSString *>*)queryParamsFromURL:(NSURL*)url
{
    NSURLComponents* urlComponents = [NSURLComponents componentsWithURL:url resolvingAgainstBaseURL:NO];

    NSMutableDictionary<NSString *, NSString *>* queryParams = [NSMutableDictionary<NSString *, NSString *> new];
    for (NSURLQueryItem* queryItem in [urlComponents queryItems])
    {
        if (queryItem.value == nil)
        {
            continue;
        }
        [queryParams setObject:queryItem.value forKey:queryItem.name];
    }
    return queryParams;
}

Vorsichtsmaßnahme: URLs können wiederholte Parameter haben, aber das Wörterbuch enthält nur den letzten Wert eines duplizierten Parameters. Wenn dies unerwünscht ist, verwenden Sie das queryItemsArray direkt.

William Denniss
quelle
3

Swift 2.1

Einzeiler:

"p1=v1&p2=v2".componentsSeparatedByString("&").map {
    $0.componentsSeparatedByString("=") 
}.reduce([:]) {
    (var dict: [String:String], p) in
    dict[p[0]] = p[1]
    return dict
}

// ["p1": "v1", "p2": "v2"]

Wird als Erweiterung für NSURL verwendet:

extension NSURL {

    /**
     * URL query string as dictionary. Empty dictionary if query string is nil.
     */
    public var queryValues : [String:String] {
        get {
            if let q = self.query {
                return q.componentsSeparatedByString("&").map {
                    $0.componentsSeparatedByString("=") 
                }.reduce([:]) {
                    (var dict: [String:String], p) in
                    dict[p[0]] = p[1]
                    return dict
                }
            } else {
                return [:]
            }
        }
    }

}

Beispiel:

let url = NSURL(string: "http://example.com?p1=v1&p2=v2")!
let queryDict = url.queryValues

// ["p1": "v1", "p2": "v2"]

Bitte beachten Sie, dass es bei Verwendung von OS X 10.10 oder iOS 8 (oder höher) wahrscheinlich besser ist, NSURLComponentsdie queryItemsEigenschaft zu verwenden und das Wörterbuch NSURLQueryItemsdirekt aus dem zu erstellen .

Hier ist eine NSURLComponentsbasierte NSURLErweiterungslösung:

extension NSURL {

    /// URL query string as a dictionary. Empty dictionary if query string is nil.
    public var queryValues : [String:String] {
        get {
            guard let components = NSURLComponents(URL: self, resolvingAgainstBaseURL: false) else {
                return [:]
            }

            guard let queryItems = components.queryItems else {
                return [:]
            }

            var result:[String:String] = [:]
            for q in queryItems {
                result[q.name] = q.value
            }
            return result
        }
    }

}

Eine Fußnote zur NSURL-Erweiterung ist, dass es in Swift tatsächlich möglich ist, der Eigenschaft denselben Namen wie der vorhandenen Zeichenfolgeneigenschaft zu geben query. Ich wusste es nicht, bis ich es ausprobiert habe, aber der Polymorphismus in Swift lässt Sie nur beim Rückgabetyp unterscheiden. Wenn also die erweiterte NSURL-Eigenschaft vorhanden ist public var query: [String:String], funktioniert sie. Ich habe dies im Beispiel nicht verwendet, da ich es ein bisschen verrückt finde, aber es funktioniert ...

Erik Tjernlund
quelle
2

Ich habe eine einfache Klasse veröffentlicht, die den Job unter MIT erledigt:

https://github.com/anegmawad/URLQueryToCocoa

Damit können Sie Arrays und Objekte in der Abfrage haben, die gesammelt und zusammengeklebt werden

Beispielsweise

users[0][firstName]=Amin&users[0][lastName]=Negm&name=Devs&users[1][lastName]=Kienle&users[1][firstName]=Christian

wird werden:

@{
   name : @"Devs",
   users :
   @[
      @{
         firstName = @"Amin",
         lastName = @"Negm"
      },
      @{
         firstName = @"Christian",
         lastName = @"Kienle"
      }
   ]
 }

Sie können sich das als Gegenstück zu einer URL-Abfrage vorstellen NSJSONSerializer.

Amin Negm-Awad
quelle
ausgezeichnete Arbeit. Dies scheint die einzig richtige Antwort zu sein (die, die Array- und Diktierwerte berücksichtigt).
Anton Tropashko
2

Es sieht so aus, als würden Sie damit eingehende Daten von einer anderen iOS-Anwendung verarbeiten. Wenn ja, ist dies das, was ich für den gleichen Zweck benutze.

Erstanruf (zB in externer Anwendung):

UIApplication *application = [UIApplication sharedApplication];
NSURL *url = [NSURL URLWithString:@"myApp://action/1?parameter=2&secondparameter=3"];
if ([application canOpenURL:url]) {
    [application openURL:url];
    NSLog(@"myApp is installed");
} else {
    NSLog(@"myApp is not installed");
}

Methode zum Extrahieren von QueryString-Daten aus NSURL und Speichern als NSDictionary:

-(NSDictionary *) getNSDictionaryFromQueryString:(NSURL *)url {
   NSMutableDictionary *result = [[NSMutableDictionary alloc] init];
   NSRange needle = [url.absoluteString rangeOfString:@"?" options:NSCaseInsensitiveSearch];
   NSString *data = nil;

   if(needle.location != NSNotFound) {
       NSUInteger start = needle.location + 1;
       NSUInteger end = [url.absoluteString length] - start;
       data = [url.absoluteString substringWithRange:NSMakeRange(start, end)];
   }

   for (NSString *param in [data componentsSeparatedByString:@"&"]) {
       NSArray *keyvalue = [param componentsSeparatedByString:@"="];
       if([keyvalue count] == 2){
           [result setObject:[keyvalue objectAtIndex:1] forKey:[keyvalue objectAtIndex:0]];
       }
   }

  return result;
}

Verwendung:

NSDictionary *result = [self getNSDictionaryFromQueryString:url];
Gillsoft AB
quelle
0

Diese Klasse ist eine gute Lösung für das Parsen von URLs.

.h Datei

@interface URLParser : NSObject {
    NSArray *variables;
}

@property (nonatomic, retain) NSArray *variables;

- (id)initWithURLString:(NSString *)url;
- (NSString *)valueForVariable:(NSString *)varName;

@end

.m Datei

#import "URLParser.h"

@implementation URLParser
@synthesize variables;

- (id) initWithURLString:(NSString *)url{
    self = [super init];
    if (self != nil) {
        NSString *string = url;
        NSScanner *scanner = [NSScanner scannerWithString:string];
        [scanner setCharactersToBeSkipped:[NSCharacterSet characterSetWithCharactersInString:@"&?"]];
        NSString *tempString;
        NSMutableArray *vars = [NSMutableArray new];
        [scanner scanUpToString:@"?" intoString:nil];       //ignore the beginning of the string and skip to the vars
        while ([scanner scanUpToString:@"&" intoString:&tempString]) {
            [vars addObject:[tempString copy]];
        }
        self.variables = vars;
    }
    return self;
}

- (NSString *)valueForVariable:(NSString *)varName {
    for (NSString *var in self.variables) {
        if ([var length] > [varName length]+1 && [[var substringWithRange:NSMakeRange(0, [varName length]+1)] isEqualToString:[varName stringByAppendingString:@"="]]) {
            NSString *varValue = [var substringFromIndex:[varName length]+1];
            return varValue;
        }
    }
    return nil;
}

@end
ymutlu
quelle
0

Hendrik hat ein schönes Beispiel für die Erweiterung dieser Frage geschrieben, aber ich musste es neu schreiben, um keine objektiven c-Bibliotheksmethoden zu verwenden. Die NSArrayschnelle Verwendung ist nicht der richtige Ansatz.

Dies ist das Ergebnis, alles schnell und ein bisschen sicherer. Das Verwendungsbeispiel sind weniger Codezeilen mit Swift 1.2.

public extension NSURL {
    /*
    Set an array with all the query items
    */
    var allQueryItems: [NSURLQueryItem] {
        get {
            let components = NSURLComponents(URL: self, resolvingAgainstBaseURL: false)!
            if let allQueryItems = components.queryItems {
                return allQueryItems as [NSURLQueryItem]
            } else {
                return []
            }
        }
    }

    /**
    Get a query item form the URL query

    :param: key The parameter to fetch from the URL query

    :returns: `NSURLQueryItem` the query item
    */
    public func queryItemForKey(key: String) -> NSURLQueryItem? {
        let filteredArray = filter(allQueryItems) { $0.name == key }

        if filteredArray.count > 0 {
            return filteredArray.first
        } else {
            return nil
        }
    }
}

Verwendung:

let queryItem = url.queryItemForKey("myItem")

Oder detailliertere Verwendung:

if let url = NSURL(string: "http://www.domain.com/?myItem=something") {
    if let queryItem = url.queryItemForKey("myItem") {
        if let value = queryItem.value {
            println("The value of 'myItem' is: \(value)")
        }
    }
}
Paul Peelen
quelle
0

Versuche dies:

-(NSDictionary *)getUrlParameters:(NSString *)url{
    NSArray *justParamsArr = [url componentsSeparatedByString:@"?"];
    url = [justParamsArr lastObject];
    NSMutableDictionary *params = [[NSMutableDictionary alloc] init];
    for (NSString *param in [url componentsSeparatedByString:@"&"]) {
        NSArray *elts = [param componentsSeparatedByString:@"="];
        if([elts count] < 2) continue;
        [params setObject:[elts lastObject] forKey:[elts firstObject]];
    }
    return params;
}
reza_khalafi
quelle
0

Ziemlich kompakter Ansatz:

    func stringParamsToDict(query: String) -> [String: String] {
        let params = query.components(separatedBy: "&").map {
            $0.components(separatedBy: "=")
        }.reduce(into: [String: String]()) { dict, pair in
            if pair.count == 2 {
                dict[pair[0]] = pair[1]
            }
        }
        return params
    }
possen
quelle
-5

Die robusteste Lösung, wenn Sie eine URL verwenden, um Daten von der Web-App an das Telefon zu übergeben, und Arrays, Zahlen, Zeichenfolgen, ...

JSON codiert Ihr Objekt in PHP

header("Location: myAppAction://".urlencode(json_encode($YOUROBJECT)));

Und JSON dekodiert das Ergebnis in iOS

NSData *data = [[[request URL] host] dataUsingEncoding:NSUTF8StringEncoding];
NSDictionary *packed = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];
William Entriken
quelle
1
Das ist eine schreckliche Idee. Eine URL hat eine Längenbeschränkung, die leicht überschritten werden kann, wenn Sie JSON darin serialisieren.
Michael Baldry
Es ist rund 2000 Zeichen
Michael Baldry