概要
Amazon SNS で Mac OS X アプリに Push 通知が送信できるようになりました! を試していましたが、デバイストークンの取得が Objective-C だったのと、Swift でデバイストークンを取得する方法が中々見つからなかったのでこの記事にメモしておこうと思います。
環境
MacBook Pro (Retina, 13-inch, Early 2015)
macOS High Sierra 10.13.1
Xcode Version 9.2
Swift version 4.0.3 (swiftlang-900.0.74.1 clang-900.0.39.2).
デバイストークンの取得
Apple公式 では下記のように書いてありますが、このままではコンパイルが通りません。
func applicationDidFinishLaunching(_ aNotification: Notification) {
// ユーザーとのやり取りを最初に設定。
self.configureUserInteractions()
NSApplication.shared().registerForRemoteNotifications(matching: [.alert, .sound])
}
// リモート通知の登録処理。
func application(_ application: NSApplication,
didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
// カスタムメソッドを使って、トークンをプロバイダに転送。
self.forwardTokenToServer(token: deviceToken)
}
func application(_ application: NSApplication,
didFailToRegisterForRemoteNotificationsWithError error: Error) {
// トークンは現時点で取得不能。
print("Remote notification support is unavailable due to error: \(error.localizedDescription)")
}
理由は単純で、 configureUserInteractions()
と forwardTokenToServer()
は自分で実装する前提のコードだからでした。(そもそもこのコードはデバイストークン取得用では無い?)
下記のように書き換えることで、ログ情報にデバイストークンが出力されるようになります。
import Cocoa
@NSApplicationMain
class AppDelegate: NSObject, NSApplicationDelegate {
func applicationDidFinishLaunching(_ aNotification: Notification) {
NSApplication.shared.registerForRemoteNotifications(matching: [.alert, .sound])
}
// リモート通知の登録処理。
func application(_ application: NSApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
print(deviceToken.reduce("", {$0 + String(format: "%02X", $1)}))
}
func application(_ application: NSApplication, didFailToRegisterForRemoteNotificationsWithError error: Error) {
// トークンは現時点で取得不能。
print("Remote notification support is unavailable due to error: \(error.localizedDescription)")
}
}
参考URL: https://www.queryoverflow.gdn/query/swift-obtaining-a-device-token-in-ios-27_50011909.html
まとめ
雑な記事で申し訳ありませんが、誰かの助けになればと思います。
また、p12ファイルの生成等の手順はこの記事が参考になるので良いと思います。