iOS

OneSignal導入手順 【iOS編】

onesignal 見出し

LINEも使っている、無料のプッシュ通知サービス、OneSignalの導入方法を解説します!

今回はiOS編。

Android編はコチラ

onesignal 見出し
OneSignal導入手順 【Android編】LINEも使っている、無料のプッシュ通知サービス、OneSignalの導入方法を解説します! 今回はAndroid編。 iO...

 

前提条件

iOS Provisioning Portalで本番用のProvisioning Profileを事前に作成しておいてください。

 

会員登録

まず、OneSignalの会員登録しましょう。
話はそれからだっ。
https://onesignal.com

「GET STARTED」をクリック
GET STARTED

お好きな方法で。
会員登録方法の選択

「Using Google」だと2、3クリックだけで、一切の入力無しで会員登録が終わる所は、サスガ。
これは、ぜひ見習わなきゃいけない。

 

APNs(Apple PushNotifications)証明書の登録

会員登録が終わると、画面はもうプッシュ通知登録。
ここもサスガ。

まずは、プッシュ通知の証明書を作成して、OneSignalにアップロードする手順を説明します。

「Add a new app」をクリック
Add new app

適当にアプリ名を入力
アプリ名の入力

プラットフォームを選択
プラットフォームの選択

ちょっと面倒くさそうな画面が出てくる。
「ドキュメントを読んで下の項目をどうするのか学べ」とあるのでドキュメントのリンク「Read the documentation」をクリック。
プッシュ通知証明書のアップロード画面

新しく開いたリンク先のページを少し下にスクロールして
「OneSignal’s Provisionator Tool」をクリック
手順ドキュメント

これでプッシュ通知証明書の作成ツール画面にきます。
「Get Started」をクリック。
OneSignal's Provisionator

iTunes ConnectのIDとパスワードを入力。
大丈夫。怖く無いよ。
iTunes connectにログイン

ログインできたら
Step2 チーム
Step3 本番用のProvisioning Profile
を選択して「Generate」をクリック。
Provisioning Profileの選択

これだけでプッシュ通知の証明書が簡単に作成できちゃう。

一般的なやり方だと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ファイルのアップロード

p12ファイルをアップロードすると、Password入力欄が出てくるのでそこに、先ほどメモったパスワードも入れて「Save」をクリック。
パスワード入力と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ライブラリの初期化処理に使うのでメモって置くこと。
SDKのインストール

リンク先のドキュメント「Notification Service Extension」を追加しろ、とあるので追加していきます。

Notification Service Extensionとは、iOS10から導入されたExtensionで、プッシュ通知を受け取って表示する前に、処理を挟むことができるようになります。
たとえば通知を暗号で送って、端末側で複合するとか。

プッシュ通知を追加したいプロジェクトをXCodeで開いて
File > New > Target…
で開くTarget一覧から
「Notification Service Extension」
を選んで「Next」をクリック。

アイコンが似ている「Notification Content Extension」を選ばないように。
(ハマった。。)

targetの選択Product Nameに
OneSignalNotificationServiceExtension
と入力したら「Finish」をクリック。

他の場所でもこの名前は使うので独自の名前にしないでこのままコピペが吉です。
ProductNameの入力

すかさず、ExtensionをActivateするかの確認アラートがでるので
「Cancel」
をクリック。Cancelね。
ExtensionのActivate確認アラート

Notification Service ExtensionはiOS10以上からなので、「OneSignalNotificationServiceExtension」「Deployment Target」10.0以上にすること。
targetの設定

そして、自動で生成されている
[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」にチェックを入れるのも忘れずに。
Capabilitesのセット

 

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」を押して設定を完了。
Push通知の開通テスト
お疲れ様でした〜😉