Upload
lviv-startup-club
View
135
Download
4
Embed Size (px)
DESCRIPTION
Сайт конференції: http://mdday.lviv.ua/ Відео: http://bit.ly/MDDayVids Linkedin: http://bit.ly/LMDDLIN
Citation preview
iOS Apps InternalsАндриан Буданцов
“Внутрішній світ iOS додатків”
iOS
Unix-based операционная система
Источник: http://www.levenez.com/unix/
iOS Слои
Источник: iOS Technology Overview
iOS : Core OS
Библиотеки (Frameworks)
libSystem
Системные вызовы Darwin и Mach
Ядро
Hardware
Hello World ?
Hello World !
Структура iOS приложения
Application Bundleпоявились в NextSTEP (1988)
Директория .app содержит:Contents (нет в iOS)
Info.plistbinaryPkgInfoResourceRules.plist
Структура iOS приложения
Default.png
Icon.png
ресурсы
информацию о подписи
Info.plist
Property List формат
Сохраняетdictionary, arraydata, number, boolean, string
ФорматыOpen Step FormatXMLBinary
Info.plist
Info.plist
PkgInfo
Mac OS 9
8 байт4 байта package type4 байта application signature
"AAPL????"
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.
Распространение
Zip файл c расширением .ipa
./Payload/
codesign:embedded.mobileprovision
GUI iOS App
UIApplicationMain
настраивает GCD-очереди (threads)
настраивает связь с "внешним миром"GSEventBackBoardServices
запускает RunLoop
UIApplicationMain
читает Info.plist
создает классы(саб-классы) Cococa TouchUIApplicationUIApplicationDelegate
Grand Central Dispatch
Open Source библиотка libdispatch
пул потоков
запускуют задачу на одном из рабочихthreads
задача: функция или блок
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);
GSEvent
Private API
часть GraphicsServices.framework
реализован через Mach-ports
GSEventRegisterEventCallBack(void(*callback)(GSEventRef event));
// ... GSEventRegisterEventCallBack(_UIApplicationHandleEvent)
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);
Послать 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]);
Mach Сообщения и Порты
порт — передающая или принимающаясторона канала сообщений
канал сообщений — очередь сообщений
сообщение - структура данных, содержитмета-информацию, тело, информацию опорте
у порта есть права доступа
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
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);
Objective-C
Единственный Public-API для работы c I/Oна iOS
Строгое надмножество Cа не другой язык как C++
Классы, объекты, наследование,рефлексивность
Использует Runtime при выполнении
Obj-C Runtime
Создай мне класс MyClassNameотнаследованный от NSObject
Там будет переменная-член member всамом начале
Добавь в класс метод method
Зарегистрируй его в приложении
вызови метод method у объекта класса
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);}
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);
Objective-C
препроцессор для Runtime
@interface MyClassName { id member;}- (void)method;@end
@implementation MyClassName - (void)method { // TODO: implement}@end
Объекты Приложения
Demo Time
Вопросы
?
Спасибо за внимание@andrianbdn • [email protected]