34
iOS Apps Internals Андриан Буданцов Внутрішній світ iOS додатків

Lviv MDDay 2014. Андріан Буданцов “Внутрішній світ iOS додатків”

Embed Size (px)

DESCRIPTION

Сайт конференції: http://mdday.lviv.ua/ Відео: http://bit.ly/MDDayVids Linkedin: http://bit.ly/LMDDLIN

Citation preview

Page 1: Lviv MDDay 2014. Андріан Буданцов “Внутрішній світ iOS додатків”

iOS Apps InternalsАндриан Буданцов

“Внутрішній світ iOS додатків”

Page 2: Lviv MDDay 2014. Андріан Буданцов “Внутрішній світ iOS додатків”

iOS

Unix-based операционная система

Источник: http://www.levenez.com/unix/

Page 3: Lviv MDDay 2014. Андріан Буданцов “Внутрішній світ iOS додатків”

iOS Слои

Источник: iOS Technology Overview

Page 4: Lviv MDDay 2014. Андріан Буданцов “Внутрішній світ iOS додатків”

iOS : Core OS

Библиотеки (Frameworks)

libSystem

Системные вызовы Darwin и Mach

Ядро

Hardware

Page 5: Lviv MDDay 2014. Андріан Буданцов “Внутрішній світ iOS додатків”

Hello World ?

Page 6: Lviv MDDay 2014. Андріан Буданцов “Внутрішній світ iOS додатків”

Hello World !

Page 7: Lviv MDDay 2014. Андріан Буданцов “Внутрішній світ iOS додатків”

Структура iOS приложения

Application Bundleпоявились в NextSTEP (1988)

Директория .app содержит:Contents (нет в iOS)

Info.plistbinaryPkgInfoResourceRules.plist

Page 8: Lviv MDDay 2014. Андріан Буданцов “Внутрішній світ iOS додатків”

Структура iOS приложения

Default.png

Icon.png

ресурсы

информацию о подписи

Page 9: Lviv MDDay 2014. Андріан Буданцов “Внутрішній світ iOS додатків”

Info.plist

Property List формат

Сохраняетdictionary, arraydata, number, boolean, string

ФорматыOpen Step FormatXMLBinary

Page 10: Lviv MDDay 2014. Андріан Буданцов “Внутрішній світ iOS додатків”

Info.plist

Page 11: Lviv MDDay 2014. Андріан Буданцов “Внутрішній світ iOS додатків”

Info.plist

Page 12: Lviv MDDay 2014. Андріан Буданцов “Внутрішній світ iOS додатків”

PkgInfo

Mac OS 9

8 байт4 байта package type4 байта application signature

"AAPL????"

Page 13: Lviv MDDay 2014. Андріан Буданцов “Внутрішній світ iOS додатків”

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 додатків”

Распространение

Zip файл c расширением .ipa

./Payload/

codesign:embedded.mobileprovision

Page 15: Lviv MDDay 2014. Андріан Буданцов “Внутрішній світ iOS додатків”

GUI iOS App

Page 16: Lviv MDDay 2014. Андріан Буданцов “Внутрішній світ iOS додатків”

UIApplicationMain

настраивает GCD-очереди (threads)

настраивает связь с "внешним миром"GSEventBackBoardServices

запускает RunLoop

Page 17: Lviv MDDay 2014. Андріан Буданцов “Внутрішній світ iOS додатків”

UIApplicationMain

читает Info.plist

создает классы(саб-классы) Cococa TouchUIApplicationUIApplicationDelegate

Page 18: Lviv MDDay 2014. Андріан Буданцов “Внутрішній світ iOS додатків”

Grand Central Dispatch

Open Source библиотка libdispatch

пул потоков

запускуют задачу на одном из рабочихthreads

задача: функция или блок

Page 19: Lviv MDDay 2014. Андріан Буданцов “Внутрішній світ iOS додатків”

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 додатків”

GSEvent

Private API

часть GraphicsServices.framework

реализован через Mach-ports

GSEventRegisterEventCallBack(void(*callback)(GSEventRef event));

// ... GSEventRegisterEventCallBack(_UIApplicationHandleEvent)

Page 21: Lviv MDDay 2014. Андріан Буданцов “Внутрішній світ iOS додатків”

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 додатків”

Послать 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 додатків”

Mach Сообщения и Порты

порт — передающая или принимающаясторона канала сообщений

канал сообщений — очередь сообщений

сообщение - структура данных, содержитмета-информацию, тело, информацию опорте

у порта есть права доступа

Page 24: Lviv MDDay 2014. Андріан Буданцов “Внутрішній світ iOS додатків”

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 додатків”

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 додатків”

Objective-C

Единственный Public-API для работы c I/Oна iOS

Строгое надмножество Cа не другой язык как C++

Классы, объекты, наследование,рефлексивность

Использует Runtime при выполнении

Page 27: Lviv MDDay 2014. Андріан Буданцов “Внутрішній світ iOS додатків”

Obj-C Runtime

Создай мне класс MyClassNameотнаследованный от NSObject

Там будет переменная-член member всамом начале

Добавь в класс метод method

Зарегистрируй его в приложении

вызови метод method у объекта класса

Page 28: Lviv MDDay 2014. Андріан Буданцов “Внутрішній світ iOS додатків”

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 додатків”

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 додатків”

Objective-C

препроцессор для Runtime

@interface MyClassName { id member;}- (void)method;@end

@implementation MyClassName - (void)method { // TODO: implement}@end

Page 31: Lviv MDDay 2014. Андріан Буданцов “Внутрішній світ iOS додатків”

Объекты Приложения

Page 32: Lviv MDDay 2014. Андріан Буданцов “Внутрішній світ iOS додатків”

Demo Time

Page 33: Lviv MDDay 2014. Андріан Буданцов “Внутрішній світ iOS додатків”

Вопросы

?

Page 34: Lviv MDDay 2014. Андріан Буданцов “Внутрішній світ iOS додатків”

Спасибо за внимание@andrianbdn • [email protected]