Charles —— 青花瓷 網路抓包工具 可以攔截 iPhone/Android 手機中 App 的 網路請求數據 使用 手機&電腦在同一個區域網 確保電腦能夠通過路由器訪問互聯網 電腦安裝 啟動 ,禁用 & 設置手機的網路代理 : 電腦的 ip : 8888 ...
Charles —— 青花瓷
- 網路抓包工具
- 可以攔截 iPhone/Android 手機中 App 的
非加密
網路請求數據
使用
- 手機&電腦在同一個區域網
- 確保電腦能夠通過路由器訪問互聯網
- 電腦安裝
Charles
- 啟動
Charles
,禁用MAC OS X Proxy
&Mozilla FireFox Proxy
- 設置手機的網路代理
ip
: 電腦的 ip埠
: 8888
註意,如果讓電腦通過手機的 3G
訪問網路,無法攔截數據
攔截網易新聞數據
網路訪問
建立網路訪問單例
+ (instancetype)sharedManager {
static NetworkTools *instance;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
// 註意:baseURL 應該以 / 結尾
NSURL *baseURL = [NSURL URLWithString:@"http://c.m.163.com/nc/article/headline/"];
NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];
instance = [[self alloc] initWithBaseURL:baseURL sessionConfiguration:config];
return instance;
}
載入新聞首頁數據
- (void)loadData {
[[NetworkTools sharedManager] GET:@"T1348647853363/0-20.html" parameters:nil success:^(NSURLSessionDataTask *task, id responseObject) {
NSLog(@"%@ %@", responseObject, [responseObject class]);
} failure:^(NSURLSessionDataTask *task, NSError *error) {
NSLog(@"%@", error);
}];
}
運行測試,statecode == 200,但是不支持數據格式 "text/html"
擴展反序列化格式類型
- 在
NetworkTools
單例中,擴展反序列化格式類型
instance.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript", @"text/html", nil];
字典轉模型
字典使用技巧 - 取第一個鍵值內容
// 直接取出字典中第一個 key T1348647853363 對應的數組
NSArray *array = responseObject[responseObject.keyEnumerator.nextObject];
NSLog(@"%@", array);
新聞模型
.h
/// 標題
@property (nonatomic, copy) NSString *title;
/// 摘要
@property (nonatomic, copy) NSString *digest;
/// 配圖地址
@property (nonatomic, copy) NSString *imgsrc;
+ (instancetype)newsWithDict:(NSDictionary *)dict;
.m
+ (instancetype)newsWithDict:(NSDictionary *)dict {
id obj = [[self alloc] init];
[obj setValuesForKeysWithDictionary:dict];
return obj;
}
字典轉模型
NSMutableArray *arrayM = [NSMutableArray arrayWithCapacity:array.count];
[array enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
[arrayM addObject:[News newsWithDict:obj]];
}];
NSLog(@"%@", arrayM);
運行測試-崩潰
- 因為網路字典中的屬性鍵值比 News 模型中的屬性多,直接使用
setValuesForKeysWithDictionary
方法會崩潰
修改新聞模型
+ (instancetype)newsWithDict:(NSDictionary *)dict {
id obj = [[self alloc] init];
NSArray *properties = [self properties];
for (NSString *key in properties) {
if (dict[key] != nil) {
[obj setValue:dict[key] forKey:key];
}
}
return obj;
}
+ (NSArray *)properties {
return @[@"title", @"digest", @"imgsrc"];
}
增加 description
- (NSString *)description {
NSDictionary *dict = [self dictionaryWithValuesForKeys:[News properties]];
return [NSString stringWithFormat:@"<%@: %p> %@", self.class, self, dict];
}
利用運行時動態獲取類屬性
const char* propertiesKey = "propertiesKey";
+ (NSArray *)properties {
NSMutableArray *arrayM = objc_getAssociatedObject(self, propertiesKey);
if (arrayM != nil) {
NSLog(@"返回關聯數組");
return arrayM;
}
NSLog(@"動態獲取類屬性");
unsigned int count = 0;
objc_property_t *ptys = class_copyPropertyList([self class], &count);
arrayM = [NSMutableArray arrayWithCapacity:count];
for (unsigned int i = 0; i < count; ++i) {
objc_property_t pty = ptys[i];
const char* cname = property_getName(pty);
[arrayM addObject:[NSString stringWithUTF8String:cname]];
}
free(ptys);
objc_setAssociatedObject(self, propertiesKey, arrayM, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
return arrayM;
}