2014-09-17 13 views
11

jestem za pomocą ramy Webkit za WKWebView i podczas próby do przedstawienia do sklepu z aplikacjami, otrzymuję ten błąd:tym framework WebKit dla systemów iOS 8 nie walidacja

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 

Gdybym ustawić cel wdrażania do 8,0, a następnie błąd zniknie, ale chciałbym także wspierać iOS 7. Ten błąd wydaje się być wynikiem iOS7, który ma również strukturę WebKit, ale wtedy był prywatny.

Chciałbym zatem dynamicznie połączyć się z biblioteką WebKit. Jak mogę to zrobić w XCode?

+0

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

+0

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

+0

Mam ten sam problem. Używam tylko WebKit na iOS 8, ale moja aplikacja jest wdrażana na iOS 7 –

Odpowiedz

16

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.

+0

. Dla kroku nr 2 alternatywną metodą jest dodanie biblioteki jako opcjonalnej, zamiast wymaganej, jeśli jest wymagana do obsługi iOS7. – jianhua

+0

Błąd sprawdzania poprawności powraca, gdy dodaję WebKit.framework jako opcjonalny. Okazuje się jednak, że wszystko, co przeniesiesz do NSClassFromString, oznacza, że ​​linker o klasach nie jest wcale potrzebny! Aktualizuję, aby usunąć niepotrzebny krok. – weiyin

+0

Spotykam ten sam problem. Thx za podejś[email protected] Ponieważ biblioteka jest ładowana dynamicznie, nie jest tak wygodnie używać WKWebView i powiązanych klas. Napisałem klasę Invocation, aby wykonać selektory z dowolnym typem parametrów. Mam nadzieję, że pomagam innym. [link] [1] [1]: https://github.com/jnuhwb/WBInvocation –

Powiązane problemy