@@ -44,7 +44,11 @@ - (NSData *)buildBodyWithInput:(SAFlowData *)input {
44
44
if (!data) {
45
45
return nil ;
46
46
}
47
- data = [data stringByAddingPercentEncodingWithAllowedCharacters: [NSCharacterSet alphanumericCharacterSet ]];
47
+
48
+ // data = [data stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];
49
+ // FIXME: https://github.com/sensorsdata/sa-sdk-ios/issues/148、https://github.com/sensorsdata/sa-sdk-ios/issues/149
50
+ data = [self percentEncodingStringFromString: data];
51
+
48
52
NSString *bodyString = [NSString stringWithFormat: @" crc=%d &gzip=%d &data_list=%@ " , hashCode, [gzip intValue ], data];
49
53
if (input.isInstantEvent ) {
50
54
bodyString = [bodyString stringByAppendingString: @" &instant_event=true" ];
@@ -71,4 +75,33 @@ - (NSDictionary *)buildBodyWithFlowData:(SAFlowData *)flowData {
71
75
return bodyDic;
72
76
}
73
77
78
+ // 参照 https://github.com/AFNetworking/AFNetworking/blob/master/AFNetworking/AFURLRequestSerialization.m
79
+ - (NSString *) percentEncodingStringFromString : (NSString *)string {
80
+ static NSString * const kSACharactersGeneralDelimitersToEncode = @" :#[]@" ; // does not include "?" or "/" due to RFC 3986 - Section 3.4
81
+ static NSString * const kSACharactersSubDelimitersToEncode = @" !$&'()*+,;=" ;
82
+
83
+ NSMutableCharacterSet * allowedCharacterSet = [[NSCharacterSet URLQueryAllowedCharacterSet ] mutableCopy ];
84
+ [allowedCharacterSet removeCharactersInString: [kSACharactersGeneralDelimitersToEncode stringByAppendingString: kSACharactersSubDelimitersToEncode ]];
85
+
86
+ static NSUInteger const batchSize = 50 ;
87
+
88
+ NSUInteger index = 0 ;
89
+ NSMutableString *escaped = @" " .mutableCopy ;
90
+
91
+ while (index < string.length ) {
92
+ NSUInteger length = MIN (string.length - index, batchSize);
93
+ NSRange range = NSMakeRange (index, length);
94
+
95
+ // To avoid breaking up character sequences such as 👴🏻👮🏽
96
+ range = [string rangeOfComposedCharacterSequencesForRange: range];
97
+
98
+ NSString *substring = [string substringWithRange: range];
99
+ NSString *encoded = [substring stringByAddingPercentEncodingWithAllowedCharacters: allowedCharacterSet];
100
+ [escaped appendString: encoded];
101
+
102
+ index += range.length ;
103
+ }
104
+
105
+ return escaped;
106
+ }
74
107
@end
0 commit comments