watari開発 – Advent201915 –

watari開発 – Advent201915 –

stage15: アプリの投稿とtwitter投稿を連携させる

これでようやく1つの機能実装が完了する。さっそく取り掛かろう。
とはいえ今日はそこまで重たい作業はない。

投稿文を差し替える

swifter.postTweet の引数に与えているところを差し替えるだけだ。

swifter.postTweet(status: entryText.body!, success: { status in
    print("succeeded.")
}, failure: { error in
    print("failed.")
    print(error)
})

これで終わり。

file

file

おまけ

SFSafariViewControllerDelegateに対応する

と思ったんだが、Xcodeの

これで現在表示している画面のView Hierarchyが見れる。

内部では、SFSafariViewControllerを使って呼び出している模様。

firebaseのdocument には

省略可: アプリがユーザーに reCAPTCHA を表示する際の SFSafariViewController または UIWebView の提示方法をカスタマイズするには、FIRAuthUIDelegate プロトコルに沿ったカスタムクラスを作成して、そのクラスを getCredentialWithUIDelegate:completion: に渡します。

というのがあり、カスタマイズは可能らしいがやっても新しくViewControllerを定義してそれに対してSFSafariViewControllerDelegateを実装して、ってやっても結果同じようなものが出来上がりそうな気がしたので今回はこのまま行くことにしよう。

ハードコードされたシークレットな値の取り扱い

consumerKeyとかconsumerSecretとかがハードコードされていて、gitにcommitできない。ってのをアプリの方達はどうやって解決しているのかを調査。webであれば環境変数に逃して、.envファイルをignore対象にする。とかにしておくのだけど。

https://nshipster.com/secrets/
この記事がよくまとまっている気がする。

  1. ハードコードするな。リバースエンジニアリングで取られる。
    もちろん、gitにcommitとかもできない。
  2. configurationやplistに含めるな。
    .appファイルからplist辿って読まれる。
  3. コード生成を使って難読化しろ。

ということで難読化が必要らしい。上記のwebサイトによれば、

If you’re using CocoaPods, you might be interested in the CocoaPods Keys plugin, which also encodes secrets with code generation (albeit without any obfuscation).

難読化はしてくれなさそうだけどコード生成はしてくれるようなので CocoaPods Keys Plugin を使う。(難読化まで頑張るつもりはない)

ちなみに上記のwebサイトでは、最終的にclientでsecretに保つのは不可能である。しかし、必要であれば難読化が痛みの少ない選択肢だろう。みたいなまとめ方でした。

CocoaPods Keys Pluginを使う

bunlderで管理した方が良さそうだったので

bundle init
vim Gemfile
## Gemfile
# frozen_string_literal: true

source "https://rubygems.org"

git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }

gem 'cocoapods'
gem 'cocoapods-keys'

Gemfile作って、

bundle install

Podfileに

  ## Storing secret values.
  plugin 'cocoapods-keys', {
    :project => "watari",
    :keys => [
      "TWITTER_CONSUMER_KEY",
      "TWITTER_CONSUMER_SECRET",
    ]
  }

を追記して、

bundle exec pod install

file

こういうのが出てくるので前回設定していたconsumerKeyとconsumerSecretを貼り付けてEnter.

一度設定すれば

bundle exec pod keys

で確認できる。

最後に投稿していたところのコードを書き換える ContentVIew.swift

let swifter = Swifter(consumerKey: "<secret>",
                      consumerSecret: "<secret>",
                      oauthToken: credential["accessToken"] as! String,
                      oauthTokenSecret: credential["secret"] as! String)

これを

import Keys

...
let watariKeys: WatariKeys = WatariKeys()
...
let swifter = Swifter(consumerKey: self.watariKeys.tWITTER_CONSUMER_KEY,
                      consumerSecret: self.watariKeys.tWITTER_CONSUMER_SECRET,
                      oauthToken: credential["accessToken"] as! String,
                      oauthTokenSecret: credential["secret"] as! String)

これでcommitもできるし使える。

次は

基本機能ができたので画像投稿をやってみよう。