}
......
18 => {
"cell" => "PSLinkListCell"
"label" => "HOME_CLICK_TITLE"
"detail" => "HomeClickController"
"get" => "homeClickSpeed:"
}
19 => {
"detail" => "PSListItemsController"
"set" => "accessibilitySetPreference:specifier:"
"validValues" => [
0 => 0
1 => 1
2 => 2
]
"get" => "accessibilityPreferenceForSpecifier:"
"validTitles" => [
0 => "DEFAULT"
1 => "HEADSET"
2 => "SPEAKER"
]
"requiredCapabilities" => [
0 => "telephony"
]
"cell" => "PSLinkListCell"
"label" => "ACCESSIBILITY_DEFAULT_HEADSET"
"key" => "DefaultRouteForCall"
}
]
}
It was another standard preferences specifier plist and I knew that the getter and setter for
“Incoming Calls” were accessibilitySetPreference:specifier: and
accessibilityPreferenceForSpecifier:. So it was time to move on to the next step.
5.3.3 Locate methods and functions
According to preferences specifier plist, when selecting a row in “Incoming calls”, its setter,
i.e. accessibilitySetPreference:specifier: would get called. However, a problem came up that this
method was in AccessibilitySettings.bundle, I didn’t know how to load this bundle into memory
at that time and as a result, I wasn’t able to call the method. What’s even worse, I didn’t know
how to use IDA and LLDB while there was nothing helpful in class-dump headers. I felt this
problem was far beyond my ability and couldn’t get solved in a short time. So I’ve sent a
complaint email to Shoghian frustratingly, as shown in figure 5-17.