SlideShare a Scribd company logo
1 of 54
Download to read offline
Hacking iOS Simulator
Writing your own plugin for Simulator, enhancing development workflow
INTRODUCING
@ahmed_sulajman
Ahmed Sulaiman
Co-founder of https://flawlessapp.io & Engineer & UI Designer
ahmed@flawlessapp.io
@ahmed_sulajman
HELLO
@ahmed_sulajman
HELLO Our Products
@ahmed_sulajman
Reduce App Awesome Design Tools
Design Tools Weekly
HELLO Our Products
DESIGN REAL APP
iOS Simulator
@ahmed_sulajman
SIMULATOR INTRO
Loading custom code into iOS Simulator
And how this will enhance your developmnet worflow
@ahmed_sulajman
!
SIMULATOR INTRO Current state of Simulator and Xcode
@ahmed_sulajman
@ahmed_sulajman
SIMULATOR INTRO New in Simulator since Xcode 9
Launch multiple
iOS Simulator
Resize iOS Simulator
like regular window
Full-Screen mode
along with Xcode
@ahmed_sulajman
SIMULATOR INTRO Why Simulator is important
30%
30%
30%
10%
!
"
# Testing in iOS Simulator
during development
Actual Development
Communication
Meetings
Compiling & Building…
@ahmed_sulajman
AGENDA
Intro to simctl
What is simctl and what it allows you to do now
!
Method Swizzling
How you can change implementation of the method you have no access to
"
Building Dynamic Library
How to make a dynamic library for iOS and how to upload it to iOS Simulator
#
What’s next for iOS Simulator plugins
Where to go from here and how you can enhance iOS Simulator plugins even more
$
simctl
@ahmed_sulajman
Intro to simctl
What is simctl and what it allows you to do now
!
@ahmed_sulajman
SIMCTL What is simctl
Simulator ≠ Emulator
@ahmed_sulajman
SIMCTL What is simctl
Simulator ≠ Emulator
@ahmed_sulajman
SIMCTL What is simctl
> xcrun simctl
Command line utility to control the Simulator
@ahmed_sulajman
SIMCTL What simctl can do devices list
> xcrun simctl list -j [devices|devicetypes|runtimes|pairs]
List available devices, device types, runtimes, or device pairs
@ahmed_sulajman
SIMCTL
> xcrun simctl list -j [devices|devicetypes|runtimes|pairs]
> xcrun simctl list -j devices $someSearchTerm
What simctl can do devices list
@ahmed_sulajman
SIMCTL
> xcrun simctl list -j [devices|devicetypes|runtimes|pairs]
{
"devices" : {
"com.apple.CoreSimulator.SimRuntime.iOS-12-2" : [
{
"availability" : "(available)",
"state" : "Shutdown",
"isAvailable" : true,
"name" : "iPad Air (3rd generation)",
"udid" : "18D30337-C8E3-43AE-8765-5D935D9408BF",
"availabilityError" : ""
}
]
}
}
What simctl can do devices list
@ahmed_sulajman
SIMCTL
> xcrun simctl boot <device>
Boot a specific device
> xcrun simctl shutdown <device> | all
Shutdown a specific device or all devices
What simctl can do boot & shutdown device
@ahmed_sulajman
SIMCTL
> xcrun simctl io booted recordVideo --type=mp4 <file path>
Records the display to the specified file or url (use "-" for stdout).
What simctl can do video recording
@ahmed_sulajman
SIMCTL
> xcrun simctl spawn
Spawn a process by executing a given executable on a device.
!
What simctl can do spawn process
@ahmed_sulajman
SIMCTL
> xcrun simctl spawn
syslog
leaks
malloc_history
...
heap
notifyutil
logstringdups
iOS Simulator
Tools and utils in iOS Runtime
macOS Environment
Launching process from macOS inside Simulator
spawn
What simctl can do spawn process
@ahmed_sulajman
SIMCTL
> xcrun simctl spawn
Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/
Library/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/
Resources/RuntimeRoot/usr/...
Collect system log into a log archive, watch live system logs
log!
Search through a process for leaked memory
leaks!
Displays/aggregates allocation histories in a process
malloc_history!
What simctl can do spawn process
@ahmed_sulajman
SIMCTL
> xcrun simctl spawn booted <tool name>
What simctl can do spawn process
@ahmed_sulajman
SIMCTL
> xcrun simctl spawn booted <tool name>
syslog
leaks
malloc_history
...
heap
notifyutil
launchctl
logstringdups
launchd
spawn
What simctl can do spawn process
@ahmed_sulajman
SIMCTL SimulatorKit framework
Xcode SimulatorKit
simctl
@ahmed_sulajman
SIMCTL Conclusions
simctl is the main interface to iOS Simulatorsimctl
via simctl interact with Simulator and explore its process as it isn’t an Emulator
!
spawn tool allows you to launch internal toolsspawn
By typing exact executable you can spawn a process in iOS Simulator
!
Using launchctl allows you to manage serviceslaunchctl
spawn allows you to launch internal tools inside iOS Simulator
!
@ahmed_sulajman
Method Swizzling
How you can change implementation of the method you have no access to
!
@ahmed_sulajman
Objective-C Zone
@ahmed_sulajman
SWIZZLING How does it work
Objective-C Runtime
The Objective-C runtime is a runtime library that provides support
for the dynamic properties of the Objective-C language, and as such
is linked to by all Objective-C apps
#import <objc/runtime.h>
@ahmed_sulajman
SWIZZLING How does it work class dispatch table
Objetive-C Class Dispatch Table
@ahmed_sulajman
SWIZZLING How does it work class dispatch table
Dispatch TableObjetive-C Class
Method Selector Implementation
Method Selector Implementation
Method Selector Implementation
@ahmed_sulajman
SWIZZLING How does it work class dispatch table
@interface HelloRuntime: NSObject
- (void)hello:(NSString *)text;
@end
@implementation HelloRuntime
- (void)hello:(NSString *)text {
NSLog(@"Hello, %@!", text);
}
@end
@ahmed_sulajman
SWIZZLING How does it work
Method: -[hello:] Selector: @selector(hello:)
class dispatch table
NSLog(@"Hello, %@!", text);
Implementation
@ahmed_sulajman
SWIZZLING How does it work replace method implementation
NSLog(@"Hello, %@!", text);
ImplementationAlt Implementation
Method: -[hello:]
Method: -[alt_hello:]
Selector: @selector(hello:)
Selector: @selector(alt_hello:)
@ahmed_sulajman
SWIZZLING How does it work replace method implementation
Alt Implementation
NSLog(@"Hello, %@!", text);
Implementation
Method: -[hello:]
Method: -[alt_hello:]
Selector: @selector(hello:)
Selector: @selector(alt_hello:)
@ahmed_sulajman
- (void)alt_hello:(NSString *)text {
[self alt_hello:@"Cocoaheads Kyiv"];
// DO not call original -[hello:] here
// it will lead to infinite loop
// [self hello:@"Cocoaheads Kyiv"];
}
SWIZZLING How does it work replace method implementation
@ahmed_sulajman
SWIZZLING How to implement it
How-to Swizzle
+ (void)load {
}
@ahmed_sulajman
SWIZZLING How to implement it
How-to Swizzle
+ (void)load {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
});
}
@ahmed_sulajman
SWIZZLING How to implement it
+ (void)load {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
Class class = [self class];
SEL originalSelector = @selector(hello:);
SEL swizzledSelector = @selector(alt_hello:);
Method originalMethod = class_getInstanceMethod(class, originalSeletor);
Method swizzledMethod = class_getInstanceMethod(class, swizzledSelector);
method_exchangeImplementations(originalMethod, swizzledMethod);
});
}
How-to Swizzle
@ahmed_sulajman
SWIZZLING How to implement it
+ (void)load {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
Class class = [self class];
SEL originalSelector = @selector(hello:);
SEL swizzledSelector = @selector(alt_hello:);
Method originalMethod = class_getInstanceMethod(class, originalSeletor);
Method swizzledMethod = class_getInstanceMethod(class, swizzledSelector);
method_exchangeImplementations(originalMethod, swizzledMethod);
});
}
How-to Swizzle
method_exchangeImplementations( )
Use method_exchangeImplementations( ) with cautions. Better
explore class_addMethod( ) and class_replaceMethod( )
⚠
@ahmed_sulajman
SWIZZLING Conclusions
Every class has dispatch table
It allows the class to understand which selector corresponds to which method
!
Change dispatch table in runtime
Objective-C Runtime allow us to change dispatch table and assign different IMP to SEL
!
Pay a!ention when doing swizzling
Use +[load] and dispatch_once to ensure your code runs once when the class has been loaded
!
@ahmed_sulajman
Building Dynamic Library
How to make a dynamic library for iOS and how to upload it to iOS Simulator
!
@ahmed_sulajman
DYLIB What is dynamic library
Dynamic Library
@ahmed_sulajman
DYLIB What is dynamic library Static vs Dynamic
App with Dynamic LibrariesApp with Static Libraries
VS
Source Code
Static Libs
Source Code
Dynamic Libs
References
@ahmed_sulajman
DYLIB What is dynamic library How does it work
DYLD_LIBRARY_PATH
Specify primary directories where in file system dynamic loader
needs to search for dynamic libraries.
DYLD_FALLBACK_LIBRARY_PATH
Specify secondary directories where in file system dynamic loader
needs to search for dynamic libraries before searching in system
directories in case there was nothing found in primary directories.
DYLD_INSERT_LIBRARIES
Specify dynamic libraries which needs to be loaded before primary
libraries.
@ahmed_sulajman
DYLIB What is dynamic library How does it work
DYLD_LIBRARY_PATH
Specify primary directories where in file system dynamic loader
needs to search for dynamic libraries.
DYLD_FALLBACK_LIBRARY_PATH
Specify secondary directories where in file system dynamic loader
needs to search for dynamic libraries before searching in system
directories in case there was nothing found in primary directories.
DYLD_INSERT_LIBRARIES
Specify dynamic libraries which needs to be loaded before primary
libraries.
@ahmed_sulajman
Demo
DYLIB How to build dynamic library
@ahmed_sulajman
What’s next for iOS Simulator plugins
Where to go from here and how you can enhance iOS Simulator plugins even more
!
@ahmed_sulajman
NEXT STEPS What might be improved
Add communication channel
Launch simple server in iOS Simulator plugin to send requests and handle them
!
@ahmed_sulajman
NEXT STEPS What might be improved
Add communication channel
Launch simple server in iOS Simulator plugin to send requests and handle them
!
Swizzle public and private methods
BY using objc_getClass("ClassName") you can get access to privat classes
and get its instance. Explore class-dump to get privat methods
!
@ahmed_sulajman
NEXT STEPS Real use-cases
Add communication channel
Launch simple server in iOS Simulator plugin to send requests and handle them
"
Swizzle public and private methods
BY using objc_getClass("ClassName") you can get access to privat classes
and get its instance. Explore class-dump to get privat methods
"
Capture screenshot with context
Intercept screenshot capture event to put additional information for debugging purpose
!
@ahmed_sulajman
NEXT STEPS Real use-cases
Add communication channel
Launch simple server in iOS Simulator plugin to send requests and handle them
"
Swizzle public and private methods
BY using objc_getClass("ClassName") you can get access to privat classes
and get its instance. Explore class-dump to get privat methods
"
Live UI editing
Select UI components in running application and change their style in the runtime
!
Capture screenshot with context
Intercept screenshot capture event to put additional information for debugging purpose
!
@ahmed_sulajman
Conclusions
simctl is a powerfull iOS Simulator tool
simctl by itself opens a range of possibnoities for interacting with iOS Simulator
☝
Method Swizzling
Using Objective-C runtime you can change implementation of methods you have to access to
☝
Dynamic Libraries as plugins for iOS Simulator
Build and upload dynamic libraries into iOS Simulator to enhamce its functionaly
☝
Hacking iOS Simulator
THANK YOU FOR LISTENING!
Ahmed Sulaiman
ahmed@flawlessapp.io
@ahmed_sulajman
Links
Mach-O Executables: https://www.objc.io/issues/6-build-tools/mach-o-executables/
Attributes in Clang: https://clang.llvm.org/docs/AttributeReference.html
Method Swizzling: https://nshipster.com/method-swizzling/
Objective-C Runtime: https://developer.apple.com/documentation/objectivec/objective-c_runtime
Associated Objects https://nshipster.com/associated-objects/
Overview of Dynamic Libraries https://developer.apple.com/library/archive/documentation/DeveloperTools/
Conceptual/DynamicLibraries/100-Articles/OverviewOfDynamicLibraries.html
DYLD man page https://www.manpagez.com/man/1/dyld/
Dynamic linking on iOS http://ddeville.me/2014/04/dynamic-linking
Static and Dynamic Libraries http://nickdesaulniers.github.io/blog/2016/11/20/static-and-dynamic-libraries/
class-dump tool https://github.com/nygard/class-dump

More Related Content

What's hot

ADF Mobile: 10 Things you don't get from the developers guide
ADF Mobile: 10 Things you don't get from the developers guideADF Mobile: 10 Things you don't get from the developers guide
ADF Mobile: 10 Things you don't get from the developers guideLuc Bors
 
Behat - Drupal South 2018
Behat  - Drupal South 2018Behat  - Drupal South 2018
Behat - Drupal South 2018Berend de Boer
 
Intro to JavaScript
Intro to JavaScriptIntro to JavaScript
Intro to JavaScriptYakov Fain
 
How React Native, Appium and me made each other shine @Frontmania 16-11-2018
How React Native, Appium and me made each other shine @Frontmania 16-11-2018How React Native, Appium and me made each other shine @Frontmania 16-11-2018
How React Native, Appium and me made each other shine @Frontmania 16-11-2018Wim Selles
 
Effectively Testing Services - Burlington Ruby Conf
Effectively Testing Services - Burlington Ruby ConfEffectively Testing Services - Burlington Ruby Conf
Effectively Testing Services - Burlington Ruby Confneal_kemp
 
Automated Testing with Ruby
Automated Testing with RubyAutomated Testing with Ruby
Automated Testing with RubyKeith Pitty
 
Intro To JavaScript Unit Testing - Ran Mizrahi
Intro To JavaScript Unit Testing - Ran MizrahiIntro To JavaScript Unit Testing - Ran Mizrahi
Intro To JavaScript Unit Testing - Ran MizrahiRan Mizrahi
 
Laravel - Website Development in Php Framework.
Laravel - Website Development in Php Framework.Laravel - Website Development in Php Framework.
Laravel - Website Development in Php Framework.SWAAM Tech
 
Hello World on Slim Framework 3.x
Hello World on Slim Framework 3.xHello World on Slim Framework 3.x
Hello World on Slim Framework 3.xRyan Szrama
 
Real Life MAF (2.2) Oracle Open World 2015
Real Life MAF (2.2) Oracle Open World 2015Real Life MAF (2.2) Oracle Open World 2015
Real Life MAF (2.2) Oracle Open World 2015Luc Bors
 
Learn about Eclipse e4 from Lars Vogel at SF-JUG
Learn about Eclipse e4 from Lars Vogel at SF-JUGLearn about Eclipse e4 from Lars Vogel at SF-JUG
Learn about Eclipse e4 from Lars Vogel at SF-JUGMarakana Inc.
 
Understanding Framework Architecture using Eclipse
Understanding Framework Architecture using EclipseUnderstanding Framework Architecture using Eclipse
Understanding Framework Architecture using Eclipseanshunjain
 
PhoneGap: Accessing Device Capabilities
PhoneGap: Accessing Device CapabilitiesPhoneGap: Accessing Device Capabilities
PhoneGap: Accessing Device CapabilitiesIvano Malavolta
 
Ionic으로 모바일앱 만들기 #4
Ionic으로 모바일앱 만들기 #4Ionic으로 모바일앱 만들기 #4
Ionic으로 모바일앱 만들기 #4성일 한
 
RESTful API development in Laravel 4 - Christopher Pecoraro
RESTful API development in Laravel 4 - Christopher PecoraroRESTful API development in Laravel 4 - Christopher Pecoraro
RESTful API development in Laravel 4 - Christopher PecoraroChristopher Pecoraro
 
jQTouch – Mobile Web Apps with HTML, CSS and JavaScript
jQTouch – Mobile Web Apps with HTML, CSS and JavaScriptjQTouch – Mobile Web Apps with HTML, CSS and JavaScript
jQTouch – Mobile Web Apps with HTML, CSS and JavaScriptPhilipp Bosch
 
Seven Versions of One Web Application
Seven Versions of One Web ApplicationSeven Versions of One Web Application
Seven Versions of One Web ApplicationYakov Fain
 

What's hot (20)

ADF Mobile: 10 Things you don't get from the developers guide
ADF Mobile: 10 Things you don't get from the developers guideADF Mobile: 10 Things you don't get from the developers guide
ADF Mobile: 10 Things you don't get from the developers guide
 
Ember - introduction
Ember - introductionEmber - introduction
Ember - introduction
 
jQuery for web development
jQuery for web developmentjQuery for web development
jQuery for web development
 
Behat - Drupal South 2018
Behat  - Drupal South 2018Behat  - Drupal South 2018
Behat - Drupal South 2018
 
Intro to JavaScript
Intro to JavaScriptIntro to JavaScript
Intro to JavaScript
 
How React Native, Appium and me made each other shine @Frontmania 16-11-2018
How React Native, Appium and me made each other shine @Frontmania 16-11-2018How React Native, Appium and me made each other shine @Frontmania 16-11-2018
How React Native, Appium and me made each other shine @Frontmania 16-11-2018
 
ParisJS #10 : RequireJS
ParisJS #10 : RequireJSParisJS #10 : RequireJS
ParisJS #10 : RequireJS
 
Effectively Testing Services - Burlington Ruby Conf
Effectively Testing Services - Burlington Ruby ConfEffectively Testing Services - Burlington Ruby Conf
Effectively Testing Services - Burlington Ruby Conf
 
Automated Testing with Ruby
Automated Testing with RubyAutomated Testing with Ruby
Automated Testing with Ruby
 
Intro To JavaScript Unit Testing - Ran Mizrahi
Intro To JavaScript Unit Testing - Ran MizrahiIntro To JavaScript Unit Testing - Ran Mizrahi
Intro To JavaScript Unit Testing - Ran Mizrahi
 
Laravel - Website Development in Php Framework.
Laravel - Website Development in Php Framework.Laravel - Website Development in Php Framework.
Laravel - Website Development in Php Framework.
 
Hello World on Slim Framework 3.x
Hello World on Slim Framework 3.xHello World on Slim Framework 3.x
Hello World on Slim Framework 3.x
 
Real Life MAF (2.2) Oracle Open World 2015
Real Life MAF (2.2) Oracle Open World 2015Real Life MAF (2.2) Oracle Open World 2015
Real Life MAF (2.2) Oracle Open World 2015
 
Learn about Eclipse e4 from Lars Vogel at SF-JUG
Learn about Eclipse e4 from Lars Vogel at SF-JUGLearn about Eclipse e4 from Lars Vogel at SF-JUG
Learn about Eclipse e4 from Lars Vogel at SF-JUG
 
Understanding Framework Architecture using Eclipse
Understanding Framework Architecture using EclipseUnderstanding Framework Architecture using Eclipse
Understanding Framework Architecture using Eclipse
 
PhoneGap: Accessing Device Capabilities
PhoneGap: Accessing Device CapabilitiesPhoneGap: Accessing Device Capabilities
PhoneGap: Accessing Device Capabilities
 
Ionic으로 모바일앱 만들기 #4
Ionic으로 모바일앱 만들기 #4Ionic으로 모바일앱 만들기 #4
Ionic으로 모바일앱 만들기 #4
 
RESTful API development in Laravel 4 - Christopher Pecoraro
RESTful API development in Laravel 4 - Christopher PecoraroRESTful API development in Laravel 4 - Christopher Pecoraro
RESTful API development in Laravel 4 - Christopher Pecoraro
 
jQTouch – Mobile Web Apps with HTML, CSS and JavaScript
jQTouch – Mobile Web Apps with HTML, CSS and JavaScriptjQTouch – Mobile Web Apps with HTML, CSS and JavaScript
jQTouch – Mobile Web Apps with HTML, CSS and JavaScript
 
Seven Versions of One Web Application
Seven Versions of One Web ApplicationSeven Versions of One Web Application
Seven Versions of One Web Application
 

Similar to Hacking iOS Simulator: writing your own plugins for Simulator

The Basic Concept Of IOC
The Basic Concept Of IOCThe Basic Concept Of IOC
The Basic Concept Of IOCCarl Lu
 
Setting Apple's UI Automation Free with Appium
Setting Apple's UI Automation Free with AppiumSetting Apple's UI Automation Free with Appium
Setting Apple's UI Automation Free with Appiummobiletestsummit
 
Web technologies-course 12.pptx
Web technologies-course 12.pptxWeb technologies-course 12.pptx
Web technologies-course 12.pptxStefan Oprea
 
Ansible Automation Best Practices From Startups to Enterprises - Minnebar 12
Ansible Automation Best Practices From Startups to Enterprises - Minnebar 12Ansible Automation Best Practices From Startups to Enterprises - Minnebar 12
Ansible Automation Best Practices From Startups to Enterprises - Minnebar 12Keith Resar
 
CodeIgniter Ant Scripting
CodeIgniter Ant ScriptingCodeIgniter Ant Scripting
CodeIgniter Ant ScriptingAlbert Rosa
 
Setting UIAutomation free with Appium
Setting UIAutomation free with AppiumSetting UIAutomation free with Appium
Setting UIAutomation free with AppiumDan Cuellar
 
Getting Started with Ansible - Jake.pdf
Getting Started with Ansible - Jake.pdfGetting Started with Ansible - Jake.pdf
Getting Started with Ansible - Jake.pdfssuserd254491
 
Scott Mason: Enhancing the User Interface Using Titanium Modules
Scott Mason: Enhancing the User Interface Using Titanium ModulesScott Mason: Enhancing the User Interface Using Titanium Modules
Scott Mason: Enhancing the User Interface Using Titanium ModulesAxway Appcelerator
 
Code camp 2011 Getting Started with IOS, Una Daly
Code camp 2011 Getting Started with IOS, Una DalyCode camp 2011 Getting Started with IOS, Una Daly
Code camp 2011 Getting Started with IOS, Una DalyUna Daly
 
SpringOne Platform recap 정윤진
SpringOne Platform recap 정윤진SpringOne Platform recap 정윤진
SpringOne Platform recap 정윤진VMware Tanzu Korea
 
WebNet Conference 2012 - Designing complex applications using html5 and knock...
WebNet Conference 2012 - Designing complex applications using html5 and knock...WebNet Conference 2012 - Designing complex applications using html5 and knock...
WebNet Conference 2012 - Designing complex applications using html5 and knock...Fabio Franzini
 
Flask Introduction - Python Meetup
Flask Introduction - Python MeetupFlask Introduction - Python Meetup
Flask Introduction - Python MeetupAreski Belaid
 
Selenium & PHPUnit made easy with Steward (Berlin, April 2017)
Selenium & PHPUnit made easy with Steward (Berlin, April 2017)Selenium & PHPUnit made easy with Steward (Berlin, April 2017)
Selenium & PHPUnit made easy with Steward (Berlin, April 2017)Ondřej Machulda
 

Similar to Hacking iOS Simulator: writing your own plugins for Simulator (20)

The Basic Concept Of IOC
The Basic Concept Of IOCThe Basic Concept Of IOC
The Basic Concept Of IOC
 
Basic of Applet
Basic of AppletBasic of Applet
Basic of Applet
 
Setting Apple's UI Automation Free with Appium
Setting Apple's UI Automation Free with AppiumSetting Apple's UI Automation Free with Appium
Setting Apple's UI Automation Free with Appium
 
Web technologies-course 12.pptx
Web technologies-course 12.pptxWeb technologies-course 12.pptx
Web technologies-course 12.pptx
 
Ansible Automation Best Practices From Startups to Enterprises - Minnebar 12
Ansible Automation Best Practices From Startups to Enterprises - Minnebar 12Ansible Automation Best Practices From Startups to Enterprises - Minnebar 12
Ansible Automation Best Practices From Startups to Enterprises - Minnebar 12
 
CodeIgniter Ant Scripting
CodeIgniter Ant ScriptingCodeIgniter Ant Scripting
CodeIgniter Ant Scripting
 
Drupal intro for Symfony developers
Drupal intro for Symfony developersDrupal intro for Symfony developers
Drupal intro for Symfony developers
 
Spring boot
Spring bootSpring boot
Spring boot
 
Setting UIAutomation free with Appium
Setting UIAutomation free with AppiumSetting UIAutomation free with Appium
Setting UIAutomation free with Appium
 
Play framework
Play frameworkPlay framework
Play framework
 
Cypress.docx
Cypress.docxCypress.docx
Cypress.docx
 
Getting Started with Ansible - Jake.pdf
Getting Started with Ansible - Jake.pdfGetting Started with Ansible - Jake.pdf
Getting Started with Ansible - Jake.pdf
 
Demystifying Maven
Demystifying MavenDemystifying Maven
Demystifying Maven
 
Scott Mason: Enhancing the User Interface Using Titanium Modules
Scott Mason: Enhancing the User Interface Using Titanium ModulesScott Mason: Enhancing the User Interface Using Titanium Modules
Scott Mason: Enhancing the User Interface Using Titanium Modules
 
Code camp 2011 Getting Started with IOS, Una Daly
Code camp 2011 Getting Started with IOS, Una DalyCode camp 2011 Getting Started with IOS, Una Daly
Code camp 2011 Getting Started with IOS, Una Daly
 
SpringOne Platform recap 정윤진
SpringOne Platform recap 정윤진SpringOne Platform recap 정윤진
SpringOne Platform recap 정윤진
 
Intro to appcelerator
Intro to appceleratorIntro to appcelerator
Intro to appcelerator
 
WebNet Conference 2012 - Designing complex applications using html5 and knock...
WebNet Conference 2012 - Designing complex applications using html5 and knock...WebNet Conference 2012 - Designing complex applications using html5 and knock...
WebNet Conference 2012 - Designing complex applications using html5 and knock...
 
Flask Introduction - Python Meetup
Flask Introduction - Python MeetupFlask Introduction - Python Meetup
Flask Introduction - Python Meetup
 
Selenium & PHPUnit made easy with Steward (Berlin, April 2017)
Selenium & PHPUnit made easy with Steward (Berlin, April 2017)Selenium & PHPUnit made easy with Steward (Berlin, April 2017)
Selenium & PHPUnit made easy with Steward (Berlin, April 2017)
 

Recently uploaded

HR Software Buyers Guide in 2024 - HRSoftware.com
HR Software Buyers Guide in 2024 - HRSoftware.comHR Software Buyers Guide in 2024 - HRSoftware.com
HR Software Buyers Guide in 2024 - HRSoftware.comFatema Valibhai
 
Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...
Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...
Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...stazi3110
 
A Secure and Reliable Document Management System is Essential.docx
A Secure and Reliable Document Management System is Essential.docxA Secure and Reliable Document Management System is Essential.docx
A Secure and Reliable Document Management System is Essential.docxComplianceQuest1
 
Professional Resume Template for Software Developers
Professional Resume Template for Software DevelopersProfessional Resume Template for Software Developers
Professional Resume Template for Software DevelopersVinodh Ram
 
Advancing Engineering with AI through the Next Generation of Strategic Projec...
Advancing Engineering with AI through the Next Generation of Strategic Projec...Advancing Engineering with AI through the Next Generation of Strategic Projec...
Advancing Engineering with AI through the Next Generation of Strategic Projec...OnePlan Solutions
 
Short Story: Unveiling the Reasoning Abilities of Large Language Models by Ke...
Short Story: Unveiling the Reasoning Abilities of Large Language Models by Ke...Short Story: Unveiling the Reasoning Abilities of Large Language Models by Ke...
Short Story: Unveiling the Reasoning Abilities of Large Language Models by Ke...kellynguyen01
 
Project Based Learning (A.I).pptx detail explanation
Project Based Learning (A.I).pptx detail explanationProject Based Learning (A.I).pptx detail explanation
Project Based Learning (A.I).pptx detail explanationkaushalgiri8080
 
Cloud Management Software Platforms: OpenStack
Cloud Management Software Platforms: OpenStackCloud Management Software Platforms: OpenStack
Cloud Management Software Platforms: OpenStackVICTOR MAESTRE RAMIREZ
 
Test Automation Strategy for Frontend and Backend
Test Automation Strategy for Frontend and BackendTest Automation Strategy for Frontend and Backend
Test Automation Strategy for Frontend and BackendArshad QA
 
Unveiling the Tech Salsa of LAMs with Janus in Real-Time Applications
Unveiling the Tech Salsa of LAMs with Janus in Real-Time ApplicationsUnveiling the Tech Salsa of LAMs with Janus in Real-Time Applications
Unveiling the Tech Salsa of LAMs with Janus in Real-Time ApplicationsAlberto González Trastoy
 
Building Real-Time Data Pipelines: Stream & Batch Processing workshop Slide
Building Real-Time Data Pipelines: Stream & Batch Processing workshop SlideBuilding Real-Time Data Pipelines: Stream & Batch Processing workshop Slide
Building Real-Time Data Pipelines: Stream & Batch Processing workshop SlideChristina Lin
 
Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...
Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...
Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...harshavardhanraghave
 
How To Use Server-Side Rendering with Nuxt.js
How To Use Server-Side Rendering with Nuxt.jsHow To Use Server-Side Rendering with Nuxt.js
How To Use Server-Side Rendering with Nuxt.jsAndolasoft Inc
 
Unlocking the Future of AI Agents with Large Language Models
Unlocking the Future of AI Agents with Large Language ModelsUnlocking the Future of AI Agents with Large Language Models
Unlocking the Future of AI Agents with Large Language Modelsaagamshah0812
 
Active Directory Penetration Testing, cionsystems.com.pdf
Active Directory Penetration Testing, cionsystems.com.pdfActive Directory Penetration Testing, cionsystems.com.pdf
Active Directory Penetration Testing, cionsystems.com.pdfCionsystems
 
Tech Tuesday-Harness the Power of Effective Resource Planning with OnePlan’s ...
Tech Tuesday-Harness the Power of Effective Resource Planning with OnePlan’s ...Tech Tuesday-Harness the Power of Effective Resource Planning with OnePlan’s ...
Tech Tuesday-Harness the Power of Effective Resource Planning with OnePlan’s ...OnePlan Solutions
 
SyndBuddy AI 2k Review 2024: Revolutionizing Content Syndication with AI
SyndBuddy AI 2k Review 2024: Revolutionizing Content Syndication with AISyndBuddy AI 2k Review 2024: Revolutionizing Content Syndication with AI
SyndBuddy AI 2k Review 2024: Revolutionizing Content Syndication with AIABDERRAOUF MEHENNI
 
Right Money Management App For Your Financial Goals
Right Money Management App For Your Financial GoalsRight Money Management App For Your Financial Goals
Right Money Management App For Your Financial GoalsJhone kinadey
 
CALL ON ➥8923113531 🔝Call Girls Kakori Lucknow best sexual service Online ☂️
CALL ON ➥8923113531 🔝Call Girls Kakori Lucknow best sexual service Online  ☂️CALL ON ➥8923113531 🔝Call Girls Kakori Lucknow best sexual service Online  ☂️
CALL ON ➥8923113531 🔝Call Girls Kakori Lucknow best sexual service Online ☂️anilsa9823
 

Recently uploaded (20)

HR Software Buyers Guide in 2024 - HRSoftware.com
HR Software Buyers Guide in 2024 - HRSoftware.comHR Software Buyers Guide in 2024 - HRSoftware.com
HR Software Buyers Guide in 2024 - HRSoftware.com
 
Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...
Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...
Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...
 
A Secure and Reliable Document Management System is Essential.docx
A Secure and Reliable Document Management System is Essential.docxA Secure and Reliable Document Management System is Essential.docx
A Secure and Reliable Document Management System is Essential.docx
 
Professional Resume Template for Software Developers
Professional Resume Template for Software DevelopersProfessional Resume Template for Software Developers
Professional Resume Template for Software Developers
 
Advancing Engineering with AI through the Next Generation of Strategic Projec...
Advancing Engineering with AI through the Next Generation of Strategic Projec...Advancing Engineering with AI through the Next Generation of Strategic Projec...
Advancing Engineering with AI through the Next Generation of Strategic Projec...
 
Short Story: Unveiling the Reasoning Abilities of Large Language Models by Ke...
Short Story: Unveiling the Reasoning Abilities of Large Language Models by Ke...Short Story: Unveiling the Reasoning Abilities of Large Language Models by Ke...
Short Story: Unveiling the Reasoning Abilities of Large Language Models by Ke...
 
Call Girls In Mukherjee Nagar 📱 9999965857 🤩 Delhi 🫦 HOT AND SEXY VVIP 🍎 SE...
Call Girls In Mukherjee Nagar 📱  9999965857  🤩 Delhi 🫦 HOT AND SEXY VVIP 🍎 SE...Call Girls In Mukherjee Nagar 📱  9999965857  🤩 Delhi 🫦 HOT AND SEXY VVIP 🍎 SE...
Call Girls In Mukherjee Nagar 📱 9999965857 🤩 Delhi 🫦 HOT AND SEXY VVIP 🍎 SE...
 
Project Based Learning (A.I).pptx detail explanation
Project Based Learning (A.I).pptx detail explanationProject Based Learning (A.I).pptx detail explanation
Project Based Learning (A.I).pptx detail explanation
 
Cloud Management Software Platforms: OpenStack
Cloud Management Software Platforms: OpenStackCloud Management Software Platforms: OpenStack
Cloud Management Software Platforms: OpenStack
 
Test Automation Strategy for Frontend and Backend
Test Automation Strategy for Frontend and BackendTest Automation Strategy for Frontend and Backend
Test Automation Strategy for Frontend and Backend
 
Unveiling the Tech Salsa of LAMs with Janus in Real-Time Applications
Unveiling the Tech Salsa of LAMs with Janus in Real-Time ApplicationsUnveiling the Tech Salsa of LAMs with Janus in Real-Time Applications
Unveiling the Tech Salsa of LAMs with Janus in Real-Time Applications
 
Building Real-Time Data Pipelines: Stream & Batch Processing workshop Slide
Building Real-Time Data Pipelines: Stream & Batch Processing workshop SlideBuilding Real-Time Data Pipelines: Stream & Batch Processing workshop Slide
Building Real-Time Data Pipelines: Stream & Batch Processing workshop Slide
 
Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...
Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...
Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...
 
How To Use Server-Side Rendering with Nuxt.js
How To Use Server-Side Rendering with Nuxt.jsHow To Use Server-Side Rendering with Nuxt.js
How To Use Server-Side Rendering with Nuxt.js
 
Unlocking the Future of AI Agents with Large Language Models
Unlocking the Future of AI Agents with Large Language ModelsUnlocking the Future of AI Agents with Large Language Models
Unlocking the Future of AI Agents with Large Language Models
 
Active Directory Penetration Testing, cionsystems.com.pdf
Active Directory Penetration Testing, cionsystems.com.pdfActive Directory Penetration Testing, cionsystems.com.pdf
Active Directory Penetration Testing, cionsystems.com.pdf
 
Tech Tuesday-Harness the Power of Effective Resource Planning with OnePlan’s ...
Tech Tuesday-Harness the Power of Effective Resource Planning with OnePlan’s ...Tech Tuesday-Harness the Power of Effective Resource Planning with OnePlan’s ...
Tech Tuesday-Harness the Power of Effective Resource Planning with OnePlan’s ...
 
SyndBuddy AI 2k Review 2024: Revolutionizing Content Syndication with AI
SyndBuddy AI 2k Review 2024: Revolutionizing Content Syndication with AISyndBuddy AI 2k Review 2024: Revolutionizing Content Syndication with AI
SyndBuddy AI 2k Review 2024: Revolutionizing Content Syndication with AI
 
Right Money Management App For Your Financial Goals
Right Money Management App For Your Financial GoalsRight Money Management App For Your Financial Goals
Right Money Management App For Your Financial Goals
 
CALL ON ➥8923113531 🔝Call Girls Kakori Lucknow best sexual service Online ☂️
CALL ON ➥8923113531 🔝Call Girls Kakori Lucknow best sexual service Online  ☂️CALL ON ➥8923113531 🔝Call Girls Kakori Lucknow best sexual service Online  ☂️
CALL ON ➥8923113531 🔝Call Girls Kakori Lucknow best sexual service Online ☂️
 

Hacking iOS Simulator: writing your own plugins for Simulator

  • 1. Hacking iOS Simulator Writing your own plugin for Simulator, enhancing development workflow INTRODUCING @ahmed_sulajman
  • 2. Ahmed Sulaiman Co-founder of https://flawlessapp.io & Engineer & UI Designer ahmed@flawlessapp.io @ahmed_sulajman HELLO @ahmed_sulajman
  • 3. HELLO Our Products @ahmed_sulajman Reduce App Awesome Design Tools Design Tools Weekly
  • 4. HELLO Our Products DESIGN REAL APP iOS Simulator @ahmed_sulajman
  • 5. SIMULATOR INTRO Loading custom code into iOS Simulator And how this will enhance your developmnet worflow @ahmed_sulajman !
  • 6. SIMULATOR INTRO Current state of Simulator and Xcode @ahmed_sulajman
  • 7. @ahmed_sulajman SIMULATOR INTRO New in Simulator since Xcode 9 Launch multiple iOS Simulator Resize iOS Simulator like regular window Full-Screen mode along with Xcode
  • 8. @ahmed_sulajman SIMULATOR INTRO Why Simulator is important 30% 30% 30% 10% ! " # Testing in iOS Simulator during development Actual Development Communication Meetings Compiling & Building…
  • 9. @ahmed_sulajman AGENDA Intro to simctl What is simctl and what it allows you to do now ! Method Swizzling How you can change implementation of the method you have no access to " Building Dynamic Library How to make a dynamic library for iOS and how to upload it to iOS Simulator # What’s next for iOS Simulator plugins Where to go from here and how you can enhance iOS Simulator plugins even more $ simctl
  • 10. @ahmed_sulajman Intro to simctl What is simctl and what it allows you to do now !
  • 11. @ahmed_sulajman SIMCTL What is simctl Simulator ≠ Emulator
  • 12. @ahmed_sulajman SIMCTL What is simctl Simulator ≠ Emulator
  • 13. @ahmed_sulajman SIMCTL What is simctl > xcrun simctl Command line utility to control the Simulator
  • 14. @ahmed_sulajman SIMCTL What simctl can do devices list > xcrun simctl list -j [devices|devicetypes|runtimes|pairs] List available devices, device types, runtimes, or device pairs
  • 15. @ahmed_sulajman SIMCTL > xcrun simctl list -j [devices|devicetypes|runtimes|pairs] > xcrun simctl list -j devices $someSearchTerm What simctl can do devices list
  • 16. @ahmed_sulajman SIMCTL > xcrun simctl list -j [devices|devicetypes|runtimes|pairs] { "devices" : { "com.apple.CoreSimulator.SimRuntime.iOS-12-2" : [ { "availability" : "(available)", "state" : "Shutdown", "isAvailable" : true, "name" : "iPad Air (3rd generation)", "udid" : "18D30337-C8E3-43AE-8765-5D935D9408BF", "availabilityError" : "" } ] } } What simctl can do devices list
  • 17. @ahmed_sulajman SIMCTL > xcrun simctl boot <device> Boot a specific device > xcrun simctl shutdown <device> | all Shutdown a specific device or all devices What simctl can do boot & shutdown device
  • 18. @ahmed_sulajman SIMCTL > xcrun simctl io booted recordVideo --type=mp4 <file path> Records the display to the specified file or url (use "-" for stdout). What simctl can do video recording
  • 19. @ahmed_sulajman SIMCTL > xcrun simctl spawn Spawn a process by executing a given executable on a device. ! What simctl can do spawn process
  • 20. @ahmed_sulajman SIMCTL > xcrun simctl spawn syslog leaks malloc_history ... heap notifyutil logstringdups iOS Simulator Tools and utils in iOS Runtime macOS Environment Launching process from macOS inside Simulator spawn What simctl can do spawn process
  • 21. @ahmed_sulajman SIMCTL > xcrun simctl spawn Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/ Library/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/ Resources/RuntimeRoot/usr/... Collect system log into a log archive, watch live system logs log! Search through a process for leaked memory leaks! Displays/aggregates allocation histories in a process malloc_history! What simctl can do spawn process
  • 22. @ahmed_sulajman SIMCTL > xcrun simctl spawn booted <tool name> What simctl can do spawn process
  • 23. @ahmed_sulajman SIMCTL > xcrun simctl spawn booted <tool name> syslog leaks malloc_history ... heap notifyutil launchctl logstringdups launchd spawn What simctl can do spawn process
  • 25. @ahmed_sulajman SIMCTL Conclusions simctl is the main interface to iOS Simulatorsimctl via simctl interact with Simulator and explore its process as it isn’t an Emulator ! spawn tool allows you to launch internal toolsspawn By typing exact executable you can spawn a process in iOS Simulator ! Using launchctl allows you to manage serviceslaunchctl spawn allows you to launch internal tools inside iOS Simulator !
  • 26. @ahmed_sulajman Method Swizzling How you can change implementation of the method you have no access to !
  • 28. @ahmed_sulajman SWIZZLING How does it work Objective-C Runtime The Objective-C runtime is a runtime library that provides support for the dynamic properties of the Objective-C language, and as such is linked to by all Objective-C apps #import <objc/runtime.h>
  • 29. @ahmed_sulajman SWIZZLING How does it work class dispatch table Objetive-C Class Dispatch Table
  • 30. @ahmed_sulajman SWIZZLING How does it work class dispatch table Dispatch TableObjetive-C Class Method Selector Implementation Method Selector Implementation Method Selector Implementation
  • 31. @ahmed_sulajman SWIZZLING How does it work class dispatch table @interface HelloRuntime: NSObject - (void)hello:(NSString *)text; @end @implementation HelloRuntime - (void)hello:(NSString *)text { NSLog(@"Hello, %@!", text); } @end
  • 32. @ahmed_sulajman SWIZZLING How does it work Method: -[hello:] Selector: @selector(hello:) class dispatch table NSLog(@"Hello, %@!", text); Implementation
  • 33. @ahmed_sulajman SWIZZLING How does it work replace method implementation NSLog(@"Hello, %@!", text); ImplementationAlt Implementation Method: -[hello:] Method: -[alt_hello:] Selector: @selector(hello:) Selector: @selector(alt_hello:)
  • 34. @ahmed_sulajman SWIZZLING How does it work replace method implementation Alt Implementation NSLog(@"Hello, %@!", text); Implementation Method: -[hello:] Method: -[alt_hello:] Selector: @selector(hello:) Selector: @selector(alt_hello:)
  • 35. @ahmed_sulajman - (void)alt_hello:(NSString *)text { [self alt_hello:@"Cocoaheads Kyiv"]; // DO not call original -[hello:] here // it will lead to infinite loop // [self hello:@"Cocoaheads Kyiv"]; } SWIZZLING How does it work replace method implementation
  • 36. @ahmed_sulajman SWIZZLING How to implement it How-to Swizzle + (void)load { }
  • 37. @ahmed_sulajman SWIZZLING How to implement it How-to Swizzle + (void)load { static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ }); }
  • 38. @ahmed_sulajman SWIZZLING How to implement it + (void)load { static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ Class class = [self class]; SEL originalSelector = @selector(hello:); SEL swizzledSelector = @selector(alt_hello:); Method originalMethod = class_getInstanceMethod(class, originalSeletor); Method swizzledMethod = class_getInstanceMethod(class, swizzledSelector); method_exchangeImplementations(originalMethod, swizzledMethod); }); } How-to Swizzle
  • 39. @ahmed_sulajman SWIZZLING How to implement it + (void)load { static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ Class class = [self class]; SEL originalSelector = @selector(hello:); SEL swizzledSelector = @selector(alt_hello:); Method originalMethod = class_getInstanceMethod(class, originalSeletor); Method swizzledMethod = class_getInstanceMethod(class, swizzledSelector); method_exchangeImplementations(originalMethod, swizzledMethod); }); } How-to Swizzle method_exchangeImplementations( ) Use method_exchangeImplementations( ) with cautions. Better explore class_addMethod( ) and class_replaceMethod( ) ⚠
  • 40. @ahmed_sulajman SWIZZLING Conclusions Every class has dispatch table It allows the class to understand which selector corresponds to which method ! Change dispatch table in runtime Objective-C Runtime allow us to change dispatch table and assign different IMP to SEL ! Pay a!ention when doing swizzling Use +[load] and dispatch_once to ensure your code runs once when the class has been loaded !
  • 41. @ahmed_sulajman Building Dynamic Library How to make a dynamic library for iOS and how to upload it to iOS Simulator !
  • 42. @ahmed_sulajman DYLIB What is dynamic library Dynamic Library
  • 43. @ahmed_sulajman DYLIB What is dynamic library Static vs Dynamic App with Dynamic LibrariesApp with Static Libraries VS Source Code Static Libs Source Code Dynamic Libs References
  • 44. @ahmed_sulajman DYLIB What is dynamic library How does it work DYLD_LIBRARY_PATH Specify primary directories where in file system dynamic loader needs to search for dynamic libraries. DYLD_FALLBACK_LIBRARY_PATH Specify secondary directories where in file system dynamic loader needs to search for dynamic libraries before searching in system directories in case there was nothing found in primary directories. DYLD_INSERT_LIBRARIES Specify dynamic libraries which needs to be loaded before primary libraries.
  • 45. @ahmed_sulajman DYLIB What is dynamic library How does it work DYLD_LIBRARY_PATH Specify primary directories where in file system dynamic loader needs to search for dynamic libraries. DYLD_FALLBACK_LIBRARY_PATH Specify secondary directories where in file system dynamic loader needs to search for dynamic libraries before searching in system directories in case there was nothing found in primary directories. DYLD_INSERT_LIBRARIES Specify dynamic libraries which needs to be loaded before primary libraries.
  • 46. @ahmed_sulajman Demo DYLIB How to build dynamic library
  • 47. @ahmed_sulajman What’s next for iOS Simulator plugins Where to go from here and how you can enhance iOS Simulator plugins even more !
  • 48. @ahmed_sulajman NEXT STEPS What might be improved Add communication channel Launch simple server in iOS Simulator plugin to send requests and handle them !
  • 49. @ahmed_sulajman NEXT STEPS What might be improved Add communication channel Launch simple server in iOS Simulator plugin to send requests and handle them ! Swizzle public and private methods BY using objc_getClass("ClassName") you can get access to privat classes and get its instance. Explore class-dump to get privat methods !
  • 50. @ahmed_sulajman NEXT STEPS Real use-cases Add communication channel Launch simple server in iOS Simulator plugin to send requests and handle them " Swizzle public and private methods BY using objc_getClass("ClassName") you can get access to privat classes and get its instance. Explore class-dump to get privat methods " Capture screenshot with context Intercept screenshot capture event to put additional information for debugging purpose !
  • 51. @ahmed_sulajman NEXT STEPS Real use-cases Add communication channel Launch simple server in iOS Simulator plugin to send requests and handle them " Swizzle public and private methods BY using objc_getClass("ClassName") you can get access to privat classes and get its instance. Explore class-dump to get privat methods " Live UI editing Select UI components in running application and change their style in the runtime ! Capture screenshot with context Intercept screenshot capture event to put additional information for debugging purpose !
  • 52. @ahmed_sulajman Conclusions simctl is a powerfull iOS Simulator tool simctl by itself opens a range of possibnoities for interacting with iOS Simulator ☝ Method Swizzling Using Objective-C runtime you can change implementation of methods you have to access to ☝ Dynamic Libraries as plugins for iOS Simulator Build and upload dynamic libraries into iOS Simulator to enhamce its functionaly ☝
  • 53. Hacking iOS Simulator THANK YOU FOR LISTENING! Ahmed Sulaiman ahmed@flawlessapp.io @ahmed_sulajman
  • 54. Links Mach-O Executables: https://www.objc.io/issues/6-build-tools/mach-o-executables/ Attributes in Clang: https://clang.llvm.org/docs/AttributeReference.html Method Swizzling: https://nshipster.com/method-swizzling/ Objective-C Runtime: https://developer.apple.com/documentation/objectivec/objective-c_runtime Associated Objects https://nshipster.com/associated-objects/ Overview of Dynamic Libraries https://developer.apple.com/library/archive/documentation/DeveloperTools/ Conceptual/DynamicLibraries/100-Articles/OverviewOfDynamicLibraries.html DYLD man page https://www.manpagez.com/man/1/dyld/ Dynamic linking on iOS http://ddeville.me/2014/04/dynamic-linking Static and Dynamic Libraries http://nickdesaulniers.github.io/blog/2016/11/20/static-and-dynamic-libraries/ class-dump tool https://github.com/nygard/class-dump