Leanplum, Apptimize и другие платформы тестирования A/B для iOS имеют возможность загружать активы (файлы nib, изображения и т.д.) из Интернета и заменять их во время выполнения.
Наивный подход заключается в загрузке новых активов и замене их в каталоге ресурсных пакетов, но невозможно записать файлы в каталог ресурсов из-за разрешений.
Вопрос в том, какие методы используют эти тестовые платформы A/B для замены активов во время выполнения?
ИЗМЕНИТЬ
После прочтения символов в файле staticplum static library (с использованием nm) кажется, что они являются Swizzling cocoa API файловой системы.
например: (пример строки из nm -m leanplum.a
)
-[NSBundle(LeanplumExtension) leanplum_URLForResource:withExtension:]
Используя otool, я могу распечатать реализацию:
-[NSBundle(LeanplumExtension) leanplum_URLForResource:withExtension:]:
0000000000000069 pushq %rbp
000000000000006a movq %rsp, %rbp
000000000000006d pushq %r15
000000000000006f pushq %r14
0000000000000071 pushq %r13
0000000000000073 pushq %r12
0000000000000075 pushq %rbx
0000000000000076 subq $0x18, %rsp
000000000000007a movq %rcx, %rbx
000000000000007d movq %rdi, 0xffffffffffffffc8(%rbp)
0000000000000081 movq %rdx, %rdi
0000000000000084 callq _objc_retain
0000000000000089 movq %rax, %r14
000000000000008c movq %rbx, %rdi
000000000000008f callq _objc_retain
0000000000000094 movq %rax, 0xffffffffffffffd0(%rbp)
0000000000000098 movq _originalMainBundle(%rip), %rcx
000000000000009f movq "+[NSBundle(LeanplumExtension) leanplum_mainBundle]"(%rcx), %rdi
00000000000000a2 movq 0x4487(%rip), %rsi
00000000000000a9 movq _objc_msgSend(%rip), %r12
00000000000000b0 movq %r14, %rdx
00000000000000b3 movq %rax, %rcx
00000000000000b6 callq *%r12
00000000000000b9 movq %rax, %rdi
00000000000000bc callq _objc_retainAutoreleasedReturnValue
00000000000000c1 movq %rax, %r13
00000000000000c4 movq _skippedFiles(%rip), %rax
00000000000000cb movq "+[NSBundle(LeanplumExtension) leanplum_mainBundle]"(%rax), %rbx
00000000000000ce movq 0x4463(%rip), %rsi
00000000000000d5 movq %r13, %rdi
00000000000000d8 callq *%r12
00000000000000db movq %rax, %rdi
00000000000000de callq _objc_retainAutoreleasedReturnValue
00000000000000e3 movq %rax, %r15
00000000000000e6 movq 0x4453(%rip), %rsi
00000000000000ed movq %rbx, %rdi
00000000000000f0 movq %r15, %rdx
00000000000000f3 callq *%r12
00000000000000f6 movb %al, %bl
00000000000000f8 movq %r15, %rdi
00000000000000fb callq _objc_release
0000000000000100 testb %bl, %bl
0000000000000102 je 0x115
0000000000000104 movq %r13, %rdi
0000000000000107 callq _objc_retain
000000000000010c movq %rax, %r15
000000000000010f movq 0xffffffffffffffd0(%rbp), %rbx
0000000000000113 jmp 0x13b
0000000000000115 movq 0x4414(%rip), %rsi
000000000000011c movq 0xffffffffffffffc8(%rbp), %rdi
0000000000000120 movq %r14, %rdx
0000000000000123 movq 0xffffffffffffffd0(%rbp), %rbx
0000000000000127 movq %rbx, %rcx
000000000000012a callq *_objc_msgSend(%rip)
0000000000000130 movq %rax, %rdi
0000000000000133 callq _objc_retainAutoreleasedReturnValue
0000000000000138 movq %rax, %r15
000000000000013b movq %r13, %rdi
000000000000013e callq _objc_release
0000000000000143 movq %rbx, %rdi
0000000000000146 callq _objc_release
000000000000014b movq %r14, %rdi
000000000000014e callq _objc_release
0000000000000153 movq %r15, %rdi
0000000000000156 addq $0x18, %rsp
000000000000015a popq %rbx
000000000000015b popq %r12
000000000000015d popq %r13
000000000000015f popq %r14
0000000000000161 popq %r15
0000000000000163 popq %rbp
0000000000000164 jmpq _objc_autoreleaseReturnValue
- Может ли кто-нибудь проверить мои результаты?
- Интересно, как они покрывают весь этот список API?
- Что произойдет, если я открою изображение с помощью fopen или другого C lib?
- Как я могу расшифровать вывод otool?