有没有办法在Mac OS X上有选择地使用Charles代理与iOS模拟器等特定应用程序?目前同时监控HTTP流量来来回回与iOS模拟器运行iOS应用程序,查尔斯还监视来自其他应用Chrome和邮件应用程序等,这实在是令人分心的HTTP流量.除了在Charles Proxy设置下添加我们想要绕过的域列表之外,有没有办法做到这一点?
Chrome确实是一个问题,因为它使用的是Mac OS X代理设置.我试过像Proxy Switchy这样的扩展,但它要么没有帮助,要么我不知道如何配置它.
任何指针都将受到高度赞赏.谢谢!
我正在使用iOS AVPlayer播放HLS流.在HLS会话开始时,当我收到index.m3u8 URL以响应创建AVPlayerItem时,响应还会设置基于会话的身份验证所需的cookie.假设这个cookie名称是myCookie,它是为域".myhost.com"创建的.现在一切正常,播放器发送myCookie从xxx.myhost.com/stream下载ts块.随着播放的进行,播放列表最终会更新,播放器会下载更新的播放列表.有时,更新的播放列表包含从其他主机的URL下载的ts块.因此,当尝试使用不同的主机播放块时,播放器请求xxx.someotherhost.com下载块.这导致响应302重定向与位置:xxx-abc.myhost.com/ads.显然AVPlayer没有 从someotherhost.com请求一个块时发送myCookie,因为它与myCookie的域不匹配.但问题是在重定向到xxx-abc.myhost.com/ads后,AVPlayer不发送myCookie,即使重定向URL的域名也是myhost.com,也与cookie的域匹配.
请注意,重定向URL域与原始流域相同,也与myCookie域相同.由于AVPlayer在重定向后没有将cookie发送到下载块,因此ts块请求失败,403 Forbidden(No Token)
我在这里做错了什么,或者这看起来像iOS AVPlayer中的错误?
有没有办法解决这个问题?请分享你的想法.
我为我的iOS应用编写了自己的HTTPClient实现,以异步方式下载指定URL的内容.HTTPClient使用NSOperationQueue将NSURLConnection请求排入队列.我选择了NSOperationQueue因为我想在任何时候取消任何或所有正在进行的NSURLConnection.
我做了很多关于如何实现我的HTTPClient的研究,我有两个选择来执行NSURLConnection:
1)在单独的辅助线程上执行每个排队的NSURLConnection.NSOperationQueue在后台执行辅助线程上的每个排队操作,因此除了在重写的NSOperation子类的start方法中启动我的NSURLConnection并为生成的辅助线程运行runloop直到connectionDidFinishLoading或者之外,我不需要做任何显式生成辅助线程的事情.调用connectionDidFailWithError.它看起来如下:
if (self.connection != nil) {
do {
[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode
beforeDate:[NSDate distantFuture]];
} while (!self.isFinished);
}
Run Code Online (Sandbox Code Playgroud)
2)在主线程上执行每个排队的NSURLConnection.对于start方法中的这个,我使用performSelectorOnMainThread并在主线程上再次调用start方法.通过这种方法,我使用NSRunLoopCommonModes安排NSURLConnection,如下所示:
[self.connection scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes];
Run Code Online (Sandbox Code Playgroud)
我选择了第二种方法并实施了它.从我的研究来看,第二种方法似乎更好,因为它没有为每个NSURLConnection启动一个单独的辅助线程.现在,在任何时候,在应用程序中可能会有许多请求同时进行,并且使用第一种方法,这意味着将生成相同数量的辅助线程,并且在关联的url请求完成之前不会返回池.
我的印象是我仍然通过使用NSRunLoopCommonModes安排NSURLConnection来同时运行第二种方法.在使用这种方法的其他方面,我认为我使用NSRunLoopCommonModes而不是多线程进行并发,因此NSURLConnection的观察者将尽快调用connectionDidFinishLaunching或connectionDidFailWithError,无论主要线程在UI处于哪个主要线程.时间.
不幸的是,今天早上我的一位同事告诉我,当前的实现时,NSURLConnection在其中一个视图控制器上的滚动视图停止滚动之前不会返回.当滚动视图即将停止滚动时,启动NSURLRequest获取数据,但即使它在滚动视图停止调用之前完成,NSURLConnection也不会回调connectionDidFinishLoading或connectionDidFailWithError,直到滚动视图完全停止滚动.这意味着在主线程上使用NSRunLoopCommonModes调度NSURLConnection以获得与UI操作(触摸/滚动)的真实并发的整个想法被证明是错误的并且NSURLConnection仍然等待直到主线程忙于滚动滚动视图.
我尝试切换到使用辅助线程的第一种方法,它就像一个魅力.当滚动视图仍在滚动时,NSURLConnection仍会调用其协议方法之一.这很清楚,因为现在NSURLConnection没有在主线程上运行,所以它不会等待滚动视图停止滚动.
我真的不想使用第一种方法,因为它由于多线程而很昂贵.
如果我对第二种方法的理解不正确,有人可以告诉我吗?如果它是正确的,使用NSRunLoopCommonModes安排NSURLConnection的原因是什么原因不能按预期工作?
如果答案更具描述性,我将非常感激,因为对于我来说,NSRunLoop和NSRunLoopModes的确切工作方式应该让我更加怀疑.只是为了说明我已经多次阅读过这方面的文档了.
我的 Xcode 项目“MyMainApp”有一个名为“MyLib”的静态库类型 Xcode 子项目。现在我需要在我的 iOS 应用程序中使用一些第三方 iOS 框架。我只想将它们添加/链接到 MyLib 而不是 MyMainApp,这样我就可以使 MyLib 可重用且独立,以便在我的其他 iOS 应用程序中使用它。MyMainApp 中的一些视图控制器使用属于 MyLib 的视图控制器之一。MyLib 中的此视图控制器使用第三方框架内的类的功能。现在我面临的问题是,如果我将第三方框架添加到 MyLib 而不是将它们添加到 MyMainApp,我会收到链接器错误“词法或预处理器问题。未找到 XXX.h 文件”。如果我将框架添加到 MyMainApp 和 MyLib 中,一切都会正常运行,但这不是我想要的。我已确保框架搜索路径和标头搜索路径是正确的。在这种情况下,我无法找到苹果公司的任何参考资料。我想知道将第三方框架和库添加/链接到静态库类型的 Xcode 子项目的最佳实践。还有解决方案可以克服链接器错误并将框架仅添加到静态库项目吗?
可以说我有一个学生课程如下:
class Student {
NSNumber *id;
NSString *lastName;
NSString *firstName;
}
Run Code Online (Sandbox Code Playgroud)
现在,当我从Web服务中获取所有学生的记录时,我有一个NSArray,可以存储所有学生的记录.在某些时候,我需要查找数组,根据名字查找特定学生的记录.
假设我创建了一个名为studentsFirstNameDictionary的字典.
因此,在向学生阵列添加对象时,我可以这样做
Student objStudent = [[Student alloc] init];
objStudent.Id = someId;
objStudent.firstName = someName;
objStudent.lastName = someLastName;
[studentsDictionary setValue:iterationCounter forKey:objStudent.firstName];
[students addObject:objStudent];
Run Code Online (Sandbox Code Playgroud)
我想知道创建这个字典是否是一个好主意,以加快查找速度,如下所示.另外请假设在任何情况下都需要数组,并且为了快速查找,我还创建了其他字典,并将姓氏和id作为键和索引存储为上述值:
-(Student*)getStudentByFirstName:(NSString *)firstName {
int idxOfStudent = [ studentsDictionary valueForKey:firstName];
return [students idxOfStudent];
}
Run Code Online (Sandbox Code Playgroud)
您是否认为这种方法比通过迭代学生数组并比较名字并返回匹配的学生记录更好?
我总是需要学生数组,因为我需要用该数组填充表视图.我想知道在填充数组时创建多个词典是否明智,以便我可以通过拳头名,姓或Id更快地查找学生记录?
PS:为了简单起见,考虑到所有的学生都有独特的姓,名和ID,因此不会有任何问题,同时创造字典存储姓氏,名字或ID作为值.
举一个现实世界的例子,假设基类是Vehicle,具体类是TwoWheeler和FourWheeler.现在车辆的类型 - TwoWheeler或FourWheeler,由基类车辆决定.当我使用alloc-init方法创建TwoWheeler/FourWheeler的实例时,它调用下面的超级实现来设置Vehicle类中定义的公共属性的值,并且在这些属性中,其中一个是实际决定类型的类型是TwoWheeler或FourWheeler.
if (self = [super initWithDictionary:dict]){
[self setOtherAttributes:dict];
return self;
}
Run Code Online (Sandbox Code Playgroud)
现在,当我得到一些车辆时,其中一些可能是TwoWheeler而其他人则是FourWheeler.因此,我不能像这样直接创建TwoWheeler或FourWheeler的实例
Vehicle *v = [[TwoWheeler alloc] initWithDictionary:dict];
Run Code Online (Sandbox Code Playgroud)
有什么方法可以创建基类的实例,一旦我知道了类型,根据类型创建子类的实例并返回它.使用当前的实现,它将导致无限循环,因为我从具体类调用超级实现.
当我不知道事先应该实例化哪个具体类时,处理这种情况的完美设计是什么?
ios ×6
objective-c ×4
avplayer ×1
concurrency ×1
http ×1
nsarray ×1
nsdictionary ×1
nshttpcookie ×1
nsrunloop ×1
oop ×1
proxy ×1
simulator ×1
subproject ×1
xcode ×1