Подтвердить что ты не робот

Включение рамки WebKit для iOS8 не позволяет выполнить проверку

Я использую WebKit framework WKWebView и при попытке отправить в хранилище приложений я получаю эту ошибку:

Your app contains non-public API usage. Please review the errors, correct them, and resubmit your application.
The app links to non-public libraries in Payload...: /System/Library/PrivateFrameworks/WebKit.framework/WebKit

Если я установил цель развертывания на 8.0, ошибка исчезнет, ​​но я также хотел бы поддержать iOS 7. Ошибка, похоже, является результатом того, что iOS7 также имеет структуру WebKit, но тогда он был закрыт.

Я хотел бы поэтому динамически ссылаться на библиотеку WebKit. Как это сделать в XCode?

4b9b3361

Ответ 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: Теперь ваш код должен успешно скомпилироваться. Пакет, отправить в магазин приложений и отпраздновать.