TwitterKitを使ってるアプリでWeb経由の認証が出来なくなったのを解決した

Twitterの仕様変更

本日(2018/06/12)に認証周りの仕様が変わった。

認証して戻ってくる時のコールバックURLをデベロッパーの管理画面で設定するのが必須になった

Callback URL — Twitter Developers

TwitterKitを使ってログインを実装してるアプリで、端末にTwitterが入ってなければブラウザが立ち上がって認証が行われる

その場合、コールバックURLの設定をしてないと認証がコケるようになってしまった

ちなみにReactNativeアプリの開発でTwtiterの認証にreact-native-twitter-signinを使っている

github.com

修正

アプリの管理画面の設定を開く

https://apps.twitter.com/

f:id:rskull:20180612192226p:plain

コールバックURLに

twitterkit-YourConsumerKey:// の形式で登録する

これはTwitterKitがコールバックURLとして使っているもの

YourConsumerKeyは自分のアプリのコンシューマーキー

://を末尾に付けないと登録出来ないので注意

f:id:rskull:20180613123301p:plain

..

f:id:rskull:20180612191828p:plain

登録が終わったら、コールバックをロックしても正常に認証出来るようになった

※ 追記(2018/06/14)

上記の対応だと、AndroidのWeb経由だけ認証が通らなかった

合わせて下記の対応でiOSTwitter経由/Web経由)AndroidTwitter経由/Web経由)すべての経路で認証が通るようになった

ちなみにtwittersdk://の対応だけだとiOSのWeb経由が通らなくなった(僕の環境だと)

この辺の挙動アナウンスないしほんと謎

react-native-domをちょっと動かしてみた

いい加減触るかと思いたち、チュートリアルをしてみた

github.com

セットアップ

適当なサンプルプロジェクトをinitする

$ react-native init rndomExample

まずは普通にアプリを起動してみる

$ react-native run-ios

f:id:rskull:20180526015755p:plain

ふむ

次に本題のセットアップ

$ yarn add --dev rnpm-plugin-dom
$ raect-native dom

パッケージを追加してコマンドを実行すると、新しいファイルが作成される

f:id:rskull:20180526014509p:plain

あとは起動するだけ

$ react-native run-dom

ターミナルが立ち上がって、すぐにブラウザが立ち上がる

f:id:rskull:20180526015927p:plain

ブラウザで同じ画面が表示された

すごい

検証

LayoutAnimationとか動くのかな?と思って動かしてみた

簡単なサンプルだけど、ほぼ完璧に同じ動きしててすごい

左がアプリで右がウェブ

f:id:rskull:20180526024317g:plain

ここまでのソース

GitHub - rskull-sandbox/rndomExample: example for react-native-dom

どうやって動いてるのか?

すごく詳しく仕組みを解説してくださっているので

気になる方はこちらの記事を見てください!

blog.nkzn.info

ここまで理解できるのすごい

これが精一杯(花)

react-native-firebaseでプッシュ通知を扱う

react-native-firebaseでプッシュ通知を扱う時のメモ

github.com

実装

基本的な実装はドキュメントへ

React Native Firebase - Simple Firebase integration for React Native

扱い方

プッシュ通知を押すとアプリが起動するが、そのパターンが3つある

  • ① アプリが起動してない状態でプッシュ通知を押して起動される
  • ② アプリは起動してるが、バックグラウンドにいるときにプッシュ通知を押して復帰
  • ③ アプリの起動中にプッシュ通知が来た時
async componentDidMount() {
  // パーミッションを要求(iOS)
  await firebase.messaging().requestPermission()

  // デバイストークンを取得
  firebase
    .messaging()
    .getToken()
    .then(fcmToken => {
      console.log(fcmToken)
    })

  // 新しいトークンの生成がされた時
  this.onTokenRefreshListener = firebase
    .messaging()
    .onTokenRefresh(fcmToken => {
      console.log(fcmToken)
    })

  // ① プッシュ通知を押してクローズからの起動
  const notificationOpen: NotificationOpen = await firebase
    .notifications()
    .getInitialNotification()

  if (notificationOpen) {
    console.log(notificationOpen)
  }

  // ② プッシュ通知を押してバックグラウンドからの復帰
  this.notificationOpenedListener = firebase
    .notifications()
    .onNotificationOpened(notificationOpen => {
      console.log(notificationOpen)
    })

  // ③ アプリが起動中にプッシュ通知が来た時
  this.notificationListener = firebase
    .notifications()
    .onNotification(notification => {
      console.log(notification)
    })
}

// リスナーを解除
componentWillUnmount() {
  this.onTokenRefreshListener()
  this.notificationOpenedListener()
  this.notificationListener()
}

多分、これでほとんどのパターンをカバー出来るはず

homebrewでphp71-*系がインストールできなくなってた

php実行したらintlが無いよって言われて、じゃぁ入れますよと

$ brew install php71-intl 打ったらそんなもんねぇって言われた

これはintlに限らずphp71-がつくモジュール全部

今のバージョン

$ brew --version
Homebrew 1.5.14-3-g94c0d83
Homebrew/homebrew-core (git revision 9f8b6; last commit 2018-04-05)

調査

調べてみると最近変更があったらしい

tap すると追加してるフォーミュラ(リポジトリ的な?)一覧が出てくる

$ brew tap
caskroom/cask
homebrew/core
homebrew/php
wix/brew

今までphp71-*が含まれてたhomebrew/phpdeprecated になってお亡くなりになられた

GitHub - Homebrew/homebrew-php: 💀 Homebrew/php (deprecated)

今まであったものは全て、元々ある homebrew/core に移行された

変更ログ: php71: migrate to homebrew/core (#4798) · Homebrew/homebrew-php@ab5fffa · GitHub

どうしたか

とりあえず現状、brewで入れてる諸々を確認(自分の環境の場合)

$ brew list | grep php
php71-igbinary
php71-mcrypt
php71-opcache
php71-redis
php71

全て消す

$ brew uninstall php71-igbinary php71-mcrypt php71-opcache php71-redis php71

非推奨になったhomebrew/phpも消す

$ brew untap homebrew/php

新しく入れる

$ brew install php@7.1
$ brew link --force php@7.1

もしlinkで怒られて .zshrc などでパスを上書きしろって警告がでたら従う

パスが通ってるのを確認

$ which php
/usr/local/opt/php@7.1/bin/php

バージョンを確認するのにコマンド実行したらエラーが出た

❯ php -v
PHP Warning:  PHP Startup: Unable to load dynamic library '/usr/local/opt/php71-igbinary/igbinary.so' - dlopen(/usr/local/opt/php71-igbinary/igbinary.so, 9): image not found in Unknown on line 0

Warning: PHP Startup: Unable to load dynamic library '/usr/local/opt/php71-igbinary/igbinary.so' - dlopen(/usr/local/opt/php71-igbinary/igbinary.so, 9): image not found in Unknown on line 0
PHP Warning:  PHP Startup: Unable to load dynamic library '/usr/local/opt/php71-intl/intl.so' - dlopen(/usr/local/opt/php71-intl/intl.so, 9): image not found in Unknown on line 0

Warning: PHP Startup: Unable to load dynamic library '/usr/local/opt/php71-intl/intl.so' - dlopen(/usr/local/opt/php71-intl/intl.so, 9): image not found in Unknown on line 0
PHP Warning:  PHP Startup: Unable to load dynamic library '/usr/local/opt/php71-mcrypt/mcrypt.so' - dlopen(/usr/local/opt/php71-mcrypt/mcrypt.so, 9): image not found in Unknown on line 0

Warning: PHP Startup: Unable to load dynamic library '/usr/local/opt/php71-mcrypt/mcrypt.so' - dlopen(/usr/local/opt/php71-mcrypt/mcrypt.so, 9): image not found in Unknown on line 0
PHP Warning:  PHP Startup: Unable to load dynamic library '/usr/local/opt/php71-redis/redis.so' - dlopen(/usr/local/opt/php71-redis/redis.so, 9): image not found in Unknown on line 0

Warning: PHP Startup: Unable to load dynamic library '/usr/local/opt/php71-redis/redis.so' - dlopen(/usr/local/opt/php71-redis/redis.so, 9): image not found in Unknown on line 0
PHP 7.1.16 (cli) (built: Mar 31 2018 02:28:54) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.1.0, Copyright (c) 1998-2018 Zend Technologies
    with Zend OPcache v7.1.16, Copyright (c) 1999-2018, by Zend Technologies

古い設定が乗ってるから消せということらしい

$ ls /usr/local/etc/php/7.1/conf.d
ext-igbinary.ini ext-intl.ini ext-mcrypt.ini   ext-opcache.ini  ext-redis.ini

こいつらが要らなくなった

参考:Unable to load dynamic library '/usr/local/opt/php71-intl/intl.so'? · Issue #26074 · Homebrew/homebrew-core · GitHub

ちょっと怖いので消さずに移動させた(拡張子をリネームしても可)

$ mv /usr/local/etc/php/7.1/conf.d/* ~/DeskTop/backup

エラー消えた

❯ php -v
PHP 7.1.16 (cli) (built: Mar 31 2018 02:28:54) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.1.0, Copyright (c) 1998-2018 Zend Technologies

モジュールを確認

$ php -m | grep intl
intl

きっかけになったintlはちゃんと含まれた

結局

全て消してクリーンにしてから入れ替えたら動いた

一番最初、個人的に入れてたphp71-redis とかが消えた php -m してもリストに入ってない

$ brew install php71-xxx 系を叩いても入らなくなったので、ここがどうなったのかよく分からなかった

分かったら追記するけど、誰か教えて...

追記 2018/04/19

pecl コマンドで入れるのが正しいみたい

$ which pecl
/usr/local/opt/php@7.1/bin/pecl
$ pecl install redis

してから

❯ php -m | grep redis
redis

入った