Gibt es eine Möglichkeit, alle Swizzled-Methoden in einer iOS-App aufzulisten?

8

Ich bin im Wesentlichen auf der Suche nach einer Möglichkeit, zu erkennen, wann / welche Bibliotheken von Drittanbietern getauscht werden. Ich bin kürzlich auf eine Situation gestoßen, in der eine Anzeigenbibliothek eine Sonderform von AFNetworking verwendet hat. AFNetworking swizzles NSURLSessionTask, und die beiden Swizzles spielten unter bestimmten Umständen nicht gut. Ich würde wirklich gerne in der Lage sein, solche Dinge zu erkennen und vernünftig zu kontrollieren, und im Idealfall sogar einen versionierten Dump von jeder gedrehten Methode in der App zu haben, damit wir einen Einblick bekommen, wer und was die Gefahren sind. Die Google- und die Stack-Overflow-Suche haben nur eine Auswahl an Tutorials zum Thema Swizzle ergeben. Ist jemand auf dieses Problem gestoßen oder hat er eine Lösung? Es sieht so aus, als könnte ich etwas mit objc / runtime.h programmieren, aber ich kann mir nicht vorstellen, dass ich die erste Person bin, die das braucht.

    
BTK 20.07.2016, 18:35
quelle

1 Antwort

8

Hier ist das, was ich am nächsten hatte, mit ein paar Stunden Bastelei. Es beinhaltet eine Abzweigung von mach_override , ein paar DYLD-Quirks bezüglich der Ladereihenfolge und einen Bauch für verrückte Hacks.

Es wird nur am Simulator funktionieren, aber das sollte für den Anwendungsfall ausreichen, den Sie zu haben scheinen (ich hoffe natürlich, dass Sie keine Nur-Gerät-Abhängigkeiten haben).

Das Code-Element sieht ungefähr so ​​aus:

%Vor%

Was überraschend einfach ist und eine Ausgabe wie folgt erzeugt:

  

Austauschen von Implementierungen für Methodenbeschreibung und custom_description.

Es gibt keinen guten Weg (ohne einen Haltepunkt zu verwenden und durch den Stack-Trace zu schauen), um herauszufinden, welche Klasse getauscht wird, aber für die meisten Dinge sollte ein Blick auf die Selektoren Ihnen einen Hinweis geben, wohin Sie gehen von dort.

Es scheint mit einigen Kategorien zu funktionieren, die ich während swizzle +load erstellt habe, und von meinem Lesen von mach_override und DYLDs internals, solange Sie Ihre Bibliothek laden Reihenfolge richtig eingerichtet haben, können Sie erwarte, dass dies vor jedem anderen Benutzerland-Code initialisiert wird, wenn du es in seine eigene dynamische Bibliothek legst.

Jetzt kann ich nicht für die Sicherheit bürgen, aber es scheint nützlich zu sein, als Debugging-Tool zu bleiben, also habe ich mein Beispiel zu github veröffentlicht:

Ссылка

Es ist MIT lizensiert, also fühlen Sie sich frei, wie Sie es für richtig halten.

    
Richard J. Ross III 20.07.2016, 21:16
quelle