watari開発 – Advent201915 –
stage15: アプリの投稿とtwitter投稿を連携させる
これでようやく1つの機能実装が完了する。さっそく取り掛かろう。
とはいえ今日はそこまで重たい作業はない。
投稿文を差し替える
swifter.postTweet
の引数に与えているところを差し替えるだけだ。
swifter.postTweet(status: entryText.body!, success: { status in
print("succeeded.")
}, failure: { error in
print("failed.")
print(error)
})
これで終わり。
おまけ
SFSafariViewControllerDelegateに対応する
と思ったんだが、Xcodeの
これで現在表示している画面のView Hierarchyが見れる。
内部では、SFSafariViewControllerを使って呼び出している模様。
省略可: アプリがユーザーに reCAPTCHA を表示する際の SFSafariViewController または UIWebView の提示方法をカスタマイズするには、FIRAuthUIDelegate プロトコルに沿ったカスタムクラスを作成して、そのクラスを getCredentialWithUIDelegate:completion: に渡します。
というのがあり、カスタマイズは可能らしいがやっても新しくViewControllerを定義してそれに対してSFSafariViewControllerDelegateを実装して、ってやっても結果同じようなものが出来上がりそうな気がしたので今回はこのまま行くことにしよう。
ハードコードされたシークレットな値の取り扱い
consumerKeyとかconsumerSecretとかがハードコードされていて、gitにcommitできない。ってのをアプリの方達はどうやって解決しているのかを調査。webであれば環境変数に逃して、.envファイルをignore対象にする。とかにしておくのだけど。
https://nshipster.com/secrets/
この記事がよくまとまっている気がする。
- ハードコードするな。リバースエンジニアリングで取られる。
もちろん、gitにcommitとかもできない。 - configurationやplistに含めるな。
.appファイルからplist辿って読まれる。 - コード生成を使って難読化しろ。
ということで難読化が必要らしい。上記の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
こういうのが出てくるので前回設定していた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もできるし使える。
次は
基本機能ができたので画像投稿をやってみよう。
- 前の記事
watari開発 – Advent201914 – 2019.12.14
- 次の記事
watari開発 – Advent201916 – 2019.12.16