Carthageのコミッター(Collaborator)になりました

先月の2015年6月に、CarthageというCocoaプラットフォーム(iOS/OS X/watchOS)用の依存性管理ツールコミッター(Collaborator)になりました

このプロジェクトは元々ReactiveCocoa 3.0APIを洗練させるためのショーケースとして始まったという側面もあり、ReactiveCocoaのCollaboratorとしては当然注目していました。Carthage v0.6.5からv0.7へのバージョンアップ時に、Swift 1.1から1.2への移行、それに伴うReactiveCocoaのアップデートがあったんですが、そこでRACAPI/設計が大きく変わったことで結構なバグが発生してしまっていました。それらのバグなどを調査・修正して色々とcontributeしている内にinviteしてもらった、という次第です。

RAC 3に慣れていないとなかなか修正し辛いコードベースなのは確かだと思うので、RACのCollaboratorでもあることを活かして貢献していくつもりです。Carthageユーザーで何かお困りの方はこのブログや@ikesyo経由で是非フィードバックをいただければと思っています。

ACAccountStoreのReactiveCocoaラッパーを作った

タイトルのままですが ikesyo/ReactiveAccountStore というAccounts.framework (ACAccountStore) のReactiveCocoaラッパーを作ってみました。

現時点では、以下の4つの非同期メソッドのRACSignalラップ版をサポートしています。

  • -requestAccessToAccountsWithType:options:completion:
  • -saveAccount:withCompletionHandler:
  • -renewCredentialsForAccount:completion:
  • -removeAccount:withCompletionHandler:

より詳しくはヘッダードキュメントを参照してください。

すでにCocoaPodsに登録済みなので、以下で利用できるようになります。

pod 'ReactiveAccountStore'

対応プラットフォームは、OS Xのサポートとdeprecatedのメソッドの関係上、

となっています。

Accounts.frameworkを使用することがあるReactiveCocoaユーザーは利用してみてください(どれだけいるのか)。

VTAcknowledgementsViewControllerのStoryboardサポートを改善した

Pull requestしたらローカライズ依頼された - [yashigani days] などで知ったVTAcknowledgementsViewControllerというライブラリがあります。CocoaPodsが自動生成してくれる各ライブラリのライセンス表記をまとめたファイルをうまいことアプリ内で画面表示してくれる便利ライブラリです。

CocoaPodsが生成するファイル名は通常、Pods-acknowledgements.plistですが、Podfileで下記のようにターゲットを明示的に指定している場合、

# Podfile
target "TargetName" do
  pod 'VTAcknowledgementsViewController'
end

生成されるファイル名がPods-TargetName-acknowledgements.plistというように変わります。

ライブラリの機能としてコードベースでの表示では、以下のようにしてターゲット入りのカスタムPlistファイル名に対応していたのですが、

NSString *path = [[NSBundle mainBundle] pathForResource:@"Pods-TargetName-acknowledgements" ofType:@"plist"];
VTAcknowledgementsViewController *viewController = [[VTAcknowledgementsViewController alloc] initWithAcknowledgementsPlistPath:path];

元のエントリーで追加されていたStoryboardサポートではカスタムPlistファイル名は未対応でした。ということで、Storyboardでの配置でもカスタムPlistファイル名に対応するPull requestをしたらマージされましたよ、というお話です。

Support custom plist name for Storyboard by ikesyo · Pull Request #21 · vtourraine/VTAcknowledgementsViewController · GitHub

設定方法

  1. 元エントリーの画像のように、Storyboard上にUITableViewControllerを配置し、Custom ClassにVTAcknowledgementsViewControllerを指定する。
  2. 配置したTableViewControllerのUser Defined Runtime Attributes
    • Key Path: acknowledgementsPlistName
    • Type: String
    • Value: ファイル名(上記例では "Pods-TargetName-acknowledgements")

    としたものを追加する。

実装内容

設定方法の通り、対応にはUser Defined Runtime Attributesを使用しています。User Defined Runtime Attributesでセットされた値が実際にプロパティにセットされるのは、initWithCoder:awakeFromNibの間のため、Storyboardベースでの初期化のエントリーポイントをinitWithCoder:からawakeFromNibに変更した上で、プロパティに値がセットされているかどうかでデフォルトのファイル名を使用するか、カスタムファイル名を使用するかどうかを切り分けるようにしています。

注意

2014/04/15現在、CocoaPodsでのリリースには上記対応はまだ含まれていません。CHANGELOGを見る限り、次のリリースとなる ver 0.11 で入るのでリリースを待つか、

# Podfile
pod 'VTAcknowledgementsViewController', :head

Podfileの:headオプションでリポジトリからmasterブランチを直接取得してくれば使えるようになります。

それでは便利なCocoaPodsライフを!

2014/05/05 追記

ver 0.11 がリリースされました!ので、以下だけで本対応が含まれたバージョンが使用できます。

# Podfile
pod 'VTAcknowledgementsViewController'

UAObfuscatedString / バイナリ上での文字列難読化ライブラリー

UrbanApps/UAObfuscatedString

NSLog(@"%@", @"".T.h.i.s._.i.s._.a._.t.e.s.t.dot); 
> This is a test.

NSString *identifier = @"".c.o.m.dot.u.r.b.a.n.a.p.p.s.dot.e.x.a.m.p.l.e;

サンプルを見れば分かるように、NSStringのカテゴリーとして英数字や記号のメソッドが追加されており、メソッド呼び出しによって文字連結で文字列を生成していくというライブラリー。

アプリのバックエンドAPIのURLやAPIキーといった知られたくない情報をそのまま文字列定数としてソースコードに記載してしまうと、アプリのバイナリ解析で見つけられたり書き換えができてしまうので、バイナリ上には単一文字としてしか含まれないようにするというアイデア。