[iOS 9] SFSafariViewController の概要

80件のシェア(ちょっぴり話題の記事)

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

iOS 9 で追加された SFSafariViewController について調べてみたので紹介します。

特徴

SFSafariViewController はウェブページを表示するための View Controller です。

  • Safari のような UI を使用できる
    • ツールバー
    • ページロード中のプログレス表示
    • SSL暗号化通信の時にアドレスバーに鍵アイコンが表示される
  • Safari の機能を使用できる
    • Safari AutoFill (クレジットカード、パスワード、連絡先)
    • Safari Reader
    • Content Blocking
  • クッキーなどのデータを Safari と共有できる
    • 広告トラッキングなどの目的でアプリ初回起動直後にSafariに飛ばす必要がなくなる
  • 提供されるメソッド・プロパティは少ない
    • UIKit の UIImagePickerController を使うときのようなお手軽さ
    • ウェブページを全面表示するのに適している

SFSafariViewController

  • 定義されているメソッドはイニシャライザのみ、プロパティは1つ
@property (nonatomic, weak, nullable) id<SFSafariViewControllerDelegate> delegate;

- (instancetype)init NS_UNAVAILABLE;
- (instancetype)initWithCoder:(NSCoder *)aDecoder NS_UNAVAILABLE;
- (instancetype)initWithNibName:(nullable NSString *)nibNameOrNil bundle:(nullable NSBundle *)nibBundleOrNil NS_UNAVAILABLE;
- (instancetype)initWithURL:(NSURL *)URL entersReaderIfAvailable:(BOOL)entersReaderIfAvailable NS_DESIGNATED_INITIALIZER;
- (instancetype)initWithURL:(NSURL *)URL;

SFSafariViewControllerDelegate

  • 定義されているメソッドは2つ
    • UIActivity 関連のメソッド
    • 「Done」ボタンを押した際に呼ばれるメソッド
- (NSArray<UIActivity *> *)safariViewController:(SFSafariViewController *)controller activityItemsForURL:(NSURL *)URL title:(nullable NSString *)title;
- (void)safariViewControllerDidFinish:(SFSafariViewController *)controller;

サンプルコード

SafariServices フレームワークをインポートして、SFSafariViewController のインスタンスを作成して、表示するだけです。

クラスを SFSafariViewControllerDelegate に適合させて、safariViewControllerDidFinish メソッドを実装すると、SFSafariViewController 上の Done ボタンのタップを検知できます。

#import "ViewController.h"

@import SafariServices;

@interface ViewController () <SFSafariViewControllerDelegate>
@end

@implementation ViewController

- (IBAction)buttonDidTouchUpInside:(id)sender
{
    SFSafariViewController *safariViewController =
    [[SFSafariViewController alloc] initWithURL:[NSURL URLWithString:@"https://classmethod.jp/"]];

    [self presentViewController:safariViewController
                       animated:YES
                     completion:nil];

    safariViewController.delegate = self;
}

- (void)safariViewControllerDidFinish:(SFSafariViewController *)controller
{
    [self dismissViewControllerAnimated:YES completion:nil];
}

@end

まとめ

以上のように、SFSafariViewController はコードを数行書くだけで使用できます。単にウェブページを表示したい場合であれば、UIWebView や WKWebView を使用するよりもかなり楽です。活用していきたいです。

参考資料