NSURL+scheme.m 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. //
  2. // NSURL+scheme.m
  3. // OpenPlatform
  4. //
  5. // Created by wentian on 17/8/10.
  6. // Copyright © 2017年 wentian. All rights reserved.
  7. //
  8. #import "NSURL+scheme.h"
  9. #import <Foundation/Foundation.h>
  10. @implementation NSURL (scheme)
  11. +(NSURL *)urlWith:(NSString *)schemeStr queryParams:(NSDictionary *)params {
  12. NSURL *url = [NSURL URLWithString:schemeStr];
  13. NSString *prefix = url.query ? @"&" : @"?";
  14. NSMutableArray* keyValuePairs = [NSMutableArray array];
  15. for (NSString* key in [params allKeys]) {
  16. id value = [params objectForKey:key];
  17. if(![value isKindOfClass:[NSString class]]) {
  18. NSLog(@"warning: %@ is not NSString Class", value);
  19. }
  20. CFStringRef escapedStr = CFURLCreateStringByAddingPercentEscapes(NULL,
  21. (CFStringRef)value,
  22. NULL,
  23. (CFStringRef)@"!*'();:@&=+$,/?%#[]",
  24. kCFStringEncodingUTF8);
  25. [keyValuePairs addObject:[NSString stringWithFormat:@"%@=%@", key, escapedStr]];
  26. CFRelease(escapedStr);
  27. }
  28. NSString *queryStr = [keyValuePairs componentsJoinedByString:@"&"];
  29. NSString *urlString = [NSString stringWithFormat:@"%@%@%@", schemeStr, prefix, queryStr];
  30. return [NSURL URLWithString:urlString];
  31. }
  32. -(NSDictionary *)queryParams {
  33. if(!self.query) {
  34. return nil;
  35. }
  36. NSMutableDictionary *ret = [NSMutableDictionary dictionary];
  37. NSArray *keyValuePairs = [self.query componentsSeparatedByString:@"&"];
  38. for(id kv in keyValuePairs) {
  39. NSArray *kvPair = [kv componentsSeparatedByString:@"="];
  40. NSString *key = [kvPair objectAtIndex:0];
  41. NSString *value = [kvPair objectAtIndex:1];
  42. CFStringRef origStr =
  43. CFURLCreateStringByReplacingPercentEscapesUsingEncoding(NULL,
  44. (CFStringRef)(value),
  45. CFSTR(""),
  46. kCFStringEncodingUTF8);
  47. [ret setValue:(__bridge NSString*)(origStr) forKey:key];
  48. if (origStr) {
  49. CFRelease(origStr);
  50. }
  51. }
  52. return ret;
  53. }
  54. @end