W końcu udało się to po wielu godzinach frustracji.
Do momentu, gdy Apple naprawi walidację, kluczem jest dynamiczne łączenie z frameworkiem WebKit w środowisku wykonawczym. Twój projekt powinien już używać sprawdzeń w czasie wykonywania, by zręcznie wrócić do interfejsu UIWebView dla systemu iOS7 i wcześniejszych wersji, tj. Sprawdzić dla klasy [WKWebView].
Krok 1: Usuń szkielet WebKit z ustawień projektu. Przejdź do celu -> Ogólne -> Połączone frameworki i biblioteki i usuń WebKit. W tym momencie Twój kod się skompiluje, ale nie będzie łączył, ponieważ nie może rozwiązać WKWebView i związanych z nim symboli.
Krok 2: Edytuj plik main.m aby załadować biblioteki dynamicznie:
#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]));
}
}
używam czek Runtime wersja systemu operacyjnego firmy Apple, ponieważ pozwalają jedynie dynamiczne ładowanie bibliotek rozpoczynając w iOS 8. lokalizacji biblioteki jest inny dla symulatora niż dla rzeczywistych urządzeń, więc używam kompilacji warunkowej, aby to sprawdzić.
Krok 3: Ponieważ biblioteka jest ładowana dynamicznie, wywoływanie [klasa WKWebView] i [przydział WKWebView] nie będą działać. Przejść kodzie, zmieniając każde wystąpienie
[WKWebView class]
// change to:
NSClassFromString(@"WKWebView")
I zmieniać za każdym razem przydzielić WKWebView:
[WKWebView alloc]
// change to:
[NSClassFromString(@"WKWebView") alloc]
Musisz to zrobić także dla powiązanych klas, w tym WKWebViewConfiguration, WKProcessPool, WKUserScript, i jakiekolwiek inne używasz. Sprawdź błędy linkera pod kątem wszystkiego, co przegapiłeś.
Krok 4: Teraz kod powinien pomyślnie się skompilować. Paczkę, prześlij do sklepu z aplikacjami i świętuj.
Musisz powrócić do interfejsu UIWebView, gdy Twoi użytkownicy korzystają z systemu iOS 7 (nie jest jasne, czy próbujesz to zrobić). Powinno to zadziałać: http://stackoverflow.com/q/25341238/1580288 – EthanB
Wykonuję kontrole czasu wykonywania dla ios7 i używam UIWebView. Działa dobrze na moich urządzeniach programistycznych. Problem, który mam, próbuje przejść do sprawdzania poprawności. Dzięki! – weiyin
Mam ten sam problem. Używam tylko WebKit na iOS 8, ale moja aplikacja jest wdrażana na iOS 7 –