miso_soup3 Blog

主に ASP.NET 関連について書いています。

Gistan: Gist viewer for iOS をリリースしました

Gistan - Apple Store

f:id:miso_soup3:20171031102241p:plain

f:id:miso_soup3:20171031102252p:plain


機能

  • 自分の Gist を見る
  • ファイル.app で 自分の Gist を見る
  • GitHub でフォローしている人の Gist を見る
  • ユーザーを検索して、その人の Gist を見る

自分の Gist を一覧ですぐ見たかったのと、Twitter のように Gist を見たいと思ってこんな機能にしました。

GitHub

GitHub:
github.com

ファイル.app のアプリ拡張は、mzp さん GitHub - mzp/OctoEye: Github viewer for Files.app を参考にしました。ありがとうございます。
mzp.hatenablog.com

審査

土曜に審査提出し、月曜の早朝にリジェクトが来ました。そのリジェクトの内容は以下の通りです。

その後、Webブラウザ上ではできない機能を3つ、Web Applicationとしてできないことを1つ、英語と日本語併記で伝えると、火曜に審査が通りました。

Guideline 4.2 - Design - Minimum Functionality

Your app provides a limited user experience as it is not sufficiently different from a mobile browsing experience. As such, the experience it provides is similar to the general experience of using Safari. Including iOS features such as push notifications, Core Location, and sharing do not provide a robust enough experience to be appropriate for the App Store.

Please see attached screenshots for details.

Bitrise でシークレットな情報を .plist ファイルに書き込む

Bitrise & Xcode & GitHub で、シークレットな情報を管理する方法の1つとして。

iOS アプリにて、GitHub の OAuth 認証を実装するため、GitHub Client Id・GitHub Secrey Key をコードで参照しています。 この2つの値は、開発時・Bitrise でのビルドでは必要ですが、GitHub リポジトリにはコミットしたくありません。そのため、以下のような方法を採りました。手順を記載します。

  • Client Id, Secret Key は、.plist ファイルに記述する
    • GitHub には、.gitignore でコミットしないようにする
  • Bitrise のサイトにて、Secret 変数に Client Id, Secret Key の値を登録する
  • Bitrise のビルドフローに、.plist に Client Id, Secret Key を書き込むスクリプトを追加する

手順

Xcode プロジェクト

Xcode プロジェクト内に、以下のように「Secret」フォルダを作成し、「settings.template.plist」「settings.plist」ファイルを追加します。

f:id:miso_soup3:20171021194943p:plain

2つの .plist ファイルには、どちらも「githubClientId」「githubSecretKey」の値を String として追加します。また、「settings.plist」には、実際の ClientId, Secret Key を入力します(開発時に使うため)。下の画像は、settings.plist の画像です。

f:id:miso_soup3:20171021195100p:plain

.gitignore

.gitignore ファイルには、次のように記述します。

Gistan/Secret/*
!Gistan/Secret/*.template.plist

Gistanというのは、プロジェクト名の例です。settings.template.plist はコミットしますが、settings.plist ファイルはコミットしないように設定しています。

このとき、2つのファイルともプロジェクトのアイテムとして project.pbxproj に追加されている状態なので、git clone したときは settings.plist のファイルが無くエラーになるので注意です。今回はこの対策はしていません。

plist ファイルの読み取り

コードでは、次のようにして .plist ファイルの中身を参照しています。

Settings.swift :

struct Settings: Codable {
    var githubClientId: String
    var githubSecretKey: String
}

値を参照するところ:

import Foundation

func loadSettings() throws {
    let settingURL: URL = URL(fileURLWithPath: Bundle.main.path(forResource: "settings", ofType: "plist")!)
    let data = try Data(contentsOf: settingURL)
    let decoder = PropertyListDecoder()
    let settings = try decoder.decode(Settings.self, from: data)
    print(settings.githubClientId)
}
Bitrise にて

Bitrise > Workflow Editor > Secret にて、次のように変数を設定して ClientId, Secret Key を登録します。

f:id:miso_soup3:20171023172821p:plain

Bitrise > Workflow Editor > Workflow にて、Xcode のビルド前に「Script」を実行するステップを追加します。

f:id:miso_soup3:20171021201306p:plain

Script の中身:

#!/bin/bash
# fail if any commands fails
set -e
# debug log
set -x

# write your script here
#!/bin/sh

secretPath=$BITRISE_SOURCE_DIR/Gistan/Secret

cp $secretPath/settings.template.plist $secretPath/settings.plist
plutil -replace githubClientId -string $GitHubClientId $secretPath/settings.plist
plutil -replace githubSecretKey -string $GitHubSecretKey $secretPath/settings.plist

settings.template.plist をコピーして、settings.plist ファイルを作成し、plutilコマンドにて、Client Id, Secret Key の値を置き換えています。

※以上の方法は、.plist ファイルをコピーしているため、settings.template.plist ファイルが無駄なファイルとなっています。別の方法として、コピーせずに直接 settings.plist ファイルを作成するスクリプトを記述した方がスマートかもしれません。

※ClientId, Secret Key を「Secret」ではなく「Env Vars」タブで登録すると、bitrise の設定ファイル bitrise.yml に変数の値が含まれてしまいます。今回のような API キーの場合は、Secret として登録するのが良さそうです。bitrise.yml の中身は、Workflow Editor から「bitrise.yml」タブにて確認できます。また、Secret・Env Vars 両方とも ${キー名} でスクリプトから参照できます。

参照: