Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

工程接入AFNetworking,同时使用AFURLSessionManager得到NSURLSessionDownloadTask,在iOS8下面会unrecognized selector崩溃 #32

Closed
lalalafq opened this issue Jul 18, 2019 · 2 comments

Comments

@lalalafq
Copy link

lalalafq commented Jul 18, 2019

Describe the bug
工程接入AFNetworking,同时使用NSURLSessionDownloadTask,在iOS8下面会崩溃

Log
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFLocalDownloadTask _hawkeye_swizzle_e8dba47d_resume]: unrecognized selector sent to instance 0x103c0440'

Last Exception Backtrace:
0 CoreFoundation 0x28634f87 0x2852d000 + 1081223
1 libobjc.A.dylib 0x35c57c77 0x35c51000 + 27767
2 CoreFoundation 0x2863a37d 0x2852d000 + 1102717
3 CoreFoundation 0x28638259 0x2852d000 + 1094233
4 CoreFoundation 0x28569d68 0x2852d000 + 249192
5 MTHawkeye 0x054c81cb __54+[MTHNetworkObserver injectIntoNSURLSessionTaskResume]_block_invoke_2 (MTHNetworkObserver.m:256)
6 MTHawkeye 0x054c81cb __54+[MTHNetworkObserver injectIntoNSURLSessionTaskResume]_block_invoke_2 (MTHNetworkObserver.m:256)
7 MTHawkeye 0x054c81cb __54+[MTHNetworkObserver injectIntoNSURLSessionTaskResume]_block_invoke_2 (MTHNetworkObserver.m:256)
8 ThirdBase 0x059077d9 -[_AFURLSessionTaskSwizzling af_resume] (AFURLSessionManager.m:456)

Additional context
使用[AFURLSessionManager downloadTaskWithRequest:progress:destination:completionHandler]得到NSURLSessionDownloadTask,这是个类簇,实际得到__NSCFLocalDownloadTask,调用resume的时候崩溃 。

继承关系如下:
iOS8:__NSCFLocalDownloadTask -> __NSCFLocalSessionTask -> NSURLSessionTask;
iOS8以上:__NSCFLocalDownloadTask -> __NSCFLocalSessionTask -> __NSCFURLSessionTask-> NSURLSessionTask;

在MTHNetworkObserver中(大概240行左右),通过NSURLSessionDownloadTask拿到的是__NSCFLocalDataTask(继承关系和__NSCFLocalDownloadTask同一个层级 )。你们处理了iOS8以上的直接用__NSCFURLSessionTask及更底层的NSURLSessionTask进行方法交换. iOS8及已下没处理。

Question
1.是否特意这样处理(用硬编码的方式进行处理)。如果是的话,修改方法:在iOS的情况下,currnetClass = NSStringFromString("__NSCFLocalSessionTask")
2.是否想hook对应的resume方法,插入对应的MT框架的代码,如果是的话可以尝试AFURLSessionManager的方式。(我看了代码AFURLSessionManager的代码,和你们的处理逻辑相仿,但是不明白为什么写到后面的方法交换没有用AF那套逻辑,我试了改写代码用AFNetworking这套逻辑是可以正常工作的)

很多地方可能有错误,请指正。

@euanchan
Copy link
Collaborator

我们在版本迭代过程中引入的一个问题,最早是直接采用了 FLEX 的方案,但印象在 iOS10 及以上处理有隐患,后面就部分切换到 AF 的逻辑,但切换过程中版本处理有误,导致了 iOS8 下漏处理了。

  1. 确实是援用 FLEX 用硬编码的形式
  2. 确实是要 hook resume 的流程以便后续开始跟踪网络

看了下确实直接用 AF 的处理的方式兼容性和隐患会少些,如果方便的话,能否直接提交个 PR 呢?

@euanchan
Copy link
Collaborator

6ad3232 中已处理

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants