Если вы уже превратили свои классы в фреймворки, поздравляю, вы уже сделали сложную часть. Имейте в виду, однако, что если большая часть кода вашего приложения находится в платформе, некоторые вещи могут работать не так, как ожидалось. Например, любой код, который в конечном итоге вызывает NSBundle.mainBundle
(например, +[UIImage imageNamed:]
), вероятно, неверен, если вы также версировали свои ресурсы.
Но давайте предположим, что вы успешно интегрировали версии своего приложения.
Вы не можете ссылаться ни на одну из платформ, если хотите выбрать одну из них во время выполнения. Вместо этого вам нужно использовать dlopen
и NSClassFromString
или dlsym
для достижения точки входа.
Вот пример:
#import <dlfcn.h>
#import "HeaderWithEntryPointMethod.h"
void pickedAppVersion(int version) {
NSString *frameworkName = [NSString stringWithFormat:@"AppV%d", version];
NSString *frameworkExecutable = [NSString stringWithFormat:@"%@.framework/%@", frameworkName, frameworkName]; // this should traverse the symlink
NSString *frameworkPath = [[[NSBundle mainBundle] privateFrameworksPath] stringByAppendingPathComponent:frameworkExecutable];
void *frameworkHandle = dlopen(frameworkPath.UTF8String, RTLD_NOW);
if (frameworkHandle != NULL) {
Class EntryPointClass = NSClassFromString(@"EntryPoint");
assert(EntryPointClass != Nil);
[EntryPointClass entryMethod];
// App framework should do everything from here
if (dlclose(frameworkHandle) != 0) {
NSLog(@"failed to close chosen app framework: %s", dlerror());
}
}
else {
NSLog(@"failed to open app framework: %@ because: %s", frameworkName, dlerror());
}
}
Что именно означает EntryPoint
и +entryMethod
это зависит от вас. Если вам нужна точка входа в функцию C, используйте dlsym
вместо NSClassFromString
.
Re: Обзор App Store: я думаю, это может поднять бровь или две, но пока вы разрешение пользователю, особенно рецензенту, не должно быть проблемой. dlopen
обычно используется для выборочной загрузки платформ во время выполнения, чтобы упростить запуск приложений и загрузить функции, используемые приложением по требованию.