2014-09-17 8 views
11

मैं वेबकिट ढांचे के WKWebView उपयोग कर रहा हूँ विफल रहता है और जब app की दुकान के लिए प्रस्तुत करने का प्रयास है, मैं इस त्रुटि मिलती है:सहित वेबकिट ढांचे सत्यापन

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 करने के लिए तैनाती का लक्ष्य रखा है, तो त्रुटि दूर हो गई है, लेकिन मैं आईओएस 7 का भी समर्थन करना चाहता हूं। त्रुटि आईओएस 7 का परिणाम वेबकिट ढांचा भी है, लेकिन यह तब निजी था।

इसलिए मैं वेबकिट लाइब्रेरी को गतिशील रूप से लिंक करना चाहता हूं। मैं एक्सकोड में यह कैसे कर सकता हूं?

+0

जब आपके उपयोगकर्ता आईओएस 7 पर हों तो आपको UIWebView पर वापस गिरना होगा (यह स्पष्ट नहीं है कि आप इसे आजमा रहे थे)। यह काम करना चाहिए: http://stackoverflow.com/q/25341238/1580288 – EthanB

+0

मैं आईओएस 7 के लिए रनटाइम चेक करता हूं और UIWebView का उपयोग करता हूं। यह मेरे विकास उपकरणों पर ठीक है। मेरी समस्या यह है कि सत्यापन पास करने का प्रयास कर रहा है। धन्यवाद! – weiyin

+0

मुझे एक ही समस्या है। मैं केवल आईओएस 8 पर वेबकिट का उपयोग करता हूं लेकिन मेरा ऐप आईओएस 7 –

उत्तर

16

ठीक है, आखिरकार यह निराशा के कई घंटों के बाद काम कर रहा है।

जब तक ऐप्पल सत्यापन को ठीक नहीं करता है, कुंजी को गतिशील रूप से रनटाइम पर वेबकिट फ्रेमवर्क से लिंक करना होता है। आपकी परियोजना पहले से ही आईओएस 7 और पहले के लिए UIWebView पर वापस आने के लिए रनटाइम चेक का उपयोग करनी चाहिए, यानी [WKWebView क्लास] की जांच करनी चाहिए।

चरण 1: परियोजना सेटिंग्स से वेबकिट ढांचे को हटाएं। अपने लक्ष्य पर जाएं -> सामान्य -> ​​लिंक्ड फ्रेमवर्क और पुस्तकालय, और वेबकिट को हटा दें। इस बिंदु पर, आपका कोड संकलित होगा लेकिन लिंक करने में असफल होगा क्योंकि यह 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])); 
    } 
} 

मैं एक क्रम OS संस्करण की जांच उपयोग करें, क्योंकि एप्पल केवल iOS 8. पुस्तकालय स्थान में शुरू होने वाले गतिशील पुस्तकालय लदान करने के सिम्युलेटर बनाम वास्तविक उपकरणों के लिए अलग है, इसलिए मैं इसके लिए जांच करने के लिए सशर्त संकलन का उपयोग करता हूं।

चरण 3: चूंकि लाइब्रेरी गतिशील रूप से लोड हो जाती है, [WKWebView क्लास] और [WKWebView alloc] को कॉल करना काम नहीं करेगा। अपने कोड के माध्यम से जाने

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

के प्रत्येक उदाहरण बदल रहा और हर बार बदलते हैं तो आप एक WKWebView आवंटित:

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

तुम भी WKWebViewConfiguration, WKProcessPool, WKUserScript सहित संबद्ध कक्षाएं, के लिए यह करना चाहिए, और जो कुछ भी आप उपयोग कर रहे हैं। आपके द्वारा छोड़ी गई किसी भी चीज़ के लिए अपनी लिंकर त्रुटियों की जांच करें।

चरण 4: अब आपका कोड सफलतापूर्वक संकलित होना चाहिए। पैकेज, ऐप स्टोर में जमा करें, और जश्न मनाएं।

+0

पर तैनात करता है चरण # 2 के लिए, आईओएस 7 का समर्थन करने के लिए आवश्यक होने के बजाय पुस्तकालय को वैकल्पिक रूप से जोड़ने का एक वैकल्पिक तरीका है। – jianhua

+0

जब मैं WebKit.framework को वैकल्पिक के रूप में जोड़ता हूं तो सत्यापन त्रुटि वापस आती है। लेकिन यह पता चला है कि क्या आपने सबकुछ एनएससीलासफ्रमस्ट्रिंग में ले जाया है, फिर कक्षाओं के बारे में लिंकर को बिल्कुल जरूरी नहीं है! मैं अनावश्यक कदम को हटाने के लिए अद्यतन कर रहा हूँ। – weiyin

+0

मुझे एक ही समस्या मिलती है। दृष्टिकोण के लिए Thx।@weiyin चूंकि पुस्तकालय गतिशील रूप से लोड होता है, इसलिए WKWebView और संबंधित कक्षाओं का उपयोग करने में यह सुविधा नहीं है। मैंने किसी भी प्रकार के पैरामीटर के साथ चयनकर्ताओं को निष्पादित करने के लिए एक आमंत्रण कक्षा लिखी है। आशा है कि दूसरों की मदद करें। [लिंक] [1] [1]: https://github.com/jnuhwb/WBInvocation –

संबंधित मुद्दे