Firebaseを使ったGoogleログイン[Swift]

ハマったのでメモとして残しておきます。 前提としてFirebaseの設定が終わっているものとします。

AuthenticationでGoogleログインを許可する

  • Firebaseの管理画面を開き「ログイン方法」タブからGoogleログインを有効にする

f:id:jesus9387:20170908122455p:plain

インストール

  • Podfileを開き下記を追加
pod 'Firebase/Auth'
pod 'GoogleSignIn'
  • pod install を実行

REVERSED_CLIENT_IDを設定

Info > URL Typeに、以下の2つのエントリを追加する

  • GoogleService-Info.plist のREVERSED_CLIENT_IDの値をコピーする

f:id:jesus9387:20170908122611p:plain

  • URL Typeにペースト

f:id:jesus9387:20170908122727p:plain

AppDelegateを編集

import UIKit
import CoreData
import Firebase
//追加
import GoogleSignIn

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?


    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        FirebaseApp.configure()

        //追加
        GIDSignIn.sharedInstance().clientID = FirebaseApp.app()!.options.clientID
        return true
    }

    func applicationWillResignActive(_ application: UIApplication) {

    }

    // 追加
    @available(iOS 9.0, *)
    func application(_ application: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any])
        -> Bool {
            return GIDSignIn.sharedInstance().handle(url,
                                                     sourceApplication:options[UIApplicationOpenURLOptionsKey.sourceApplication] as? String,
                                                     annotation: [:])
    }


    func applicationDidEnterBackground(_ application: UIApplication) {

    }

    func applicationWillEnterForeground(_ application: UIApplication) {
    }

    func applicationDidBecomeActive(_ application: UIApplication) {
    }

    func applicationWillTerminate(_ application: UIApplication) {
        self.saveContext()
    }

Storyboardにボタンを追加

  • StoryBoardにViewを貼り付けクラスにGIDSignInButtonを設定

f:id:jesus9387:20170908122811p:plain

ViewCotroller編集

import UIKit
import Firebase
import GoogleSignIn

class ViewController: UIViewController,GIDSignInUIDelegate, GIDSignInDelegate {

    override func viewDidLoad() {
        super.viewDidLoad()

        GIDSignIn.sharedInstance().uiDelegate = self
        GIDSignIn.sharedInstance().delegate = self
    }

    @IBAction func tapGoogleSingIn(_ sender: Any) {
        GIDSignIn.sharedInstance().signIn()

    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    func sign(_ signIn: GIDSignIn!, didSignInFor user: GIDGoogleUser!, withError error: Error!) {


        if let error = error {
            print("Error: \(error.localizedDescription)")
            return
        }
        let authentication = user.authentication
        // Googleのトークンを渡し、Firebaseクレデンシャルを取得する。
        let credential = GoogleAuthProvider.credential(withIDToken: (authentication?.idToken)!,accessToken: (authentication?.accessToken)!)

        // Firebaseにログインする。
        Auth.auth().signIn(with: credential) { (user, error) in
            print("ログイン成功")
            //画面遷移処理
        }
    }
    //エラー処理
    func sign(_ signIn: GIDSignIn!, didDisconnectWith user: GIDGoogleUser!, withError error: Error!) {
        print("Sign off successfully")
    }


}

完成

  • ログインボタンをタップするとGoogleのログイン画面が表示されます。 f:id:jesus9387:20170908123059p:plain

よければ

Rails初心者がLineBotを作った話[Ruby on Rails]

Rails初心者がLineBotを、作った話

作ったもの

何食べるか迷った時に CookPadで検索しその結果を返してくれるBotです。

f:id:jesus9387:20170905120607p:plain:h300

  • 友達登録は下記のQRコードからお願い致します。

  • スマホでこの記事を見ている方は下記をタップすると友達登録できます。

友だち追加

詳しい機能はGithubに書きましたのでこちらを見てください。 (https://github.com/yshogo/CookpadLineBot)

なぜ作ったのか

ご飯は彼女が作ってくれるんですが いつも「今日は何食べたい?」と聞いてきて自分はいつも同じようなものを頼んでいたのでLineBotに考えてもらおう!と思い作りました。

よくよく考えてみたら自分の母もいつも「今日のご飯何にしようかなー」といってるのでこの機会に使ってもらおうと思いました。

開発について

普段はAndroidアプリを開発する仕事をしていて プライベートではiOSアプリを書いています。

前々からRailsをやりたいと思っていたんですが、いいアイデアが思い浮かばずにいました。 ですが、この機会なのでRailsを使いました。

Ruby on Railsを使ってみて

個人的にかなり難しいと感じました、、、 そもそも前に作った開発環境でrails newしたらエラーなって1から作り直して rails s ってやるとエラーがでてうわあああーーっとなりました(笑)

開発環境はじまるとRubyの文法に惚れ込んでしまって書いているのが楽しくなっていきました。 前にまつもとゆきひろさんの講演を聞きにいった時「触ってて楽しい言語にしたい」とおっしゃっていてそれがすごく伝わってきました。

実装について

実装はCookPadの公式サイトをWebスクレイピングします。 gemはnokogiriを使用しました。

github.com

最後に

今作っているiOSアプリのサーバーサイドはすべて Firebaseを使っているのでAPIの必要がないですが また機会があればやってみたいなーって思いました。

ディスプレイって複数あったほうが本当に便利なの??

最近ディスプレイが2枚あるより1枚で作業したほうが作業が捗っているので それについて考えてみた。

(この記事はプログラマーからの目線でお話しします)

f:id:jesus9387:20170823200631j:plain

家での作業環境。最近はディスプレイを使っていない。

ディスプレイが増えると雑音が増える

私は業務でAndroidアプリを開発しています。 ですので業務のほとんどはパソコンの前でコードを書いています。

一つのディスプレイで作業しているときに別のディスプレイでチャット通知がくるとついつい読んでしまったり、メールが来たらすぐ読んでしまったりします。 そのせいで、メインの作業に集中できなくなってしまっているような気がします。

そもそも緊急の連絡などがあれば口頭で確認しますし、その他の情報共有ならすぐ確認する必要はないと思います。

ディスプレイがいくらあっても作業できるのは1つのウインドウだけ

同時にいっぱいウインド並べて複数のディスプレイで確認しても作業できるのは1つのウインドウだけです。 なので最近はMacBookのディスプレイだけで作業しています。

サンプルソースを読みながら作業するよりウインドウ切り替えたほうが速くコードかける気がする

MacOSには仮想ディスプレイという便利な機能があるので私はそれを使ってウインドウを切り替えています。

1つのディスプレイに一つのウインドを割り当てて切り替えて作業します。

このほうが一つのことに集中できると考えています。

support.apple.com

そもそもディスプレイが複数あると首が痛くなる

これは私個人がなることですが、ディスプレイが複数あると首を動かす範囲が大きくなり首が痛くなります。

また自分の真正面にディスプレイがない状態で作業すると常にどちらかに首を向け続けている可能性がありますので尚更首が痛くなります

最後に

この記事は、プログラマーの私が考えることで別の業種の方は複数ないと作業できない!!って方もいらっしゃると思います。

同業種の方へ少しでも作業効率が向上すればなと思います。 ありがとうございました。

Swiftでの配列(Array)同士を繋げ方

配列同士を繋げる

  • Swiftでは配列と配列を繋げるには「+」でできる
var array1 = Array<String>()
array1.append("Swift1")
array1.append("Swift2")

// array1 = ["Swift1","Swift2"]

var array2 = Array<String>()
array2.append("Kotlin1")
array2.append("Kotlin2")

// array2 = ["Kotlin1", "Kotlin2"]

// array1 と array2 を繋げる
let array3 = array1 + array2

array3.forEach{ word in

    print(word)
}

出力結果

f:id:jesus9387:20170815172212p:plain

  • 個人的に迷ったのでメモ

Material-components-iOSでiPhoneにマテリアルデザインを組み込む[Swift]

使ってみてよかったので共有する 今回使用するファイルはこちら https://github.com/material-components/material-components-ios

インストール

Githubの手順通りに進めていく

  1. cocoapodsのインストール(インストール済みの場合はスキップ)
sudo gem install cocoapods 
  1. podファイル作成(作成済みの場合はスキップ)
pod init
  1. podファイルに下記を追加
pod 'MaterialComponents'
  1. コンポーネントのインストール
pod install
  1. Xcodeで開くワークスペースを変更

スクリーンショット 2017-08-08 23.07.50.png

使ってみる

Raised button

storybordにボタンを追加してclassを「MDCButton」にする

スクリーンショット 2017-08-08 23.11.37.png

すると、マテリアルボタンができる

MaterialButton.gif

Floating action button

これも同じ手順で下記を「MDCFloatingButton」を設定する

スクリーンショット 2017-08-08 23.15.30.png

すると、Floating Buttonが作成できる

FloatingButton.gif

ボタンの色や、背景色を変更する場合は下記のコードを追加

  • 文字色の変更
materialButton.setTitleColor(UIColor.white, for: .normal)
  • 背景変更
materialButton.setBackgroundColor(UIColor.blue, for: .normal)

Material dialog

  • podファイルに下記を追加する
pod 'MaterialComponents/Dialogs'
  • インストールする
pod install
  • ダイアログを出したいときに下記のコードを追加する
let alertController = MDCAlertController(title: "Material Dialog", message: "This is Material Dialog! Let's Start Now!")
let action = MDCAlertAction(title:"OK")
alertController.addAction(action)
        
present(alertController, animated:true)

すると、ダイアログが出る

MaterialDialog2.gif

他にもいろんなcomponentが用意されているのでぜひ使ってみてください https://material.io/components/ios/

Swiftでの画面遷移についてまとめ

よく忘れるのでメモとしてまとめる

Storybordだけで画面遷移

スクリーンショット 2017-08-01 9.21.18.png

シンプルな画面遷移。 ボタンと次に表示するViewControllerをsegueで繋げるだけで完了

コードから画面遷移

画面遷移したいタイミングで下記のコードを追加する

let storyboard = self.storyboard!
let nextView = storyboard.instantiateViewController(withIdentifier: "viewcontroller2")
self.present(nextView, animated: true, completion: nil)

withIdentifierにはViewControllerのIdentifyで設定した名前を書く

スクリーンショット 2017-08-01 9.36.05.png

NavigationControllerで画面遷移

NavigationControllerを下記の手順で追加する

Editor → Embed In → NavigationController

追加したらStoryBoardだけで画面遷移で書いたのと同じようにsegueでViewController同士をつなげれば完了

スクリーンショット 2017-08-01 9.43.03.png

NavigationControllerを使ってコードで画面遷移

方法1 performSegueを使う

①遷移元のViewControllerの黄色のボタンから遷移先のViewControllerへドラッグ&ドロップしてsegueで繋げる

スクリーンショット 2017-08-01 21.12.18.png

②segueを選択し、Identifierを設定する

③画面遷移させたいときに下記のコードを追加する

performSegue(withIdentifier: "Test", sender: nil)

この方法は遷移するViewControllerが2個程度と少ない場合に使っている

方法2 PushViewControllerを使う

let secondViewController = self.storyboard?.instantiateViewController(withIdentifier: "Test") as! SecoundViewController
        self.navigationController?.pushViewController(secondViewController, animated: true)
        

Testの箇所には遷移先のStoryboardIdに設定した値を入力

スクリーンショット 2017-08-01 21.36.21.png

SecoundViewControllerは遷移先Storybordに設定したViewControlerを書く

スクリーンショット 2017-08-01 21.37.28.png

ちなみに、コードで戻る時は下記のコードでできる

_ = navigationController?.popViewController(animated: false)

この方法はnavigationControllerを配列にして管理することができるので 一気に2個戻るというようなことも簡単です。

他にも画面遷移する方法はたくさんありますが、自分がよく使うものをメモとして残しておきます。

「kotlin & Android Studio3.0」に参加してきました!

参加してきました。

https://japan-android-group.connpass.com/event/61779/

発表テーマで個人的に気になったとこを書いていきます。

広く浅く語るkolinの魅力

Extension

kotlinでは既存のクラスを変更せずにメソッドや、プロパティを追加するExtensionという機能があります。

package com.mrstar.android_with_kotlin
// 略
import com.mrstar.extensions.findById // <- 注目

public class MainActivity() : FragmentActivity() {
    protected override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val imageView: ImageView = findById (R.id.image_view) // <- 注目
        // 略
    }
}

Qiitaで同じことをまとめていたのでそのまま転用します。

詳しくは下記をごらんください。 http://qiita.com/RyotaMurohoshi/items/4b958af1d23da6d91a61

これは個人的に知らなかったです。 Javaでは書けない機能で便利だなあと思いました。

kotlin界隈の未来

「kotlinに対する過度な期待から導入を試みる企業が増えるかもしれないが、Javaとの互換が聞かなかったりして失敗することもあるかもしれない」

とのことおっしゃっていました。

確かに現在(2017/07/24)はGoogleがkotlinを発表し、世の中kotlinブームが巻き起こっていますが結局の新しいコードの書き方に対応できず読みづらいコードになる可能性もあります。

ですが、

「ブームから、定番になっていくと思う」

ともおっしゃっていました。

これからJavaがkotlinに置き代わり、基幹システムにも採用されたりする定番の言語になる日もそう遠くないかも???

Android Studio 3.0 と kotlinについて

Android Studio 3.0 から繋いでる端末内部のデータがみれるようになる

これは正直驚きました、、、、 SharedPreferencesに保存されているデータをれるようになるのはデバックしやすいな〜と思いました。

SQLiteで保存したデータも覗くことができるのですかね〜

kotlinのit文について

newArticle.setOnClickListener { it -> print("kotlin") }
        

暗黙すぎるので分からなくなる可能性がありそうですが、慣れればいい感じですね

kotlinのコンパイルについて

kotlinのコンパイルはそれなりにはやいみたいです。 そもそもSwiftがとても遅いようです、、、 自分はiOSAndroid両方書くのでこれからkotlin導入したらコンパイルはええーーーってなるのですかね?

kotlinの良くないところ

kotlinのよくないところも紹介されていました - 暗黙が多すぎること - Javaは型を書くことが必須なので型情報があるので便利

プラットホーム型について ~Kotlinだって間違えるとnullでハマるよ!~

基本的には Javaの変数や、メソッドをkotlinから呼ぶとNullPointerExceptionになる可能性があるよ!! とのことでした。

public String javaMethod(){
    if(isValid()){
          return //なんか返す
      }else{
          return null;
     }
}
            

上記のメソッドをkotlinで読んだ時

var javaClass = JavaClass()

//普通だったら「?」をつけなければいけない箇所だが、つけなくてもコンパイルエラーにならない
var javaMethod = javaClass.javaMethod
            

FRESH! Kotlin Style Guideline

社内でkotlinを使う際のコード規約などの紹介でした。

個人的に印象に残ったのは

!!は使わない

Swift書いている時に!でアンラップしたりとかしていしまっていてこれももうやらないようにしよう、、、って思いました。

総括

kotlinについて少し理解が深まったきがします。 これからもkotlinの勉強会に積極的に参加しようと思います。