适用于iOS的Leanplum,Apptimize和其他A/B测试平台能够从Web下载资产(nib文件,图像等)并在运行时替换它们.
天真的方法是下载新资产并将其替换为资源包目录,但由于权限,无法将文件写入资源目录.
问题是,这些A/B测试平台在运行时使用什么技术来替换资产?
编辑:
在读取leanplum静态库文件(使用nm)上的符号后,似乎它们是Swizzling可可文件系统API.
例如:(示例行nm -m leanplum.a)
-[NSBundle(LeanplumExtension) leanplum_URLForResource:withExtension:]
Run Code Online (Sandbox Code Playgroud)
通过使用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), …Run Code Online (Sandbox Code Playgroud)