head_hexagonはにらぼ☆てっくtale_hexagon
Tag » swift
ブログ画像

iOS10に対応した 番外編

こんにちは、nagashimaです。
swift2.3では問題ありませんでしたが、swift3ではデバイストークンの取得方法が変わり以前までの方法では取得できなくなりました。今回は次回以降やるであろうそちらをメモとして残します。 以前まではregisterForRemoteNotifications()を呼ぶとトークン取得成功時に func application(application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData){} がコールバックされ、deviceToken.descriptionからデバイストークンを取得していたと思います。 swift3からはdeviceTokenの型がDataに変更され以下が呼ばれます。 func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data){} Dataからトークンを取得するのに幾つか方法はあるみたいですが、 let token = deviceToken.map { String(format: "%.2hhx", $0) }.joined(); でDataからトークンを取得できます。

Posted by nagashima on 2017/01/22 under Development

ブログ画像

iOS10に対応した その2

こんにちは、nagashimaです。
今回はメインのpush周りの実装になります。 iOS9とiOS10でざっくりと以下の違いがあります。
・iOS9ではForeground時に通知が作られず、ローカル通知を作る必要があった
・iOS9ではリモートプッシュから開いた時はapplication(UIApplication, didReceiveRemoteNotification)がコールバックされる ・iOS10ではForeground時にも通知が作られ、ローカル通知を作る必要はない
・iOS10では通知から開いた時、アプリにコールバックされる関数が異なる iOS10からuserNotificationCenterが追加されそちらで受け取るとiOS9とうまく切り分けることができます。 AppDelegateにUNUserNotificationCenterDelegateを追加して
registerUserNotificationSettingsの代わりに次のコードを追加してデバイストークンを取得します。 UNUserNotificationCenter.currentNotificationCenter().delegate = self UNUserNotificationCenter.currentNotificationCenter().requestAuthorizationWithOptions( [UNAuthorizationOptions.Badge, UNAuthorizationOptions.Sound, UNAuthorizationOptions.Alert], completionHandler: { (granted, error) in if error != nil { return } //エラー時の処理 }) リモートプッシュが来た時はアプリがForeground時には func userNotificationCenter(center: UNUserNotificationCenter, willPresentNotification notification: UNNotification, withCompletionHandler completionHandler: (UNNotificationPresentationOptions) -> Void){} が呼ばれます。
notification.request.content.userInfoにuserinfoのデータが入っているので取得して操作することができます。 completionHandler([UNNotificationPresentationOptions.Alert, UNNotificationPresentationOptions.Sound]) を呼ぶとことで通知も作ってくれます。各自でローカル通知を作る必要がなくなりました! 通知から起動した時は func userNotificationCenter(center: UNUserNotificationCenter, didReceiveNotificationResponse response: UNNotificationResponse, withCompletionHandler completionHandler: () -> Void){} が呼ばれます。
response.notification.request.content.userInfoに同じくuserinfoのデータが入っているので画面遷移など好きなように操作できます。
処理が完了した時にはcompletionHandler()を呼ぶようにしましょう。

Posted by nagashima on 2017/01/21 under Development

iOS10に対応した その1

こんにちは、nagashimaです。主にネイティブアプリの開発をしています。 iOS10でプッシュ周りの挙動が変わりました。そのためXcode7で作っているアプリだとうまく動かないようになりました。今更ですが、iOS10対応としてXcodeとswiftのバージョンアップ時の対応を行ったのでその備忘録です。
今回はswift2.3に対応します。 その1はXcode8でビルドできる部分までを行います。 1.Podファイルの修正 ライブラリはpodを使っているので、まずはそちらを対応させます。 各ライブラリをswift2.3に対応したバージョンにします。バージョンは各ライブラリのリリースノートに書いていると思うのでそちらで確認します。
podファイルにライブラリがswift2.3であること明示する。 post_install do |installer| installer.pods_project.targets.each do |target| target.build_configurations.each do |config| config.build_settings['SWIFT_VERSION'] = '2.3' end end end をpodfileに追加してpodのアップデートを行います。 2.コンバートする podの更新後以下の手順で対応させます。
1. Xcode8で開き、コンバートは後で行うので一旦laterを選択する。

2. Edit -> Convert -> To CurrentSwift Syntax…を選択する。
3. Convert toSwift 2.3を選択しコンバートする。
4. コンバート完了後、エラーが出てるけどとりあえず無視しつつ、
project -> Build Settings ->  Swift Compiler -Version -> Use Legacy Swift Language Versionを Yesにする。
5. ビルドする。
6. 残っているエラーを解消する(単純なエラーしかないはず) これでビルド・実行で無事起動できました。

Posted by nagashima on 2017/01/20 under Development