CodeIQ MAGAZINECodeIQ MAGAZINE

iOS 7対応アプリを作るなら知っておきたい「UXを向上させるBackground Fetchの使い方」 #ios7yahoo

2013.12.04 Category:勉強会・イベント Tag: , ,

  • 3
  • このエントリーをはてなブックマークに追加
image1

iOS 7から追加されたバックグラウンドで通信やコンテンツの更新ができるBackground Fetch。

このアプリのUX向上に役立つといわれるBackground Fetchの概要や実装方法について、ヤフー平松亮介さんに寄稿をいただきました。
by 馬場美由紀 (CodeIQ中の人)

Background FetchでアプリのUXを向上させる

iOS 7からBackground FetchというAPIが新たに追加されました。
アプリが起動されていない場合にも、バックグラウンドで通信やコンテンツの更新ができるAPIで、アプリのUX向上に役立つと考えられます。
すでにSmartNewsやPinterestでも導入されており、iOS 7対応のアプリをつくる上では知っておかなくてはならない機能です。

この記事では、Background Fetchの概要や実装方法について紹介します。

アプリのバックグラウンド処理

バックグラウンド処理とはユーザーが操作中でないアプリに処理をさせることを意味し、これを実現するにはMultitasking APIを利用する必要があります。
iOS 6まではAudioやLocation Serviceなど限られたシーンでのみ使えるものでしたが、iOS 7からは汎用的な3つのAPIが追加されています。そのAPIの中の1つがBackground Fetchです。

Background Fetchの概要

ニュースアプリを例にすると、これまでは「アプリの起動」→「コンテンツ更新」→「表示」という順序で処理を行っていました。
しかし、このコンテンツ更新の部分はユーザーにとってはただの遅延であり、ストレスを与えてしまいます。

そこでBackground Fetchを実装しておくと、ユーザーがアプリを起動していない時でも、OSが定期的にバックグラウンドでアプリを起こし、コンテンツを更新しておいてくれます。そのためユーザーはアプリ起動直後に、待ち時間なしに最新のコンテンツを楽しむことができます。

発生頻度はOS側に委託されており、ユーザーの行動パターンから予測され、最適な間隔で処理が呼ばれるとされています。

例えば上の図のようにユーザがアプリを使っていた場合、OSは「ニュースアプリは朝に使う」「チャットアプリは夜に使う」と学習し、そのタイミングに合わせてBackground Fetchを呼び出します。

Background Fetchを実装する

アプリへの実装方法について説明します。まず、XcodeのCapabilitiesを開き、Background Modeのfetchにチェックをいれます。

続いて、AppDelegateの中に以下のように記述します。

objc
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // Background Fetchが呼ばれる「最短の間隔」をセット
    // 必ずしもこの間隔で呼ばれるのではないので注意
    // "UIApplicationBackgroundFetchIntervalMinimum" はOSが設定する最短時間を意味する
    [[UIApplication sharedApplication] setMinimumBackgroundFetchInterval:
     UIApplicationBackgroundFetchIntervalMinimum];

    return YES;
}

application:didFinishLaunchingWithOptionsの中でsetMinimumBackgroundFetchIntervalを呼びます。これはBackground Fetchの最短間隔をセットするメソッドです。

  • UIApplicationBackgroundFetchIntervalMinimum(OSの定める最短間隔)
  • UIApplicationBackgroundFetchIntervalNever(Fetchは呼ばれない)

とが用意されており、BackgroundFetchの有効or無効を切り替えるためのメソッドして使います。また、上記の値の他に任意のNSTimerIntervelを指定することも可能です。

以上の準備が完了したら、次はBackground Fetchの発生時に実行したい処理を実装しましょう。application:performFetchWithCompletionHandlerの中にコンテンツ更新などの処理を書き、最後にcompletionHandlerを呼んでデータ更新の成功/失敗をOSに伝えます。

objc
// Background Fetch用の処理メソッド
- (void)application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
    // Backgroundで行いたい処理を記述(コンテンツの更新処理など)

    // 完了時に呼ぶ
    completionHandler(UIBackgroundFetchResultNewData);
}

completionHandlerの引数には以下のいずれかを渡します。

typedef enum : NSUInteger {
    UIBackgroundFetchResultNewData,  // 新しいコンテンツの更新に成功
    UIBackgroundFetchResultNoData,   // 新しいコンテンツはなかった
    UIBackgroundFetchResultFailed    // 通信エラーなどによりコンテンツ更新に失敗
} UIBackgroundFetchResult; 

BackgroundFetchResultをOSに伝えることにより、Background Fetchの発生タイミングがより最適化されます。また、AppSwitcher(ホームボタンをダブルタップした際の画面)のsnapshotも更新されます。

Background Fetchをデバッグする

デバッグは以下のいずれかの方法で行います。

  • XcodeのDebug > Simulate Background Fetch を実行
  • Edit Scheme > Options > Background Fetch にチェック


Background Fetchを使う際の注意事項

端末の状態によっては動作しない

AppSwitcherでユーザーがアプリのプロセスを落とした場合、Background Fetchは呼ばれません。また、設定の「一般 > Appのバックグラウンド更新」をOFFにしている場合も同様です。Background Fetchを実装しているが呼ばれない場合、まずはここを確認しましょう。

iOS 6/iOS 7の両対応

Background FetchはiOS 7からのAPIですので、iOS 6では使えません。両対応させたい場合には、実行時のOSのバージョンやrespondsToSelectorを使って出し分けが必要です。

勝手にログアウトされてしまう問題

キーチェーンにアクセスできないロック時にもBackground Fetchが発生してしまうため、ログインを要するサービスでは不具合を発生させてしまうことがあります。その場合はapplicationProtectedDataDidBecomeAvailable:をフックにして処理の出し分けを行いましょう。
詳しくはリンク先を参照ください。

以上の通り、OSのバージョンやユーザー設定に左右されるBackground Fetchは便利ではありますが必殺の技ではありません。
あくまで”向上”させる機能であると考えて設計を行うのが良さそうです。

参考資料

本記事についてのスライド、サンプルコードは以下をご覧ください。

その他にもYahoo! JAPAN Tech BlogではiOS 7勉強会に関する様々な資料を公開しています。ぜひご覧ください。

寄稿者プロフィール 平松 亮介
ヤフー株式会社で働くiOS Developer。ネイティブアプリ開発に特化した部署であるアプリ開発室に所属し、世界600万ダウンロードの人気フォト加工アプリ「Petapic」のiOSアプリ開発を行う。

twitter: @himara2
ブログ: http://himaratsu.hatenablog.com/

iOS6から導入されたAuto Layout問題に挑戦してみない?

ヤフー山口恭兵さんからのiOSの問題が出題中です。iOSならお任せ!というエンジニアの皆さん、ぜひ挑戦してみてくださいね。

Autolayoutを設定して画面のサイズ・向きの変化に対応できるレイアウトを作成する問題です。

  • 締切4月14日(月)AM10:00まで
  • 問題挑戦はこちらから

CodeIQコード銀行にあなたのコードを預けてみませんか?

  • CodeIQコード銀行ではあなたのコードを財産と考えます。
  • お預かりいただいたコードは、CodeIQコード銀行がしっかり評価し、フィードバックいたします。
  • 当コード銀行にお預けいただいたコードは、企業がみてスカウトをかける可能性があります。
  • 転職したい方や将来転職することを考えている方で、今の自分のスキルレベルを知りたい方はぜひ挑戦してみてください。
  • 企業からスカウトがきたら困る人は挑戦しないでください。

興味を持った方はこちらからチャレンジを!

  • 3
  • このエントリーをはてなブックマークに追加

■関連記事

ヤフーがAndroidアプリに関する技術や開発事例を共有する「CAMPFIRE Android」を開... Yahoo!知恵袋をRxJavaでフルリニューアル ヤフーのAndroidにおける技術情報を共有するMeetup「CAMPFIRE Android #1」が、4月19日にヤフーのコワーキングスペース「LODGE」で開催された。 「Yahoo! Japanでの取り組みや開発のコツを知ることができる...
聖夜のアイデアソン -Pepper Loves LINE BOT-... LINE BOT AWARDSとは 「LINE BOT AWARDS」とは、LINEのchatbot開発促進及びユーザーへの普及を目的に開催するAwards。個人・法人問わず誰でも参加可能なAwardsで、応募〆切は2月22日です。 ▲▲LINE株式会社 ビジネスプラットフォーム事業室 戦略企画...
最高賞金1000万円!LINE・砂金信一郎氏に聞いた「LINE BOT AWARDS」の全容と狙い─... LINE・砂金信一郎氏がプロデュースするビッグイベント これまでサービスを提供する企業がユーザーと密接な関係を結ぶためには、スマホアプリを提供してユーザーに使ってもらうというのが一つの方法だった。 しかし、アプリ開発には手間がかかるだけでなく、一度はダウンロードしてみたユーザーも、毎日それを使う...
マルチプラットフォームで動く「Electron」は本当に使える技術なのか?... Electronはどこがすごいのか? 最初に登壇したのは、Node.js日本ユーザーグループ代表の古川陽介氏。「Electronアプリの作り方」というタイトルでセッションを行った古川氏は、会社でも「Electronを使ってアプリを開発している」と語る。 ▲Node.js 日本ユーザーグループ代表...
実数論、微分方程式、代数、離散数学、トポロジー「プログラマのための数学勉強会」第4回レポート... 今回のテーマと目次 「プログラマのための数学勉強会」第4回からは、各セッションの難易度を星3つで示すようになった。 何もないところから数を作る(集合論、実数論) 難易度★☆☆ 今日からはじめる微分方程式(微分方程式、ラプラス変換) 難易度★★☆ 忙しい人のための楕円曲線入門(代数...
物理における『微分方程式』の活用─プログラマのための数学勉強会6... 物理における微分方程式の活用 久徳浩太郎氏が所属している理化学研究所 iTHES(理論科学連携研究推進グループ)は、理論化学を研究しているグループ。また同グループでは産学連携も積極的に推進しているという。 そんな中で久徳氏は宇宙物理や理論物理を研究している。つまり今回唯一の物理屋。しかし「物理屋...

今週のPickUPレポート

新着記事

週間ランキング

CodeIQとは

CodeIQ(コードアイキュー)とは、自分の実力を知りたいITエンジニア向けの、実務スキル評価サービスです。

CodeIQご利用にあたって
関連サイト
codeiq

リクルートグループサイトへ