Ответ 1
Ну, наконец, это получилось после многих часов разочарования.
Пока Apple не исправляет проверку, ключ должен динамически связываться с инфраструктурой WebKit во время выполнения. Ваш проект должен уже использовать проверки времени выполнения, чтобы изящно вернуться к UIWebView для iOS7 и ранее, т.е. Для проверки для [класса WKWebView].
Шаг 1: Удалите структуру WebKit из параметров проекта. Перейдите к своей цели → Общие → Связанные структуры и библиотеки и удалите WebKit. На этом этапе ваш код будет компилироваться, но не будет связан, потому что он не может разрешить WKWebView и связанные с ним символы.
Шаг 2: Отредактируйте файл main.m, чтобы динамически загружать библиотеку:
#import <UIKit/UIKit.h>
#import <TargetConditionals.h>
#import <dlfcn.h>
#import "MyAppDelegate.h"
#define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending)
int main(int argc, char * argv[])
{
@autoreleasepool {
// Dynamically load WebKit if iOS version >= 8
if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"8.0")) {
#if TARGET_IPHONE_SIMULATOR
NSString *frameworkPath = [[NSProcessInfo processInfo] environment][@"DYLD_FALLBACK_FRAMEWORK_PATH"];
if (frameworkPath) {
NSString webkitLibraryPath = [NSString pathWithComponents:@[frameworkPath, @"WebKit.framework", @"WebKit"]];
dlopen([webkitLibraryPath cStringUsingEncoding:NSUTF8StringEncoding], RTLD_LAZY);
}
#else
dlopen("/System/Library/Frameworks/WebKit.framework/WebKit", RTLD_LAZY);
#endif
}
return UIApplicationMain(argc, argv, nil, NSStringFromClass([MyAppDelegate class]));
}
}
Я использую проверку версии операционной системы, потому что Apple разрешает загрузку динамической библиотеки, начиная с iOS 8. Месторасположение библиотеки отличается от симулятора и фактических устройств, поэтому я использую условную компиляцию для проверки этого.
Шаг 3:. Поскольку библиотека загружается динамически, вызов [класс WKWebView] и [WKWebView alloc] не будет работать. Пройдите свой код, изменив каждый экземпляр
[WKWebView class]
// change to:
NSClassFromString(@"WKWebView")
И изменяйте каждый раз, когда вы выделяете WKWebView:
[WKWebView alloc]
// change to:
[NSClassFromString(@"WKWebView") alloc]
Вы также должны сделать это для связанных классов, включая WKWebViewConfiguration, WKProcessPool, WKUserScript и все, что вы используете. Проверьте ошибки компоновщика на все, что вы, возможно, пропустили.
Шаг 4: Теперь ваш код должен успешно скомпилироваться. Пакет, отправить в магазин приложений и отпраздновать.