ちょっと話題の記事

[iOS 9] SFSafariViewController の概要

2015.07.01

この記事は公開されてから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 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 *)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 ()
@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 を使用するよりもかなり楽です。活用していきたいです。

参考資料