LINEも使っている、無料のプッシュ通知サービス、OneSignalの導入方法を解説します!
今回はiOS編。
Android編はコチラ
iOS Provisioning Portalで本番用のProvisioning Profileを事前に作成しておいてください。
会員登録
まず、OneSignalの会員登録しましょう。
話はそれからだっ。
https://onesignal.com
「GET STARTED」をクリック
お好きな方法で。
「Using Google」だと2、3クリックだけで、一切の入力無しで会員登録が終わる所は、サスガ。
これは、ぜひ見習わなきゃいけない。
APNs(Apple PushNotifications)証明書の登録
会員登録が終わると、画面はもうプッシュ通知登録。
ここもサスガ。
まずは、プッシュ通知の証明書を作成して、OneSignalにアップロードする手順を説明します。
「Add a new app」をクリック
適当にアプリ名を入力
プラットフォームを選択
ちょっと面倒くさそうな画面が出てくる。
「ドキュメントを読んで下の項目をどうするのか学べ」とあるのでドキュメントのリンク「Read the documentation」をクリック。
新しく開いたリンク先のページを少し下にスクロールして
「OneSignal’s Provisionator Tool」をクリック
これでプッシュ通知証明書の作成ツール画面にきます。
「Get Started」をクリック。
iTunes ConnectのIDとパスワードを入力。
大丈夫。怖く無いよ。
ログインできたら
Step2 チーム
Step3 本番用のProvisioning Profile
を選択して「Generate」をクリック。
これだけでプッシュ通知の証明書が簡単に作成できちゃう。
一般的なやり方だとiTunes Connect行ったり、キーチェンアクセスで証明書発行したり、ターミナルでいじいじしたり大変なのに。。
徹底的に簡単にしているサービス精神に感動。
この作業をすると、本番用のProvisioning ProfileのStatusがInvalideになるので、iOS Provisioning Protalで
Edit > Generate > Done
でActiveにしておくのも忘れずに。
大きくAll done!と書いてあるすぐ下「Download p12 file」ボタンをクリックしてAPNs(Apple PushNotifications)証明書をダウンロード。
一緒に書いてあるPasswordもメモっておくこと。
前に面倒くさそうなドキュメントリンクを押したページに戻る。
「Choose File…」をクリック。
p12ファイルをアップロードすると、Password入力欄が出てくるのでそこに、先ほどメモったパスワードも入れて「Save」をクリック。
プラットフォームの選択
次にプラットーフォームの選択画面になるので、開発環境にあわせて、プラットフォームを選択して「NEXT」をクリック。
環境は以下の10種類と盛りだくさん。
ここでは「Native iOS」を選択しました。
- Native iOS
- Corona
- Unity
- Marmalade
- Adobe Air
- Phoegap
- Cocos2d-x
- Xamarin
- React Native
- Server API
Notification Service Extensionのセットアップ
ドキュメントを読んで、CocoaPodsを使ってSDKを入れろ、とあるので
「Read the documentation」リンクをクリック。
ここにある「Your App ID」は最後に、AppDelegate.swiftに追加するOneSignalライブラリの初期化処理に使うのでメモって置くこと。
リンク先のドキュメントに「Notification Service Extension」を追加しろ、とあるので追加していきます。
Notification Service Extensionとは、iOS10から導入されたExtensionで、プッシュ通知を受け取って表示する前に、処理を挟むことができるようになります。
たとえば通知を暗号で送って、端末側で複合するとか。
プッシュ通知を追加したいプロジェクトをXCodeで開いて
File > New > Target…
で開くTarget一覧から
「Notification Service Extension」
を選んで「Next」をクリック。
アイコンが似ている「Notification Content Extension」を選ばないように。
(ハマった。。)
Product Nameに
OneSignalNotificationServiceExtension
と入力したら「Finish」をクリック。
他の場所でもこの名前は使うので独自の名前にしないでこのままコピペが吉です。
すかさず、ExtensionをActivateするかの確認アラートがでるので
「Cancel」
をクリック。Cancelね。
Notification Service ExtensionはiOS10以上からなので、「OneSignalNotificationServiceExtension」の「Deployment Target」は10.0以上にすること。
そして、自動で生成されている
[ProjectRoot]/OneSignalNotificationServiceExtension/NotificationService.swift
ファイルの内容を以下の内容に置き換えます。
この時「OneSignal」ライブラリをまだ入れていないのでエラーが出るが、気にしないこと。
import UserNotifications import OneSignal class NotificationService: UNNotificationServiceExtension { var contentHandler: ((UNNotificationContent) -> Void)? var receivedRequest: UNNotificationRequest! var bestAttemptContent: UNMutableNotificationContent? override func didReceive(_ request: UNNotificationRequest, withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void) { self.receivedRequest = request; self.contentHandler = contentHandler bestAttemptContent = (request.content.mutableCopy() as? UNMutableNotificationContent) if let bestAttemptContent = bestAttemptContent { OneSignal.didReceiveNotificationExtensionRequest(self.receivedRequest, with: self.bestAttemptContent) contentHandler(bestAttemptContent) } } override func serviceExtensionTimeWillExpire() { // Called just before the extension will be terminated by the system. // Use this as an opportunity to deliver your "best attempt" at modified content, otherwise the original push payload will be used. if let contentHandler = contentHandler, let bestAttemptContent = bestAttemptContent { OneSignal.serviceExtensionTimeWillExpireRequest(self.receivedRequest, with: self.bestAttemptContent) contentHandler(bestAttemptContent) } } }
CocoaPodsでOneSignalライブラリを追加する
次にOneSignalライブラリーをCocoaPodsで追加します。
CocoaPods自体のインストール方法は割愛。
次の項目をPodfileに追加します。
target 'project_name' do pod 'OneSignal', '>= 2.6.2', '< 3.0' end target 'OneSignalNotificationServiceExtension' do pod 'OneSignal', '>= 2.6.2', '< 3.0' end
追加できたら、ターミナルでコマンド実行
pod repo update pod install
僕の環境では、pod installでエラーが出たので「use_frameworks!」を追加。
同じようにエラーが出た人は追加をば。
target 'project_name' do use_frameworks! pod 'OneSignal', '>= 2.6.2', '< 3.0' end target 'OneSignalNotificationServiceExtension' do use_frameworks! pod 'OneSignal', '>= 2.6.2', '< 3.0' end
僕の環境では、ここでコンパイルをしてみたら他のライブラリーが読めないというエラーが。
OneSignalNotificationServiceExtension ターゲットの
Build Settings > Swift Compiler – General > Objective-C Bridge Header
に、勝手に追加された、既存のBridge Headerへのパスが悪さをしていたので、消して、設定を空にしたら直りました。
Push通知の有効化 (Capabilities)
次にプロジェクト設定から、プッシュ通知を有効にします。
Cocoapodsのinstallを実行した後はワークスペースファイル(.xcworkspace)ができるので、そちらを開いて続きの作業を進めます。
プロジェクトの「Capabilities」を開いて
- Push Notifications
- Background Modes
をON。
Background Modes は「Remote notifications」にチェックを入れるのも忘れずに。
AppDelegateにOneSignalの初期化コード追加
最後に、OneSignalライブラリの初期化処理を追加します。
AppDelegate.swiftを開いてdidFinishLaunchingWithOptionsに次のコードを追加。
「YOUR_APP_ID」には「Notification Service Extensionのセットアップ」の項でメモって置いたIDを入れる。
import OneSignal func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { let onesignalInitSettings = [kOSSettingsKeyAutoPrompt: false] // Replace 'YOUR_APP_ID' with your OneSignal App ID. OneSignal.initWithLaunchOptions(launchOptions, appId: "YOUR_APP_ID", handleNotificationAction: nil, settings: onesignalInitSettings) OneSignal.inFocusDisplayType = OSNotificationDisplayType.notification; // Recommend moving the below line to prompt for push after informing the user about // how your app will use them. OneSignal.promptForPushNotifications(userResponse: { accepted in print("User accepted notifications: \(accepted)") }) return true }
開通確認
以上が完了したら、SDKインストールのガイドに飛ぶ前に開いていたダイアログにある
「Check Subscribed Users」ボタンをクリックして開通チェックをします。
この時、必ずアプリを実機に入れてテストしてください。
シミュレータでは確認できません。
ちゃんと設定が一通りできているとCongratulation表示がされます。
「Done」を押して設定を完了。
お疲れ様でした〜😉