Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
35
Help us understand the problem. What are the problem?

More than 3 years have passed since last update.

@yamataku29

プッシュ通知設定画面へ遷移させる為の実装

プッシュ通知設定とは

プッシュ通知設定は、ユーザー通知と呼ばれるローカル通知やプッシュ通知に関連した設定のことです。
iOSでは 設定 > 通知 > アプリ > 通知を許可 から、通知の受信設定の変更を行うことができます(下記)。

IMG_3500.PNG

アプリユーザーに対してプッシュ通知を届けるためには、ユーザーにプッシュ通知受信の許諾を得て、且つその後もこの通知受信設定をONの状態を維持して貰う必要があります。

一度プッシュ通知を受信拒否もしくは設定をOFFにしたユーザーは、自ら設定画面を開いてONに設定変更してくれることはほぼありません(少なくとも僕はほぼやりません)。

そのため、アプリ内で設定状況のON/OFFを取得して、OFFの場合だったらこの設定画面へ遷移させる。という実装を行います。

できたもの

通常のホーム画面から設定画面へ遷移するまでの操作と、今回の画面遷移の差を比較するため、両方の操作画像をお見せします。

また、この機能についてはGithubでも公開しているので、ぜひ活用してみて下さい。

ホーム画面から設定画面への遷移

homeScreen.gif

アプリ内から設定画面への遷移

Reloadボタン押下後にLabelのtextが変更されるまで10秒ほどかかります。

InApp.gif

両方の比較して分かるように、この設定画面へのディープリンクを設定するのと、そうでないのとではユーザーの手間が大きく異なります。

実装

通知設定画面へのディープリンク

下記の{YOUR_BUNDLE_ID}に自分のプロジェクトのBundle_IDをセットすることで、設定画面へ遷移させることができます。

// OSの通知設定画面へ遷移
if let url = URL(string:"App-Prefs:root=NOTIFICATIONS_ID&path={YOUR_BUNDLE_ID}") {
    if #available(iOS 10.0, *) {
        UIApplication.shared.open(url, options: [:], completionHandler: nil)
    } else {
        UIApplication.shared.openURL(url)
    }
}

また、App-Prefs:root=NOTIFICATIONS_IDは、通知設定画面へ遷移させるスキームですが、それ以外にもBluetooth写真とカメラなどの設定画面へ遷移させることもできます。

スキームに関しては【iOS10】設定画面に遷移するURLスキームの設定についてに一覧があるので、ぜひ見てみてください。

僕もこちらの記事を参考にさせていただきました。良い記事をありがとうございますm(_ _)m

通知設定の取得

通知設定の取得にはgetNotificationSettingsを使用しています。
この処理はUNUserNotificationCenterからユーザーの通知設定状態を取得していますが、非同期処理となるのでご注意下さい。

// 通知設定状況を取得
UNUserNotificationCenter.current().getNotificationSettings { (settings) in

    let targetViewController = vc as! ViewController

    switch settings.authorizationStatus {
    case .authorized:
        print("Allow notification")
        targetViewController.settingStatusLabel.text = "Allow notification"
        targetViewController.viewDidLoad()

    case .denied:
        print("Denied notification")
        targetViewController.settingStatusLabel.text = "Denied notification"

    case .notDetermined:
        print("Not settings")
        targetViewController.settingStatusLabel.text = "Not settings"
    }
}

パーミッションが必要な機能を提供しているアプリの場合、このディープリンクを使うことでよりユーザーが使いやすいものに改善できることもあると思うので、もし良ければ活用してみて下さい。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
35
Help us understand the problem. What are the problem?