web-dev-qa-db-ja.com

Xcode 6 + iOS 8 SDK、ただしiOS 7(UIWebKitおよびWKWebKit)にデプロイ

Xcode 6 beta 5 + Swift on iOS 8SDKを使用してアプリを作成しています。iOS7にもデプロイしたいと思います。それは可能ですか?のデプロイターゲットを設定すると7.0にプロジェクトすると、次のようなコンパイル時エラーが発生します。

_Undefined symbols for architecture x86_64:
  "_OBJC_CLASS_$_WKPreferences", referenced from:
      __TMaCSo13WKPreferences in WebViewController.o
  "_OBJC_CLASS_$_WKWebView", referenced from:
      __TMaCSo9WKWebView in WebViewController.o
  "_OBJC_CLASS_$_WKWebViewConfiguration", referenced from:
      __TMaCSo22WKWebViewConfiguration in WebViewController.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
_

これは、iOS8以降でのみサポートされているWKWebKitを使用しているためだと思います。 iOS 7の場合はUIWebKitを使用できますが、iOS 8の場合はWKWebKitを使用できます。それをどのように定義しますか?

クラス定義は次のようになります...

_import WebKit

class WebViewController: UIViewController, WKNavigationDelegate {
   ...
}
_

それは次のように呼ばれます:

_        let mainStoryboard = UIStoryboard(name: "Main", bundle: nil)
        let destinationVC = mainStoryboard.instantiateViewControllerWithIdentifier("WebViewController") as WebViewController
        presentViewController(destinationVC, animated: true, completion: nil)
_

このフラグメントを使用してpresentViewControllerを呼び出すことを考えていましたが、それでもコンパイル時の問題は解決しません。 (NSFoundationVersionNumberはコンパイル時の問題も解決しません)

_    if ((UIDevice.currentDevice().systemVersion as NSString).floatValue >= 8.0) {

    } else {

    }
_

更新:kkoltzauには正解があります。他の人のためにいくつかの情報を追加しています。

まず、Projectに移動し、Generalをクリックして、下にスクロールして_Linked Frameworks and Libraries_に移動し、オプションとして_WebKit.framework_を追加します。 (私も_UIKit.framework_のためにそれをしました)スクリーンショットを見てください:

enter image description here

私のWebViewControllerクラスについて。それでもUIKitWebKitをインポートします。ただし、viewDidLoad()は、kkoltzauの例に基づいてビューを設定します。次に、Webページをロード/リロードする必要があるときはいつでも、wkWebViewの存在をチェックします。

18
Dean

WKWebViewが使用可能かどうかを確認し、使用できない場合はUIWebViewにフォールバックする必要があります。

WebKit.frameworkを弱くリンクしていることを確認してください(オプションに設定)

Objective-C:

WKWebView *wkWebView = nil;
UIWebView *uiWebView = nil;

Class wkWebViewClass = NSClassFromString(@"WKWebView");
if(wkWebViewClass) {
    WKWebViewConfiguration *config = [[WKWebViewConfiguration alloc] init];
    // ...
    wkWebView = [[wkWebViewClass alloc] initWithFrame:frame configuration:config];
    [self.view addSubview:wkWebView];
}
else {
    uiWebView = [[UIWebView alloc] initWithFrame:frame];
    [self.view addSubview:uiWebView];
}

迅速:

var wkWebView : WKWebView?
var uiWebView : UIWebView?

if NSClassFromString("WKWebView") {
    let config = WKWebViewConfiguration()
    // ...
    wkWebView = WKWebView(frame: frame, configuration: config)
    self.view.addSubview(wkWebView)
}
else {
    uiWebView = UIWebView(frame: frame)
    self.view.addSubview(uiWebView)
}

次に、コードの他の場所:

Objective-C:

if(wkWebView) {
    // WKWebView specific code
}
else {
    // UIWebView specific code
}

迅速:

if let w=wkWebView {
    // WKWebView specific code
}
else if let w=uiWebView {
    // UIWebView specific code
}
18
kevin

IOS7をサポートする必要がある場合は、WebKit2(WK*)クラスを使用できないか、ロジックを2回実装する必要があります。1回はiOS8でWK*を使用し、もう1回はUIWeb*を使用します。オペレーティングシステムのバージョンに応じて選択してください。

2
Leo Natan