20210315のiOSに関する記事は5件です。

Xcode シュミレーター @が打てない時の対処法

Xcodeのシュミレーターで「@」が打てない!!!

iOSのシュミレーターでキーボードから記号を入力すると、不思議なことに@[になったり、なんだか色々とおかしくなってた。。。

別に/とか:みたいな記号はユーザー入力で使われることは滅多に無いのでいいんですが、、、

@はログイン周りの処理で使うので、@が打てないのは困ります!!

かといって、シュミレーター内のキーボードを毎回使うのも面倒やし:confused:

解決法

スクリーンショット 2021-03-15 22.41.41.jpg

|/O>Keyboard>Connect Hardware Keyboardのチェックを外す→もう一度チェックをつける

よくわかりませんが、これだけで正常になりました。。。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[Swift] Firebase-Authentication(新規登録)を使ってみた

概要

Firebaseを使ってみたい!ということで、
サンプルアプリを通して学習していきます。

第一回目は、認証機能を用意してくれているAuthenticationの新規ユーザー登録です。
今回はメールアドレスでの登録を使いました。

※注意
各UIView(部品)はコードで実装しております。
Storyboardを使用しているからは注意してください。

完成品

サクッとコードがみたい場合はこちらです。
https://github.com/ksy781/FirebaseAuthentication/blob/main/FirebaseAuthentication/ViewController.swift

環境

ツール バージョン
Xcode 12.4
Swift 5.3.2
Cocoapods 1.10.1
FirebaseAuth 7.7.0

事前準備(設定)

  • CocoapodsでFirebaseAuthをインストールしておきます。
  • Firebase側でアプリ登録をしておきます。
  • Firebase側のメール認証を有効化します。 スクリーンショット 2021-03-15 16.09.12.png

実践

  • Firebaseのインポート設定
    • AppDelegateファイルへFirebaseをインポートします。
    • FirebaseApp.configure()を記載します。
       ⇨ これでアプリ内でFirebaseが用意してくれている設定を利用することができます。
AppDelegate.swift
import UIKit
import Firebase

@main
class AppDelegate: UIResponder, UIApplicationDelegate {

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        FirebaseApp.configure()
        return true
    }
  • 登録機能の実装
    • ボタンを押下したらFirebase側へ入力内応を登録(通信)してくれます。
    • createUserはFirebase側で用意したメソッドで、その中に入力値とエラーハンドリングを記載します。
ViewController.swift
// MARK: - Actions
@objc func didTapLoginButton() {
    guard let email = emailTextField.text else { return }
    guard let password = passwordTextField.text else { return }

    Auth.auth().createUser(withEmail: email, password: password) { (authResult, error) in
        if let error = error {
            self.alert(settitle: "エラー", setmessage: "新規作成に失敗しました!")
            return
        }

        guard let uid = authResult?.user.uid else { return }
        self.alert(settitle: "成功", setmessage: "新規作成しました!")
    }
}

無事、登録できました!
スクリーンショット 2021-03-15 19.22.48.png

ここからどんどんFirebase使ってみたいと思います!

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Firebaseを使用してiOSアプリにプッシュ通知機能を実装する

はじめに

FirebaseのCloud Messagingを使用してアプリにプッシュ通知を実装します。

前提条件

Apple Developer Programの登録と、Firebaseを導入していること前提で書いていきます。

プッシュ通知の仕組み

iOSの場合、Appleが提供しているプッシュ通知サービスAPNs(Apple Push Notification Service)を介して
プッシュ通知を配信しています。

push_Notification.png
出典:【Swift】iOSアプリにプッシュ通知を実装したサンプルアプリを作ってみた

このサービスのおかげでCloud Messagingからプッシュ通知が送れるという訳です。

実装する前に

まずは、Cloud Messagingを使用するために必要なライブラリをインストールしましょう。

因みに自分はSPMでインストールしました。
Swift Package Manager (SwiftPM) を使ってみよう ~導入編~

実装

・Capabilityを設定する

まずはプッシュ通知に必要なCapabilityを設定しましょう。

1.TARGETS > Signing & Capabilities > + Capability をクリックする
2.Background ModesとPush Notificationsを追加する
3.Background Modes内のRemote notifiationsにチェックする

以上の流れを終えると、プロジェクト内にプロジェクト名.entitlementsファイルが追加されます。
スクリーンショット 2021-03-15 14.57.17.png

このファイルは、プッシュ通知の登録時に開発環境と本番環境のどちらのAPNsを使用するかを自動的に指定します。
APS Environment Entitlement

・APNs認証キーを発行する

APNsを介してCloud Messagingに接続するにはAPNs認証キーを発行して
Firebaseにアップロードしなくてはいけません。

1.Apple Developer Account > Certificates, Identifiers & Profiles > Keys > Keys+をクリックする
2.ページ内でKey Nameを入力 > Apple Push Notifications service (APNs)をチェック > continueをクリックする
3.APNs認証キーが発行されたらダウンロードする

これでFirebaseにアップロードするAPNs認証キーが取得できました。

・Firebaseプロジェクト内でAPNs認証キーをアップロードする

それでは、APNs認証キーをFirebaseにアップロードしましょう。

1.「プロジェクトの概要」の左にある歯車マークから「プロジェクトを設定」をクリックする
2.ページ上部にあるCloud Messaging > iOSアプリの構成 > APNs認証キーからアップロードする
3.APNs認証キーをアップロードする際に必要なキーIDとチームIDを入力してアップロードを完了させる

キーIDは、Apple Developer AccountのKeys > 自分のAPNs認証キー > Key IDから確認できます。

チームIDは、Apple Developer AccountのIdentifiers > 自分のプロジェクト > App ID Prefixから確認できます。

・実装コードを書く

必要最低限のコードのみを書きますのでご了承下さい。

import UIKit
import Firebase

@main
class AppDelegate: UIResponder, UIApplicationDelegate {

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        // Coloud Messagingのデリゲート
        Messaging.messaging().delegate = self

        // 通知関連のアクションを処理
        UNUserNotificationCenter.current().delegate = self

        // 通知の許可をユーザーにリクエストする
        UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .badge, .sound]) { (granted, error) in
            if let error = error {
                print(error.localizedDescription)
                return
            }
            if granted {
                // aregisterForRemoteNotificationsは必ずメインスレッドで実行する
                DispatchQueue.main.async {
                    // Appleプッシュ通知サービスを介してリモート通知を受信するための登録を行う
                    application.registerForRemoteNotifications()
                }
            }
        }
        return true
    }
}

extension AppDelegate: UNUserNotificationCenterDelegate {
    // アプリがフォアグラウンドで通知を受け取ったときに呼ばれる
        func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
            let userInfo = notification.request.content.userInfo
            print("========== Print full message =========")
            print(userInfo)
            print("===============")

            // プッシュ通知の表示方法を決める
            completionHandler([.banner, .sound, .badge])
        }
}
extension AppDelegate: MessagingDelegate {
    // FCMトークンが利用可能になったり、更新されたりすると呼ばれる
    func messaging(_ messaging: Messaging, didReceiveRegistrationToken fcmToken: String?) {
        print("===============")
        print("Firebase registration token: \(String(describing: fcmToken))")
        print("===============")
    }
}

因みにiOS10以降なら上記のコードで大丈夫ですが、iOS10未満だと実装コードが変わってきます
iOS で Firebase Cloud Messaging クライアント アプリを設定する | Firebase

・プッシュ通知を送る

Firebaseプロジェクト内のCloud Messagingからプッシュ通知を送りましょう。

テスト送信をしたい場合は、テスト メッセージを送信から送ることができます。
スクリーンショット 2021-03-15 15.58.06.png

テスト メッセージを送信をクリックし、FCM登録トークンを追加を入力すると
テスト送信を端末に送ることが出来ます。
スクリーンショット 2021-03-15 16.01.38.png

因みにFCM登録トークンは先ほど記述したデリゲートメソッドから吐き出されます↓

    func messaging(_ messaging: Messaging, didReceiveRegistrationToken fcmToken: String?) {
        print("===============")
        print("Firebase registration token: \(String(describing: fcmToken))")
        print("===============")
    }

以下のようなプッシュ通知が端末に送られてきたら成功です。
IMG_6625.jpg

おわりに

画像や動画もプッシュ通知と一緒に送ることができますが、調べてみると難しそうでした。

もし、実装できたらQiitaにまとめようと思います。

参考

Firebase Cloud Messagingを使ってアプリに通知機能を実装する
Push Notifications with Firebase iOS Swift 5 & Xcode 11.5 | Youtube

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Firebaseを使用してiOSアプリにプッシュ通知を実装する

はじめに

FirebaseのCloud Messagingを使用してアプリにプッシュ通知を実装します。

前提条件

Apple Developer Programの登録と、Firebaseを導入していること前提で書いていきます。

プッシュ通知の仕組み

iOSの場合、Appleが提供しているプッシュ通知サービスAPNs(Apple Push Notification Service)を介して
プッシュ通知を配信しています。

push_Notification.png
出典:【Swift】iOSアプリにプッシュ通知を実装したサンプルアプリを作ってみた

このサービスのおかげでCloud Messagingからプッシュ通知が送れるという訳です。

実装する前に

まずは、Cloud Messagingを使用するために必要なライブラリをインストールしましょう。

因みに自分はSPMでインストールしました。
Swift Package Manager (SwiftPM) を使ってみよう ~導入編~

実装

・Capabilityを設定する

まずはプッシュ通知に必要なCapabilityを設定しましょう。

1.TARGETS > Signing & Capabilities > + Capability をクリックする
2.Background ModesとPush Notificationsを追加する
3.Background Modes内のRemote notifiationsにチェックする

以上の流れを終えると、プロジェクト内にプロジェクト名.entitlementsファイルが追加されます。
スクリーンショット 2021-03-15 14.57.17.png

このファイルは、プッシュ通知の登録時に開発環境と本番環境のどちらのAPNsを使用するかを自動的に指定します。
APS Environment Entitlement

・APNs認証キーを発行する

APNsを介してCloud Messagingに接続するにはAPNs認証キーを発行して
Firebaseにアップロードしなくてはいけません。

1.Apple Developer Account > Certificates, Identifiers & Profiles > Keys > Keys+をクリックする
2.ページ内でKey Nameを入力 > Apple Push Notifications service (APNs)をチェック > continueをクリックする
3.APNs認証キーが発行されたらダウンロードする

これでFirebaseにアップロードするAPNs認証キーが取得できました。

・Firebaseプロジェクト内でAPNs認証キーをアップロードする

それでは、APNs認証キーをFirebaseにアップロードしましょう。

1.「プロジェクトの概要」の左にある歯車マークから「プロジェクトを設定」をクリックする
2.ページ上部にあるCloud Messaging > iOSアプリの構成 > APNs認証キーからアップロードする
3.APNs認証キーをアップロードする際に必要なキーIDとチームIDを入力してアップロードを完了させる

キーIDは、Apple Developer AccountのKeys > 自分のAPNs認証キー > Key IDから確認できます。

チームIDは、Apple Developer AccountのIdentifiers > 自分のプロジェクト > App ID Prefixから確認できます。

・実装コードを書く

必要最低限のコードのみを書きますのでご了承下さい。

import UIKit
import Firebase

@main
class AppDelegate: UIResponder, UIApplicationDelegate {

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        // Coloud Messagingのデリゲート
        Messaging.messaging().delegate = self

        // 通知関連のアクションを処理
        UNUserNotificationCenter.current().delegate = self

        // 通知の許可をユーザーにリクエストする
        UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .badge, .sound]) { (granted, error) in
            if let error = error {
                print(error.localizedDescription)
                return
            }
            if granted {
                // aregisterForRemoteNotificationsは必ずメインスレッドで実行する
                DispatchQueue.main.async {
                    // Appleプッシュ通知サービスを介してリモート通知を受信するための登録を行う
                    application.registerForRemoteNotifications()
                }
            }
        }
        return true
    }
}

extension AppDelegate: UNUserNotificationCenterDelegate {
    // アプリがフォアグラウンドで通知を受け取ったときに呼ばれる
        func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
            let userInfo = notification.request.content.userInfo
            print("========== Print full message =========")
            print(userInfo)
            print("===============")

            // プッシュ通知の表示方法を決める
            completionHandler([.banner, .sound, .badge])
        }
}
extension AppDelegate: MessagingDelegate {
    // FCMトークンが利用可能になったり、更新されたりすると呼ばれる
    func messaging(_ messaging: Messaging, didReceiveRegistrationToken fcmToken: String?) {
        print("===============")
        print("Firebase registration token: \(String(describing: fcmToken))")
        print("===============")
    }
}

因みにiOS10以降なら上記のコードでOKですが、iOS10未満だと実装コードが変わってきます
iOS で Firebase Cloud Messaging クライアント アプリを設定する | Firebase

・プッシュ通知を送る

Firebaseプロジェクト内のCloud Messagingからプッシュ通知を送りましょう。

テスト送信をしたい場合は、テスト メッセージを送信から送ることができます。

Firebaseのプロジェクト上でプッシュ通知を送ると開発・本番用関係なく送信されますので
開発用ではこちらでプッシュ通知を送りましょう。

スクリーンショット 2021-03-15 15.58.06.png

テスト メッセージを送信をクリックし、FCM登録トークンを追加を入力すると
テスト送信を端末に送ることが出来ます。
スクリーンショット 2021-03-15 16.01.38.png

FCM登録トークンは先ほど記述したデリゲートメソッドから吐き出されます。

    func messaging(_ messaging: Messaging, didReceiveRegistrationToken fcmToken: String?) {
        print("===============")
        print("Firebase registration token: \(String(describing: fcmToken))")
        print("===============")
    }

以下のようなプッシュ通知が端末に送られてきたら成功です。
IMG_6625.jpg

おわりに

画像や動画もプッシュ通知と一緒に送ることができますが、調べてみると難しそうでした。

もし、実装できたらQiitaにまとめようと思います。

参考

Firebase Cloud Messagingを使ってアプリに通知機能を実装する
Push Notifications with Firebase iOS Swift 5 & Xcode 11.5 | Youtube

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

swiftのMapKit(基礎)

フレームワークのインポート

   import MapKit

MKMapViewの生成

   //mapViewの生成
   let mapView = MKMapView(frame: CGRect(x: 0, y: 0, width: UIScreen.main.bounds.width, height: UIScreen.main.bounds.height))
   self.view.addSubview(mapView)

MKMapViewの中心にピンを生成する

   let mapView = MKMapView(frame: CGRect(x: 0, y: 0, width: UIScreen.main.bounds.width, height: UIScreen.main.bounds.height))
   self.view.addSubview(mapView)
   //緯度と軽度
   let location: CLLocationCoordinate2D = CLLocationCoordinate2DMake(37, 140)
   var region: MKCoordinateRegion = mapView.region
   //表示するマップの中心座標を設定
   region.center = location
   //地図の拡大状態の設定
   //設定しないと地図の表示が最縮小される
   region.span.latitudeDelta = 0.5
   region.span.longitudeDelta = 0.5
   //regionに設定したマップの表示設定をmapViewに反映
   mapView.setRegion(region, animated: true)
   //マップのタイプ
   mapView.mapType = .hybridFlyover
   //マップのデリゲートの設定
   mapView.delegate = self
   //3Dの見え方の設定
   mapView.isPitchEnabled = true
   //ピン留めの生成
   let annotation = MKPointAnnotation()
   //どこにピンを設置するか
   annotation.coordinate = CLLocationCoordinate2DMake(location.latitude, location.longitude)
   annotation.title = "タイトル"
   annotation.subtitle = "サブタイトル"
   mapView.addAnnotation(annotation)

複数箇所のピン留め

   mapView.addAnnotations([annotation, annotation2, ...])

MKMapViewDelegate

   extension ViewController: MKMapViewDelegate {
       func mapView(_ mapView: MKMapView, didSelect view: MKAnnotationView) {
           print("ピン留めが選択された時に呼ばれる")
       }

       func mapView(_ mapView: MKMapView, didDeselect view: MKAnnotationView) {
           print("ピン留めが選択解除になった時に呼ばれる")
       }

       func mapViewWillStartLoadingMap(_ mapView: MKMapView) {
           print("マップビューを読み込もうとしている時に呼ばれる")
       }

       func mapViewDidFinishLoadingMap(_ mapView: MKMapView) {
           print("マップビューが必要なマップデータを読み込んだ時に呼ばれる")
       }

       func mapView(_ mapView: MKMapView, didUpdate userLocation: MKUserLocation) {
           print("ユーザーの場所が更新された時に呼ばれる")
       }

       func mapView(_ mapView: MKMapView, didAdd views: [MKAnnotationView]) {
           print("ひとつ以上のピン留めがマップに追加された時に呼ばれる")
       }
   }

MKMapViewのプロパティ

プロパティ名 説明
delegate MKMapViewDelegate デリゲートを指定
mapType MKMapType .standard: 標準の地図
.satellite: 航空写真
.hybrid: 標準の地図+航空写真
.satelliteFlyover: 3D航空写真
.hybridFlyover: 3D標準の地図+航空写真
isZoomEnabled Bool ズームできるかどうか
isScrollEnabled Bool 画面をスクロールできるかどうか
isRotateEnabled Bool マップが回転するかどうか
showCompass Bool コンパスを右上に表示するかどうか
showsTraffic Bool 交通情報を表示すかどうか
showsBuilding Bool 建物の名前を表示するかどうか
isUserLocationVisble Bool 現在の位置マップに表示されるかどうか
isPitchEnabled Bool 3Dに対応したmapType
region MKcoodinateRegion マップビューで現在表示されているエリア
camera MKMapCamera マップの外観を決定するために使用するカメラ
annotaions [MKAnnotaion] ピン留め
selectedAnnotations [MKAnnotation] 現在選択されているピン留め

MKMapViewのメソッド

メソッド名 説明
setCenter(MKCoordinateRegion, animated: Bool) regionに設定したマップの設定をMKMapViewに反映
addAnnotation(MKAnnotation) 指定したピン留めの追加
removeAnnotation(MKAnnotation) 指定したピン留めの消去
addAnnotations([MKAnnotation]) 複数のピン留めの追加
removeAnnotations([MKAnnotation]) 複数のピン留めの消去

MKMapViewDelegateメソッド

メソッド名 説明
mapViewWillStartLoadMap(MKMapView) マップビューを読み込もうとしたときに呼ばれる
mapViewDidFinishLoadingMap(MKMapView) マップビューが正常にロードした時に呼ばれる
mapView(MKMapView, didUpdate UserLocation: MKUserLocation) ユーザーの場所が更新された時に呼ばれる
mapView(MKMapView, didSelect view: MKAnnotationView) ピン留めが選択された時に呼ばれる
mapView(MKMapView, didDeselect: MKAnnotationView) ピン留めの一つが選択消去された時に呼ばれる
mapView(MKMapView, didAdd views: [MKAnnotationView]) 新しくピン留めがマップに追加された時に呼ばれる
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む