Make an NSURL with an encoded plus (+)

前端 未结 7 1095
北海茫月
北海茫月 2021-02-14 01:32

I need to pass a timestamp with a timezone offset in a GET request, e.g.,

2009-05-04T11:22:00+01:00

This looks like a two arguments

相关标签:
7条回答
  • 2021-02-14 01:47

    Thought I may as well provide my workaround as an answer, as I don't think there's a good solution to the original problem.

    The plus sign (+) is completely valid in a URL, so my solution was to convert the time to GMT and remove the timezone/DST offset from the string. I'll leave it as an exercise for the reader to determine the value of secondsFromGMT below as, in my case, it's always the same because I'm only interested in timestamps generated by a web server.

    NSString *gmtWhen = [[self descriptionWithCalendarFormat:nil
                               timeZone:[NSTimeZone
                               timeZoneForSecondsFromGMT:secondsFromGMT
                         ] locale:nil] stringByReplacingOccurrencesOfString:@" +0000" withString:@""];
    
    0 讨论(0)
  • 2021-02-14 01:49

    What worked for me was doing the UTF8 conversion, then replacing the + sign with %2B:

    NSString *urlString =
        [NSString stringWithFormat:@"%@/iphone/push/create?pn[token]=%@&pn[send_at]=%@",
         kHTTPURL, appDelegate.deviceAPNToken, [dateTimeToUse description]];
    
    urlString =
        [[urlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]
         stringByReplacingOccurrencesOfString:@"+" withString:@"%2B"];
    
    0 讨论(0)
  • 2021-02-14 01:51

    Solution when using URLComponents (Swift 3):

    var params = ["email": "user+ios-default@example.com", "name": "John Brown"]
    var components = URLComponents(string: "http://www.example.com")!
    components.path = "/login"
    components.queryItems = params.map { URLQueryItem(name: $0, value: $1) }
    
    let url_NoFix = components.url!
    // http://www.example.com/login?name=John%20Brown&email=user+ios-default@example.com
    
    let cs = CharacterSet(charactersIn: "+").inverted
    let q =  components.percentEncodedQuery?.addingPercentEncoding(withAllowedCharacters: cs)
    components.percentEncodedQuery = q
    
    let url_Fixed = components.url!
    // http://www.example.com/login?name=John%20Brown&email=user%2Bios-default@example.com
    
    0 讨论(0)
  • 2021-02-14 01:55

    Use NSString's stringByAddingPercentEscapesUsingEncoding: method on the text you want to include as an argument.

    As its name implies, the method will convert return an auto-released string containing an url-safe version of the receiver.

    0 讨论(0)
  • 2021-02-14 01:56

    encode you string by using below code

    NSString *result = (NSString *)CFURLCreateStringByAddingPercentEscapes(NULL, (CFStringRef)self,NULL,(CFStringRef)@"+",kCFStringEncodingUTF8);

    this will encode + of you string which will prevent replacement of + by %2b while posting data in post method

    0 讨论(0)
  • 2021-02-14 02:05

    The string should be URL encoded.

    Here is a category for NSString that will help:

    NSString+Additions.h

    @interface NSString (Additions)
    
    - (NSString *)stringByURLEncoding;
    

    NSString+Additions.m

    #import "NSString+Additions.h"
    
    @implementation NSString (Additions)
    
    - (NSString *)stringByURLEncoding {
        return (__bridge NSString *)CFURLCreateStringByAddingPercentEscapes(NULL,
                                                               (CFStringRef)self,
                                                               NULL,
                                                               (CFStringRef)@"!*'\"();:@&=+$,/?%#[]% ",
                                                               CFStringConvertNSStringEncodingToEncoding(NSUTF8StringEncoding));
    }
    
    0 讨论(0)
提交回复
热议问题