2014-09-17 16 views
11

Tôi đang sử dụng WKWebView khuôn khổ WebKit và khi cố gắng gửi đến các cửa hàng ứng dụng, tôi nhận được lỗi này:Bao gồm khuôn khổ WebKit cho iOS8 không xác nhận

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 

Nếu tôi đặt mục tiêu triển khai đến 8,0 thì bị lỗi, nhưng tôi cũng muốn hỗ trợ iOS 7. Lỗi xuất hiện là kết quả của iOS7 cũng có khung WebKit, nhưng nó đã được tư nhân trở lại sau đó.

Do đó, tôi muốn tự động liên kết với thư viện WebKit. Làm thế nào tôi có thể làm điều này trong XCode?

+0

Bạn sẽ cần phải quay trở lại UIWebView khi người dùng của bạn đang sử dụng iOS 7 (không rõ là bạn đang thử điều đó). Điều này sẽ hoạt động: http://stackoverflow.com/q/25341238/1580288 – EthanB

+0

Tôi thực hiện kiểm tra thời gian chạy cho ios7 và sử dụng UIWebView. Nó chạy tốt trên các thiết bị phát triển của tôi. Vấn đề tôi đang gặp là cố gắng vượt qua xác thực. Cảm ơn! – weiyin

+0

Tôi đang gặp vấn đề tương tự. Tôi chỉ sử dụng WebKit trên iOS 8 nhưng ứng dụng của tôi triển khai trên iOS 7 –

Trả lời

16

Vâng, cuối cùng đã làm việc này sau nhiều giờ thất vọng.

Cho đến khi Apple sửa lỗi xác thực, khóa là liên kết động với khung WebKit khi chạy. Dự án của bạn đã được sử dụng kiểm tra thời gian chạy để quay trở lại UIWebView cho iOS7 trở về trước một cách duyên dáng, tức là kiểm tra [lớp WKWebView].

Bước 1: Xóa khung WebKit khỏi cài đặt dự án. Chuyển đến mục tiêu của bạn -> Chung -> Khung và Thư viện được Liên kết và xóa WebKit. Tại thời điểm này, mã của bạn sẽ biên dịch nhưng không liên kết được vì nó không thể giải quyết WKWebView và các ký hiệu liên quan.

Bước 2: Chỉnh sửa tập tin main.m của bạn để tải các thư viện động:

#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])); 
    } 
} 

tôi sử dụng một tấm séc runtime phiên bản hệ điều hành vì Apple chỉ cho phép tải thư viện năng động bắt đầu trong iOS 8. Các vị trí thư viện khác với mô phỏng so với các thiết bị thực tế, vì vậy tôi sử dụng trình biên dịch có điều kiện để kiểm tra điều đó.

Bước 3: Vì thư viện được nạp tự động, gọi [lớp WKWebView] và [WKWebView alloc] sẽ không hoạt động. Đi qua mã của bạn, thay đổi mỗi thể hiện của

[WKWebView class] 
// change to: 
NSClassFromString(@"WKWebView") 

Và thay đổi mỗi khi bạn phân bổ một WKWebView:

[WKWebView alloc] 
// change to: 
[NSClassFromString(@"WKWebView") alloc] 

Bạn cũng phải làm điều này cho các lớp học liên quan, bao gồm WKWebViewConfiguration, WKProcessPool, WKUserScript, và bất cứ điều gì khác bạn đang sử dụng. Kiểm tra lỗi liên kết của bạn cho bất kỳ điều gì bạn có thể đã bỏ lỡ.

Bước 4: Bây giờ mã của bạn sẽ biên dịch thành công. Đóng gói, gửi đến cửa hàng ứng dụng và kỷ niệm.

+0

Đối với bướC# 2, một phương pháp thay thế là thêm thư viện làm tùy chọn, thay vì bắt buộc nếu cần để hỗ trợ iOS7. – jianhua

+0

Lỗi xác thực trở lại khi tôi thêm WebKit.framework làm tùy chọn. Nhưng hóa ra nếu bạn đã di chuyển mọi thứ tới NSClassFromString thì nói cho người liên kết biết về các lớp là không cần thiết chút nào! Tôi đang cập nhật để xóa bước không cần thiết. – weiyin

+0

Tôi gặp vấn đề tương tự. Thx cho cách tiếp cậ[email protected] Vì thư viện được tải động, nên không thuận tiện khi sử dụng WKWebView và các lớp được liên kết. Tôi đã viết một lớp Gọi để thực hiện các bộ chọn với bất kỳ loại tham số nào. Hy vọng giúp đỡ người khác. [link] [1] [1]: https://github.com/jnuhwb/WBInvocation –

Các vấn đề liên quan