iPadOSの審査ではEthernet接続が使われている

こんにちは、ピリカの伊藤です。

先日、iOSアプリを審査に出したところ「iPadOSで起動時に通信エラーで進めない」とリジェクトされました。 これまでこのようなリジェクトを受けたことはなく、特にサーバーも問題なく動作していました。

では、なぜ審査落ちになったのでしょう。審査落ちのメッセージに添付されていたスクリーンショットを確認したところ、通信インジケーターが出ていませんでした。通常、ここにはWi-FiやCellularのアイコンが表示されているはずです。

f:id:iseebi:20220303194545p:plain

一応この点について指摘してみましたが「このデバイスは正しくインターネットに接続している。詳しくは教えられない。」という回答があったのみでした。

iPhone/iPadに有線LANをつなぐ

Wi-FiやCellularの表示がなくても接続できる状況ってあるか…?いや、そういえばEthernetがありました。

実はiOS 9.3以降で、Lightning to USB3 Camera Adapterを使い、そこにUSB-Ethernetアダプタを繋ぐことでEthernet、つまり有線LANに繋ぐことができるようになっています。もちろん、USB-Cポートを備えたiPad Proであれば、直接USB-CにUSB-CのEthernetアダプタをつなぐこともできます。

なぜEthernetで通信エラーになっていたのか

LightningポートにEthernetを挿せるように環境を整えました。Ethernetアダプタをポートに接続すると、設定アプリにEthernetの項目が増えます。

f:id:iseebi:20220303194749p:plain

この状態にすることで、問題を再現できました。

このアプリは通信前にFBNetworkReachabilityライブラリでインターネットの疎通をチェックしていますが、このライブラリはCellular接続でない場合はIPアドレスを検出する動作をしていましたが、これがEthernetの環境ではうまく動作していませんでした。

GitHubの最新のコードではこの問題は解消されていましたが、このバージョンはCocoaPodsにリリースされていません。

GitHubを直接参照する形で更新することもできましたが、ライブラリがObjective-Cで記述されていること、現在のアプリはiOS12以降対応になっている等を鑑みて、NWPathMonitorに置き換えて対応することにしました。

今後、通信の疎通にはEthernet接続もあるというのを考慮に入れるようにしたほうが良いと思いました。

Macでビデオ会議(画面共有)中に手元のiPhoneの画面を共有する方法

こんにちは、ピリカの冨田です。

今日は、Macの画面に、手元のiPhoneの画面をリアルタイムで表示する方法をご紹介します。

PCでビデオ会議中に、相手にiPhoneの画面共有をしたいことはありませんか?

例えば、アプリの操作方法を相手にリアルタイムでお伝えしたい時などです。

この方法を使えば、ビデオ会議などで、Macから自分の画面を共有している時に、手元のiPhoneの画面を共有することができます。

f:id:kahi0223:20220210182747p:plain
手元のiPhoneの画面をMacの画面に表示する

続きを読む

Mac(M1 CPU)で、互換性のあるpyenv+pipenvの環境を作る

こんにちは、ピリカ開発チームの九鬼です。

SNSピリカやタカノメのサービスでは、バックエンドで度々Pythonを使用しています。その中でいくつかPythonスクリプトがあり、バージョンが3.7系列や3.9系列などが含まれます。

しかしながら、Mac(M1 CPU)からarm64ベースのアーキテクチャになったこともあり、一部Pythonバージョンや一部ライブラリがインストールできないことが多々あります。

そこで、複数のPythonバージョンで仮想環境を切り分けられるよう、pyenv + pipenvの環境を整えました。

続きを読む

GAE/Pythonでサービスアカウントキーファイルを使わないようにした

こんにちは。ピリカ開発チームの伊藤です。

GCPの各種サーバーレスサービスにアクセスするには、認証情報が必要となります。App EngineやCloud Functions上で動作している場合は、GCPの各種ライブラリを使っていれば特に何もしなくても認証が通った状態となり、FirestoreやCloud Storageなどを扱うことができるようになっています。

しかし、ローカルでの動作確認を行う場合など、GCP外で動く場合には認証情報を渡す必要があります。 これまで、ローカルでの認証のためには「サービスアカウントキー」というJSONファイルを取得することが多かったのですが、サービスアカウントキーファイルが漏洩した場合に検知が難しいなどの問題があり、最近は非推奨となっています。

では具体的にどのようにすれば良いのかというと、あまりまとまった情報がありませんでした。

今回は、GAE/Pythonをメインに運用しているピリカでとったサービスアカウントキー排除の手法をご紹介します。

続きを読む

Androidアプリ Realmでモデルパラメータを追加するとき、過去バージョン全てに渡ってパラメータ有無を考慮する必要があった話

こんにちは、ピリカ開発チームの九鬼です。

SNSピリカのAndroidアプリについて、段階公開していたv5.4.13, v5.4.14リリースで起動クラッシュが発生する問題がありました。v5.4.13でRealmのバージョンアップおよびRealm操作周りの役割分離を行っており、そのなかでのマイグレーション処理の不備が原因でした。本稿ではその経緯を共有いたします。

続きを読む

GoogleAppEngineでCloud SchedulerからのHTTPリクエストのみを受け付ける

こんにちは、ピリカの開発の冨田です。

ピリカのごみ拾いSNS「ピリカ」は、Google Cloud Platformを利用しています。

その中で、定期実行させたい処理を、Cloud Scheduler→AppEngineで行っています。

Cloud SchedulerからApp Engineに対してHTTPリクエストを送るのですが、その際にApp Engine側ではCloud Schedulerからのリクエストのみを受け取るようにしました。

f:id:kahi0223:20211203122844p:plain
Cloud SchedulerからApp EngineにHTTPリクエストを送る

続きを読む

Pythonのインターン(Intering)・文字列インターン(String Intering)

こんにちは、ピリカ開発チームの冨田です。

Pythonにはインターン(Intern, Intering)という仕組みがあります。

特に文字列のインターンはとても複雑です。

ここでは、インターンとは何か、Pythonインターンが利用されるのはどの様な場合か、文字列がインターンされる条件は何かなど、Pythonインターンについて書いています。

続きを読む