2016-02-01 21 views
17

私は問題なくSafariのビューコントローラを作成することができます。Safari View ControllerのWebコンテンツをプリロードできますか?

let svc = SFSafariViewController(URL: NSURL(string: remote_url)!, entersReaderIfAvailable: true) 
self.presentViewController(svc, animated: true, completion: nil) 

は、私は、ユーザーにビューコントローラを提示する前に、私はURLをプリロードすることができます方法はありますか?例えば

、私が最初にバックグラウンドでURL(Webコンテンツ)をプリロードすることができ、ユーザーが何かをクリックした後、私はすぐにコンテンツをSafariのビューコントローラを表示することができます。ユーザーは、ページの読み込みが高速または瞬時であると感じます。

P.S.回避策やハッキングも可能です。たとえば、など、キャッシュを使用するか、バックグラウンドでビューコントローラを起動するため

EDIT:SFSafariViewControllerにのみご検討ください。

+0

SFSafariViewControllerがプリロードをサポートしていない可能性があります。 NSURLCacheを使用し、NSURLRequestとNSURLConnectionを使用してURLをプリロードすることができます。その後、SFSafariViewControllerにURLをロードするときはいつでも、キャッシュポリシーごとにキャッシュされたリクエストが使用されます。 –

+0

@KetanP SFSafariViewControllerがキャッシュされたリクエストを使用する場合、この種のプリロードも十分です。どのようにそれを行うにはさらに詳しい情報はありますか? –

+0

@KetanPあなたが言ったことを達成する方法を見つけることができません。あなたは 'SFSafariViewController'が何らかの方法でプリロードされていればキャッシュを使用するのでしょうか、それとも単なる仮定ですか? –

答えて

9

ここに解決策があります。 明らかに、ボタンをすぐにクリックすると、読み込みが表示されます。 しかし、基本的に、私はブラウザを読み込んで別のビューの背後に置くと、私はこの別のビューにボタンを入れます。

ボタンを押すと、ブラウザはすでに読み込まれている前面に表示されます。 ここでの唯一の問題は、私が移行を使用していないことですが、それは少なくとも1つの解決策です。

import UIKit 
import SafariServices 

class ViewController: UIViewController { 
    var svc = SFSafariViewController(URL: NSURL(string: "https://microsoft.com/")!, entersReaderIfAvailable: true) 
    var safariView:UIView? 
    let containerView = UIView() 
    let btn = UIButton() 

    override func viewDidLoad() { 
    super.viewDidLoad() 
    //let tmpView = svc.view 
    addChildViewController(svc) 
    svc.didMoveToParentViewController(self) 
    svc.view.frame = view.frame 
    containerView.frame = view.frame 
    containerView.backgroundColor = UIColor.redColor() 
    safariView = svc.view 
    view.addSubview(safariView!) 
    view.addSubview(containerView) 

    btn.setTitle("Webizer", forState: UIControlState.Normal) 
    btn.titleLabel!.textColor = UIColor.blackColor() 
    btn.addTarget(self, action: "buttonTouched:", forControlEvents: .TouchUpInside) 
    btn.frame = CGRectMake(20, 50, 100, 100) 
    containerView.addSubview(btn) 

    view.sendSubviewToBack(safariView!) 

    // Do any additional setup after loading the view, typically from a nib. 
    } 

    override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
    } 

    @IBAction func buttonTouched(sender: AnyObject) { 
    view.bringSubviewToFront(safariView!) 
    //self.presentViewController(svc, animated: true, completion: nil) 
    } 


} 
+0

メソッドとそれ以外はうまくいきます...アプリは30回以上試行した後にクラッシュします。私はこの問題を尋ねたので、あなたができる場合は助けてくださいこのような質問を見てください:http://stackoverflow.com/questions/35598449/how-to-remove-sfsafariviewcontroller-as-a-child-view-controller-正しく –

4

悲しいことに、この動作はSFSafariViewControllerの現在の実装ではサポートされていません。私は、Appleにこの動作のサポートを追加するレーダーを提出することをお勧めしますが、他の人のように、WKWebViewを使用して階層に追加する前にロードを開始することをお勧めします。

私は実際にあなたが求めている正確に何を言及している素敵なradar from Twitterに出くわしました。私はあなたが役に立つ次の要求を見つけるかもしれないと思う:

高優先度: - 実際にディスク にURL、URLリクエスト、HTMLデータやファイルでそれを提示する前にSFSafariViewControllerを暖める能力 - 現在、多額の投資を行っています優先度の高いツイート用に共有URLキャッシュを温めて、ユーザーがそのツイートにヒットした場合、 はそのプレキャッシュされたウェブ ページでUIWebView(悲しいことにWKWebViewではなく)を開きます。 のリンクを使用してSFSafariViewControllerを暖めることができれば、 終了時に膨大な労力が必要になります。

は、あなたはそれらの実装WKWebViewは、ビットキャッシュセマンティクスを難読化すると思われるので、のUIWebViewを使用して、彼らだけでキャッシュ応答で見ることができます。唯一のリスクは、docsにあるように、「iOS 8以降で動作するアプリケーションでは、UIWebViewを使用する代わりにWKWebViewクラスを使用してください」というように、UIWebViewは非推奨の候補です。

だから、残念ながらあなたが今のちょうどアップルをせがむとTwitterのレーダーをだますことです。このすべてに行くので、あなたの最善の策を得るために介してジャンプする必要があり、多くのフープが自分のしているようです。

+0

私はAppleがこれを支持することを真剣に疑っています。 Twitterは、ユーザーが実際に「優先度の高いツイート」をタップするかどうかを知る方法がないため、すべてのバッテリーとデータを無駄にしているだけです。 – bpapa

2

それはですので、あなたはHTTPキャッシュを使用して試みることができるが、私はSafariのビューコントローラは、(Safariなどおそらく同じ)別のプロセスとして働いているとして、それがうまくいくとは思わない、なぜそれ例えばATSを迂回する。

私はこの作業を考えて唯一の方法は、どうにかしてユーザーのSafariに読み込ませることです。 openURL:や読書リストに追加するかもしれない?これは実行可能な解決策のようには聞こえません。

いつでも、ビューコントローラのカスタムプレゼンテーションを試し、ビュー階層をアタッチし、外観イベントをトリガーしますが、そのフレームをCGRectMake(0,0,1,1)に設定するか、オフスクリーンのどこかにアタッチしてからしばらく待ってから、フレーム。

+0

私は最後の選択肢について考えましたが(何とかバックグラウンドでそれを提示します)、私は方法を理解することはできません。 –

+0

' - (void)beginAppearanceTransition:(BOOL)isAppearing animated:(BOOL)animated'を試してみてください。 – Alistra

+0

また、ここにあるhttp://www.teehanlax.com/blog/custom-uiviewcontroller-transitions/のようなカスタムの「transitionDelegate」を試してみてください。それは画面のどこかに表示されます。通常は数秒後に表示されます。 – Alistra

2

次のコードを使用してWebページをダウンロードできます。 svcの助けを借りてそれを表現する let data:NSData? 行う{ せweatherData =のNSDataしてみてください(contentsOfURL:NSURL(文字列:remote_urlを)〕オプション:NSDataReadingOptions()) データ= weatherData プリント(weatherData) }キャッチ{ プリント(エラー) }

あなたがSVCに必要なときにロードしてください。

+0

これは前提か実用的な解決策ですか? –

+2

これは動作しません。 1つは、HTMLをSFSafariViewControllerに「ロード」するだけでは、URLを提示する必要があります。第2に、SFSafariViewControllerはHTTPまたはHTTPSプロトコルのURLのみを受け付けるため、ローカルファイルやデータを読み取ることができません。 – brimstone

+0

これは、ページのインタラクティブなJSベースの側面をすべて終了させます – Alistra

関連する問題