blog.haranicle.net

Month: 11月 2014

potatitips#11でiPhoneだけでデバッグする方法について発表してきた

potatitips#11

無謀にもpotatitips#11で発表してきました。
iOSの分は@yimajoさんが丁寧にまとめてくれています。

クックパッド社で #potatotips 第11回に参加してきた!あのApple Watch用SDKのTipsもあったよ! | 株式会社キュリオシティソフトウェア

Continue reading

[`evernote` not found]
Pocket

YosemiteにしたらCocoaPodsがうごかなくなった

エラーメッセージ

$ pod install
/System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/fileutils.rb:245:in `mkdir': Permission denied - /Library/Ruby/Gems/2.0.0/extensions/universal-darwin-14 (Errno::EACCES)
	from /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/fileutils.rb:245:in `fu_mkdir'
	from /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/fileutils.rb:219:in `block (2 levels) in mkdir_p'
	from /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/fileutils.rb:217:in `reverse_each'
	from /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/fileutils.rb:217:in `block in mkdir_p'
	from /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/fileutils.rb:203:in `each'
	from /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/fileutils.rb:203:in `mkdir_p'
	from /Library/Ruby/Site/2.0.0/rubygems/ext/builder.rb:210:in `write_gem_make_out'
	from /Library/Ruby/Site/2.0.0/rubygems/ext/builder.rb:132:in `build_error'
	from /Library/Ruby/Site/2.0.0/rubygems/ext/builder.rb:171:in `rescue in build_extension'
	from /Library/Ruby/Site/2.0.0/rubygems/ext/builder.rb:156:in `build_extension'
	from /Library/Ruby/Site/2.0.0/rubygems/ext/builder.rb:198:in `block in build_extensions'
	from /Library/Ruby/Site/2.0.0/rubygems/ext/builder.rb:195:in `each'
	from /Library/Ruby/Site/2.0.0/rubygems/ext/builder.rb:195:in `build_extensions'
	from /Library/Ruby/Site/2.0.0/rubygems/specification.rb:1436:in `block in build_extensions'
	from /Library/Ruby/Site/2.0.0/rubygems/user_interaction.rb:45:in `use_ui'
	from /Library/Ruby/Site/2.0.0/rubygems/specification.rb:1434:in `build_extensions'
	from /Library/Ruby/Site/2.0.0/rubygems/stub_specification.rb:60:in `build_extensions'
	from /Library/Ruby/Site/2.0.0/rubygems/basic_specification.rb:56:in `contains_requirable_file?'
	from /Library/Ruby/Site/2.0.0/rubygems/specification.rb:925:in `block in find_inactive_by_path'
	from /Library/Ruby/Site/2.0.0/rubygems/specification.rb:924:in `each'
	from /Library/Ruby/Site/2.0.0/rubygems/specification.rb:924:in `find'
	from /Library/Ruby/Site/2.0.0/rubygems/specification.rb:924:in `find_inactive_by_path'
	from /Library/Ruby/Site/2.0.0/rubygems.rb:185:in `try_activate'
	from /Library/Ruby/Site/2.0.0/rubygems/core_ext/kernel_require.rb:132:in `rescue in require'
	from /Library/Ruby/Site/2.0.0/rubygems/core_ext/kernel_require.rb:144:in `require'
	from /Library/Ruby/Gems/2.0.0/gems/xcodeproj-0.17.0/lib/xcodeproj/ext.rb:4:in `<top (required)>'
	from /Library/Ruby/Site/2.0.0/rubygems/core_ext/kernel_require.rb:55:in `require'
	from /Library/Ruby/Site/2.0.0/rubygems/core_ext/kernel_require.rb:55:in `require'
	from /Library/Ruby/Gems/2.0.0/gems/xcodeproj-0.17.0/lib/xcodeproj.rb:30:in `<top (required)>'
	from /Library/Ruby/Site/2.0.0/rubygems/core_ext/kernel_require.rb:55:in `require'
	from /Library/Ruby/Site/2.0.0/rubygems/core_ext/kernel_require.rb:55:in `require'
	from /Library/Ruby/Gems/2.0.0/gems/cocoapods-0.33.1/lib/cocoapods.rb:2:in `<top (required)>'
	from /Library/Ruby/Site/2.0.0/rubygems/core_ext/kernel_require.rb:55:in `require'
	from /Library/Ruby/Site/2.0.0/rubygems/core_ext/kernel_require.rb:55:in `require'
	from /Library/Ruby/Gems/2.0.0/gems/cocoapods-0.33.1/bin/pod:32:in `<top (required)>'
	from /usr/bin/pod:23:in `load'
	from /usr/bin/pod:23:in `<main>'

解決法

これでなおった。

$ sudo gem uninstall cocoapods && sudo gem install cocoapods
[`evernote` not found]
Pocket

Swift1.1で黒魔術「Method Swizzling」

Method Swizzlingとは

既存のメソッドを自作のメソッドに差し替える黒魔術です。
Objective-Cで実現する方法については、こちらのページがわかりやすいです。

既存クラスのメソッドを入れ替える(Method Swizzling)

Swiftで試す

Swiftでもclass_getInstanceMethod()とmethod_exchangeImplementations()が動くので
単純に書き換えるだけで動きました。
以下は、UIViewControllerのviewDidLoadで試したコードです。
viewDidLoadのタイミングでログを吐くようにしています。

extension UIViewController {
    func loggingViewDidLoad() {
        println("\(self.dynamicType) viewDidLoad")
    }
    
    class func switchLoggingMethod () {
        let fromMethod = class_getInstanceMethod(UIViewController.self, "viewDidLoad")
        let toMethod = class_getInstanceMethod(UIViewController.self, "loggingViewDidLoad")
        method_exchangeImplementations(fromMethod, toMethod);
    }
}

ポイント

extension

Swiftにはカテゴリがないので、extensionで実現しています。やってることはObjective-Cのカテゴリと同じです。

class_getInstanceMethod

第2引数がただの文字列です。ここが一番はまりました。
ちなみにSwift1.0では以下のような書き方になるようです。

let fromMethod = class_getInstanceMethod(UIViewController.self, Selector.convertFromStringLiteral("viewDidLoad"))

すべてのクラスで使えるわけではない

これ重要。
NSObjectを継承していないクラスでは使用できません。

参考

Swift funtime

サンプルコード

haranicle/SwiftMethodSwizzling

[`evernote` not found]
Pocket

FMDBで使うSQLiteをSQLCipherで暗号化する

アプリで使用するSQLiteは書き換えられる

iFunBoxというツールを使用すると簡単にアプリで生成したファイルを閲覧したり、編集できたりしてしまいます。
iFunBox for Windows | File Manager, Browser, Explorer, Transferer for iPhone, iPad and iPod Touch

こちらに詳しく書かれています。
iPhoneアプリの初歩的なデータ書き換え・チート方法と、それを防ぐ方法 | Lancork

FMDB + SQLCipher でSQLite暗号化

SQLCipherというSQLite暗号化ライブラリを使用すると、SQLiteのファイルを暗号化し
閲覧・編集できないようにできます。
FMDBでSQLiteを使用している場合は、SQLCipherを簡単に組み込むことができます。

SQLCipherは有料で結構なお値段しちゃいます。
Buy SQLCipher – Zetetic

でも、SQLCipher Community Editionであれば、無料だし、BSDライセンスで利用できます。
SQLCipher – Zetetic

SQLCipher Community Editionは自分でビルドしないといけませんが、俺達にはCocoaPodsがついてるんだぜ。

FMDB + SQLCipher 導入方法

CocoaPods

Podfileに以下を追記

pod 'FMDB/SQLCipher'

ターミナルでpod install

$pod install

Project設定

project_settings

Project > Build Settings > Other C Flagsに “-DSQLITE_HAS_CODEC” を追記

以上で導入完了です。

使い方

ほぼ通常のFMDBと同様ですが、毎回FMDatabaseをOpenした直後に
setKeyで暗号化のキーをセットしてあげてください。

FMDatabase* db = [FMDatabase databaseWithPath:@"path/to/dbfile"];
NSString* sql = @"INSERT INTO nums (num) VALUES (?)";
[db open];
[db setKey:@"dbfile_encrypt_key"]; // 暗号化のキーを設定
[db executeUpdate:sql, [NSString stringWithFormat:@"%ld", num]];
[db close];

サンプルコード

haranicle/DadamoreApp
のFmdbDaoを見てください。
ビルドする前にpod installしてください。

ハマりポイント

FmdbDaoの@propertyにFMDatabase*型のインスタンスを持たせて、
いろんなメソッド(INSERTするメソッドとかSELETするメソッドとか)で使いまわしていたら、
以下の様なエラーが出て、DBにアクセスできませんでした。

26 "file is encrypted or is not a database"

各メソッドで毎回FMDatabase#databaseWithPathして、setKeyをするようにしたら
正常にDBにアクセスできて、暗号化も動作するようになりました。

参考

FMDB with SQLCipher Tutorial | Guilmo

[`evernote` not found]
Pocket

第58回 Cocoa勉強会関西でXcode6のFramework Templateについて話した

発表内容

Xcode6からiOS用のFrameworkを作るためのプロジェクトのテンプレートが追加されました。
(OSX用のは前からあった)
iOS用のFrameworkを作るためにがんばってみたことと、
EmbedFrameworkを用いた複数ターゲット間でコードの共有方法と、
おまけでLive Renderingについて話しました。

Continue reading

[`evernote` not found]
Pocket

第58回 Cocoa勉強会関西いってきたよ

ATND

yidev 第16回勉強会 : ATNDの懇親会で@studioshinさんにハメられて、@dealforestさんと一緒に、これに行ってきました。

第58回 Cocoa勉強会関西 – iOS/Macアプリ開発勉強会 : ATND

Togetter

第58回 Cocoa勉強会関西 – Togetterまとめ

Continue reading

[`evernote` not found]
Pocket

Copyright © 2017 blog.haranicle.net

Theme by Anders NorenUp ↑