![Page 1: Lviv MDDay 2014. Андріан Буданцов “Внутрішній світ iOS додатків”](https://reader030.vdocuments.pub/reader030/viewer/2022020116/5594bf9f1a28aba3748b463c/html5/thumbnails/1.jpg)
iOS Apps InternalsАндриан Буданцов
“Внутрішній світ iOS додатків”
![Page 2: Lviv MDDay 2014. Андріан Буданцов “Внутрішній світ iOS додатків”](https://reader030.vdocuments.pub/reader030/viewer/2022020116/5594bf9f1a28aba3748b463c/html5/thumbnails/2.jpg)
iOS
Unix-based операционная система
Источник: http://www.levenez.com/unix/
![Page 3: Lviv MDDay 2014. Андріан Буданцов “Внутрішній світ iOS додатків”](https://reader030.vdocuments.pub/reader030/viewer/2022020116/5594bf9f1a28aba3748b463c/html5/thumbnails/3.jpg)
iOS Слои
Источник: iOS Technology Overview
![Page 4: Lviv MDDay 2014. Андріан Буданцов “Внутрішній світ iOS додатків”](https://reader030.vdocuments.pub/reader030/viewer/2022020116/5594bf9f1a28aba3748b463c/html5/thumbnails/4.jpg)
iOS : Core OS
Библиотеки (Frameworks)
libSystem
Системные вызовы Darwin и Mach
Ядро
Hardware
![Page 5: Lviv MDDay 2014. Андріан Буданцов “Внутрішній світ iOS додатків”](https://reader030.vdocuments.pub/reader030/viewer/2022020116/5594bf9f1a28aba3748b463c/html5/thumbnails/5.jpg)
Hello World ?
![Page 6: Lviv MDDay 2014. Андріан Буданцов “Внутрішній світ iOS додатків”](https://reader030.vdocuments.pub/reader030/viewer/2022020116/5594bf9f1a28aba3748b463c/html5/thumbnails/6.jpg)
Hello World !
![Page 7: Lviv MDDay 2014. Андріан Буданцов “Внутрішній світ iOS додатків”](https://reader030.vdocuments.pub/reader030/viewer/2022020116/5594bf9f1a28aba3748b463c/html5/thumbnails/7.jpg)
Структура iOS приложения
Application Bundleпоявились в NextSTEP (1988)
Директория .app содержит:Contents (нет в iOS)
Info.plistbinaryPkgInfoResourceRules.plist
![Page 8: Lviv MDDay 2014. Андріан Буданцов “Внутрішній світ iOS додатків”](https://reader030.vdocuments.pub/reader030/viewer/2022020116/5594bf9f1a28aba3748b463c/html5/thumbnails/8.jpg)
Структура iOS приложения
Default.png
Icon.png
ресурсы
информацию о подписи
![Page 9: Lviv MDDay 2014. Андріан Буданцов “Внутрішній світ iOS додатків”](https://reader030.vdocuments.pub/reader030/viewer/2022020116/5594bf9f1a28aba3748b463c/html5/thumbnails/9.jpg)
Info.plist
Property List формат
Сохраняетdictionary, arraydata, number, boolean, string
ФорматыOpen Step FormatXMLBinary
![Page 10: Lviv MDDay 2014. Андріан Буданцов “Внутрішній світ iOS додатків”](https://reader030.vdocuments.pub/reader030/viewer/2022020116/5594bf9f1a28aba3748b463c/html5/thumbnails/10.jpg)
Info.plist
![Page 11: Lviv MDDay 2014. Андріан Буданцов “Внутрішній світ iOS додатків”](https://reader030.vdocuments.pub/reader030/viewer/2022020116/5594bf9f1a28aba3748b463c/html5/thumbnails/11.jpg)
Info.plist
![Page 12: Lviv MDDay 2014. Андріан Буданцов “Внутрішній світ iOS додатків”](https://reader030.vdocuments.pub/reader030/viewer/2022020116/5594bf9f1a28aba3748b463c/html5/thumbnails/12.jpg)
PkgInfo
Mac OS 9
8 байт4 байта package type4 байта application signature
"AAPL????"
![Page 13: Lviv MDDay 2014. Андріан Буданцов “Внутрішній світ iOS додатків”](https://reader030.vdocuments.pub/reader030/viewer/2022020116/5594bf9f1a28aba3748b463c/html5/thumbnails/13.jpg)
ResourceRules.plist
фильтрует изменяемые ресурсы дляcodesign
OS X 10.9.5 и Yosemite Developer Preview 5Do not use the --resource-rules flag orResourceRules.plist. They have beenobsoleted and will be rejected.
![Page 14: Lviv MDDay 2014. Андріан Буданцов “Внутрішній світ iOS додатків”](https://reader030.vdocuments.pub/reader030/viewer/2022020116/5594bf9f1a28aba3748b463c/html5/thumbnails/14.jpg)
Распространение
Zip файл c расширением .ipa
./Payload/
codesign:embedded.mobileprovision
![Page 15: Lviv MDDay 2014. Андріан Буданцов “Внутрішній світ iOS додатків”](https://reader030.vdocuments.pub/reader030/viewer/2022020116/5594bf9f1a28aba3748b463c/html5/thumbnails/15.jpg)
GUI iOS App
![Page 16: Lviv MDDay 2014. Андріан Буданцов “Внутрішній світ iOS додатків”](https://reader030.vdocuments.pub/reader030/viewer/2022020116/5594bf9f1a28aba3748b463c/html5/thumbnails/16.jpg)
UIApplicationMain
настраивает GCD-очереди (threads)
настраивает связь с "внешним миром"GSEventBackBoardServices
запускает RunLoop
![Page 17: Lviv MDDay 2014. Андріан Буданцов “Внутрішній світ iOS додатків”](https://reader030.vdocuments.pub/reader030/viewer/2022020116/5594bf9f1a28aba3748b463c/html5/thumbnails/17.jpg)
UIApplicationMain
читает Info.plist
создает классы(саб-классы) Cococa TouchUIApplicationUIApplicationDelegate
![Page 18: Lviv MDDay 2014. Андріан Буданцов “Внутрішній світ iOS додатків”](https://reader030.vdocuments.pub/reader030/viewer/2022020116/5594bf9f1a28aba3748b463c/html5/thumbnails/18.jpg)
Grand Central Dispatch
Open Source библиотка libdispatch
пул потоков
запускуют задачу на одном из рабочихthreads
задача: функция или блок
![Page 19: Lviv MDDay 2014. Андріан Буданцов “Внутрішній світ iOS додатків”](https://reader030.vdocuments.pub/reader030/viewer/2022020116/5594bf9f1a28aba3748b463c/html5/thumbnails/19.jpg)
Grant Central Dispatch
приоритеты
#define DISPATCH_QUEUE_PRIORITY_HIGH 2 #define DISPATCH_QUEUE_PRIORITY_DEFAULT 0 #define DISPATCH_QUEUE_PRIORITY_LOW (-2) #define DISPATCH_QUEUE_PRIORITY_BACKGROUND INT16_MIN
выполнение
typedef void (*dispatch_function_t)(void *);
dispatch_async_f(dispatch_queue_t queue, void *context, dispatch_function_t work);
![Page 20: Lviv MDDay 2014. Андріан Буданцов “Внутрішній світ iOS додатків”](https://reader030.vdocuments.pub/reader030/viewer/2022020116/5594bf9f1a28aba3748b463c/html5/thumbnails/20.jpg)
GSEvent
Private API
часть GraphicsServices.framework
реализован через Mach-ports
GSEventRegisterEventCallBack(void(*callback)(GSEventRef event));
// ... GSEventRegisterEventCallBack(_UIApplicationHandleEvent)
![Page 21: Lviv MDDay 2014. Андріан Буданцов “Внутрішній світ iOS додатків”](https://reader030.vdocuments.pub/reader030/viewer/2022020116/5594bf9f1a28aba3748b463c/html5/thumbnails/21.jpg)
GSEventtypedef struct GSEventRecord { GSEventType type; // 0x8 GSEventSubtype subtype; // 0xC CGPoint location; // 0x10 CGPoint windowLocation; // 0x18 CFTimeInterval time; // 0x20 GSEventFlags flags; unsigned short number; CFIndex size; // 0x2c } GSEventRecord;
typedef struct __GSEvent { CFRuntimeBase _base; GSEventRecord record;} GSEvent;
CFTypeID GSEventGetTypeID();CGPoint GSEventGetLocationInWindow(GSEventRef event);
![Page 22: Lviv MDDay 2014. Андріан Буданцов “Внутрішній світ iOS додатків”](https://reader030.vdocuments.pub/reader030/viewer/2022020116/5594bf9f1a28aba3748b463c/html5/thumbnails/22.jpg)
Послать GSEventstruct GSOrientationEvent { GSEventRecord record; GSDeviceOrientationInfo orientationInfo;} event; //Declare the struct containing the GSEventRecord and the event info
event.record.type = kGSEventDeviceOrientationChanged; event.record.timestamp = mach_absolute_time(); event.record.senderPID = getpid();event.record.infoSize = sizeof(GSDeviceOrientationInfo);
event.orientationInfo.orientation = UIInterfaceOrientationPortrait;
SBApplication *safari = [[SBApplicationController sharedInstance] applicationWithDisplayIdentifier:@"com.apple.mobilesafari"];
GSSendEvent((GSEventRecord*)event, (mach_port_t)[safari eventPort]);
![Page 23: Lviv MDDay 2014. Андріан Буданцов “Внутрішній світ iOS додатків”](https://reader030.vdocuments.pub/reader030/viewer/2022020116/5594bf9f1a28aba3748b463c/html5/thumbnails/23.jpg)
Mach Сообщения и Порты
порт — передающая или принимающаясторона канала сообщений
канал сообщений — очередь сообщений
сообщение - структура данных, содержитмета-информацию, тело, информацию опорте
у порта есть права доступа
![Page 24: Lviv MDDay 2014. Андріан Буданцов “Внутрішній світ iOS додатків”](https://reader030.vdocuments.pub/reader030/viewer/2022020116/5594bf9f1a28aba3748b463c/html5/thumbnails/24.jpg)
Mach Порты : Bootstrap
единственный порт который остаетсяпосле fork()
от child к parent
child передает по нему к parentинформацию о порте в другую сторону
task_get_bootstrap_port (mach_task_self (), &parent_recv_port);
Пример: http://www.foldr.org/~michaelw/log/computers/macosx/task-info-fun-with-mach
![Page 25: Lviv MDDay 2014. Андріан Буданцов “Внутрішній світ iOS додатків”](https://reader030.vdocuments.pub/reader030/viewer/2022020116/5594bf9f1a28aba3748b463c/html5/thumbnails/25.jpg)
Mach Messagestypedef struct { mach_msg_header_t header; mach_msg_body_t body;} mach_msg_base_t;
/* * Routine: mach_msg * Purpose: * Send and/or receive a message. If the message operation * is interrupted, and the user did not request an indication * of that fact, then restart the appropriate parts of the * operation silently (trap version does not restart). */extern mach_msg_return_t mach_msg( mach_msg_header_t *msg, mach_msg_option_t option, mach_msg_size_t send_size, mach_msg_size_t rcv_size, mach_port_name_t rcv_name, mach_msg_timeout_t timeout, mach_port_name_t notify);
![Page 26: Lviv MDDay 2014. Андріан Буданцов “Внутрішній світ iOS додатків”](https://reader030.vdocuments.pub/reader030/viewer/2022020116/5594bf9f1a28aba3748b463c/html5/thumbnails/26.jpg)
Objective-C
Единственный Public-API для работы c I/Oна iOS
Строгое надмножество Cа не другой язык как C++
Классы, объекты, наследование,рефлексивность
Использует Runtime при выполнении
![Page 27: Lviv MDDay 2014. Андріан Буданцов “Внутрішній світ iOS додатків”](https://reader030.vdocuments.pub/reader030/viewer/2022020116/5594bf9f1a28aba3748b463c/html5/thumbnails/27.jpg)
Obj-C Runtime
Создай мне класс MyClassNameотнаследованный от NSObject
Там будет переменная-член member всамом начале
Добавь в класс метод method
Зарегистрируй его в приложении
вызови метод method у объекта класса
![Page 28: Lviv MDDay 2014. Андріан Буданцов “Внутрішній світ iOS додатків”](https://reader030.vdocuments.pub/reader030/viewer/2022020116/5594bf9f1a28aba3748b463c/html5/thumbnails/28.jpg)
Obj-C Runtimeclass MyClassNameClass;
void MyClassMember(id self, SEL _cmd) { // TODO: implement }
void MakeMyClass() { MyClassNameClass = objc_allocateClassPair( (Class) objc_getClass("NSObject"), "MyClassName", 0);
class_addIvar(MyClassNameClass, "member", sizeof(id), 0, "@");
class_addMethod(MyClassNameClass, sel_getUid("method:"), (IMP) MyClassMember, "v");
objc_registerClassPair(AppDelClass);}
![Page 29: Lviv MDDay 2014. Андріан Буданцов “Внутрішній світ iOS додатків”](https://reader030.vdocuments.pub/reader030/viewer/2022020116/5594bf9f1a28aba3748b463c/html5/thumbnails/29.jpg)
Obj-C Runtimetypedef struct objc_class *Class;
typedef struct objc_object { Class isa;} *id;
typedef id (*IMP)(id self,SEL _cmd,...);
id objc_msgSend(id self, SEL op, ...);
SEL sel_getUid(const char *str);
![Page 30: Lviv MDDay 2014. Андріан Буданцов “Внутрішній світ iOS додатків”](https://reader030.vdocuments.pub/reader030/viewer/2022020116/5594bf9f1a28aba3748b463c/html5/thumbnails/30.jpg)
Objective-C
препроцессор для Runtime
@interface MyClassName { id member;}- (void)method;@end
@implementation MyClassName - (void)method { // TODO: implement}@end
![Page 31: Lviv MDDay 2014. Андріан Буданцов “Внутрішній світ iOS додатків”](https://reader030.vdocuments.pub/reader030/viewer/2022020116/5594bf9f1a28aba3748b463c/html5/thumbnails/31.jpg)
Объекты Приложения
![Page 32: Lviv MDDay 2014. Андріан Буданцов “Внутрішній світ iOS додатків”](https://reader030.vdocuments.pub/reader030/viewer/2022020116/5594bf9f1a28aba3748b463c/html5/thumbnails/32.jpg)
Demo Time
![Page 33: Lviv MDDay 2014. Андріан Буданцов “Внутрішній світ iOS додатків”](https://reader030.vdocuments.pub/reader030/viewer/2022020116/5594bf9f1a28aba3748b463c/html5/thumbnails/33.jpg)
Вопросы
?
![Page 34: Lviv MDDay 2014. Андріан Буданцов “Внутрішній світ iOS додатків”](https://reader030.vdocuments.pub/reader030/viewer/2022020116/5594bf9f1a28aba3748b463c/html5/thumbnails/34.jpg)
Спасибо за внимание@andrianbdn • [email protected]