blog.haranicle.net

Category: iOS (page 1 of 2)

第20回 potatotiosにいってきたよ

potatotips

毎回人気で発表枠でもなかなか参加できない勉強会potatotipsにいってきました。
(発表者枠で申し込んでたけど、抽選に外れて参加できそうになかったのでブログまとめ枠で滑り込みました)

詳細はこちら
【第20回】potatotips(iOS/Android開発Tips共有会) – connpass

会場はVOYAGE GROUPさん。
会場には、ポテトチップス、ピザ、ビールだけでなく寿司まで用意されていて豪勢でした。

発表の数が多くて、タイピングが追いつかなかったのでiOSの発表だけまとめてます。


CoreSpotlight Optimization

@sakmtechさん
VOYAGE GROUPの人

CoreSpotlightとは

  • iOS9新機能の1つ
  • アプリ内の検索結果をSpotlightで表示することができる
  • タイトル、説明、キーワードを設定できる(キーワードは非表示)

どうやったら上に表示されるか

  • タイトル、説明文、キーワードの順で優先してマッチしたものが上に表示される
  • ひらがなで検索した時もカタカナや漢字も検索でマッチする
    (例)なつ->夏,懐 etc..
  • トップヒットに乗るのは1アプリ3つまで
  • 先にインストールしたアプリが上に表示される
  • まだまだbetaなので結果は変わる可能性あり…

watchOS1のアプリをwatchOS2移行する

@mo_to_44さん
ネクストの人

  • watchOS 2 Transition Guideが提供されている(ここに重要な事がさらっと書かれているらしい)
  • watchOS1から2への最大の変更点はWatchのExtensionが動作する場所ががiPhoneからWatchに変更になっていること
  • データストアはiPhoneとwatchの両方にあるようになった
  • iPhoneとwatchのデータを同期するWatch Connectivityを使用する

とにかく明るいCore Spotlight

@yimajoさん
エンジニアアウトプットランキング – Stargazerの人

TweetRainというアプリでニコニコ動画みたいに#potatotipsハッシュタグが付いているTweetがスライドにオーバーレイ表示されていました。

ユーザ目線での使いどころ

  • 電子書籍リーダのタイトル
    • KindleとかiBooks両方に書籍を入れているので、CoreSpotlightで両方を検索できればうれしい
  • サンプル(iOSDayByDayというものがある)
  • キーワードだけじゃなくてEメールなど検索できるものが160個ぐらいある

参考資料(見たほうが良い資料)


英語版リリース前に知っておきたいこと

@horimislimeさん
トレタの人

NSLocalizableString

  • Localizableの使い方をミスると大変
  • こんな風にすると姓名が逆になっちゃうことがある
[NSString stringWithFormat: @"%@ %@", NSLocalizedString(@"lastName", @""),  NSLocalizedString(@"firstName", @"")]

NSPersonNameComponents&Formatter

  • アプリを実行しているロケールに応じて、いい感じに姓名の順番を整えてくれる
  • suffixで”Mr”,”Mrs”や”様”などをいい感じにつけられる
  • iOS9からしか使えない

stringsdict

  • 複数の時に〜sをつけたりしないといけない
  • stringsdictを使えばXMLを書いておくだけで、〜sを付けられる

NSDataIntervalFormatter

  • 時刻の区間をいい感じのフォーマットの文字列にできる

画像リソース

  • ButtonにBackground Imageを使っているとボタンのサイズが変わった時に大変
  • 使わない方がいい(文字のタイトルはLabelで!)

Crowdin

  • 翻訳支援サービスCrowdinが便利
  • XLIFFを書き出してアップロードするのみ
  • 外部翻訳者とのコミュニケーションとか進捗管理が楽
  • APIもあるのでCIと連携することもできる

PUSH通知証明書作成ツールを作った

@tomzohさん
デジタルサーカスの人

iOSのPUSH通知のための証明書作成

  • 3ヶ月に1回更新しないといけない
  • Macじゃないとだめ
  • 黒い画面での操作

ツールを作った

  • WebからPush通知の証明書をDLできる
  • Dev/Prod対応
  • テスト送信もできる
  • p12ファイル対応
  • CakePHP製

今日から使える!

monotty


CommandLineTool

@kitasukeさん
メルカリの人

SwiftでCommand Line Tool

  • Xcodeで作ることができる
  • Cathegeのコードを見ると作れる(最初の方のコミットがかなり細かいので、それを追えばわかりやすい)

  • プロジェクト設定のコマンドラインツールのテンプレからは作れない
  • Embedded Content Contains Swift Code for framework targetがデフォルトでNOになっているけどYESにしないとSwiftコードが実行できない

2時間の暗号化済み動画データはどうやって再生するのか

@satoshi_0212さん

問題

  • 2時間の番組はメモリ上に乗るのか
  • 暗号化&復号化が必要
  • オフライン再生

方針

  • 標準のAVPlayerのクラス+HLSを使用する方法
  • ffmpegのコードを使用する方法
  • 納期が短かったため前者を採用

実装

  • 動画ファイルを暗号化キーで暗号化して分割してtsファイルを複数作成
  • tsファイルの再生はAVPlayerで再生できないのでcocoaHttpServerでiPhone内にHTTPサーバを立ててストリーミング再生
  • 再生はAVPlayerにHLSの再生リストを渡すだけでOK
  • 無事にAppStoreに公開できた

SFSafariViewControllerとOAuth

@huinさん
フリルの人

SFSafariViewController

  • Safariと同じだから、使い慣れたインタフェース
  • SafariのCookies情報を利用可能
  • PW/クレジットカードのオートフィル
  • ATSに引っかからない

OAuth認証

  • アプリ内のWebView認証はユーザからみて安全でない
    • JSつかってid/pwを抜いたりできてしまう
  • SafariViewControllerをつかってOAuthしましょう(Appleもこれを推奨しているらしい)

感想

WWDCからしばらくたって、みなさんが収集したiOS9の知見が聞けて非常にためになりました。
ブログまとめ枠で参加すると、枠が空いているし、強制的に集中して聞くようになるので、結構良かったかなと思いました。

Pocket

iOSでAppExtensionを使わずにカスタムキーボード

この投稿はiOS Advent Calendar 2014の13日目の記事です。

こんにちは。13日目担当のharanicleです。
先にあやまっておきますが、小ネタです。。

iOS8のカスタムキーボード

iOS8になってAppExtensionという仕組みで、カスタムキーボードを作成できるようになりました。
僕も1つカスタムキーボードアプリをリリースしています。
良かったら買ってね!

特殊文字キーボード

カスタムキーボードは便利だけど、自分のアプリだけで使えるカスタムキーボードがほしい!
カスタムキーボードもいいけど、標準キーボードが一番使いやすい!
そうだ、標準キーボードを拡張すればいいんだ!という奇特な人のためにこんなものを作ってみました。

customkeyboard

解説

UITextEffectsWindow

UITextEffectsWindow

iOSアプリのキーボードは、UITextEffectsWindowという、
AppDelegateが持っているUIWindow(簡単のためメインウインドウと
呼びます)とは、別のUIWindowで表示されます。
なので、キーボードの上に何かを表示するためには、
メインウインドウとは別のUIWindow(簡単のためにサブウインドウと呼びます)
を作成し、UITextEffectsWindowの上にサブウインドウを表示する必要があります。

サブウインドウの開閉

UIWindowを開く

UIWindowを開く処理のコードです。
sushiWindowを作成し、windowLevelをUIWindowLevelNormalより少し大きい値をセットして、UITextEffectsWindowよりも上にsushiWindowを表示しています。
objc_setAssociatedObjectでsushiWindowのオーナーを設定しています。
sushiWindowは閉じるときにnilを代入して開放したいのでOptional型にしています。
また、windowにお寿司の絵文字を入力できるボタンを設置しています。
(ゴリゴリのハードコーディングですみません…)

func openSushiWindow() {
    sushiWindow = UIWindow(frame: CGRect(x: 230, y: 621, width: 42, height:42))
    sushiWindow?.windowLevel = UIWindowLevelNormal + 5
    sushiWindow?.makeKeyAndVisible()
    sushiWindow?.addSubview(sushiButton as UIView)
    sushiWindow?.backgroundColor = UIColor.orangeColor()
    
    objc_setAssociatedObject(UIApplication.sharedApplication(), &sushiWindowKey, sushiWindow, UInt(OBJC_ASSOCIATION_RETAIN_NONATOMIC))
}

UIWindowを閉じる

objc_setAssociatedObjectでnilをセットして、サブウインドウの所有権を開放しています。
sushiWindowにnilを代入してオブジェクトを開放しています。

func closeShushiWindow() {
    // サブウインドウを破棄
    objc_setAssociatedObject(UIApplication.sharedApplication(), &sushiWindowKey, nil, UInt(OBJC_ASSOCIATION_RETAIN_NONATOMIC))
    sushiWindow = nil
    
    // メインウインドウをキーウインドウにする。
    UIApplication.sharedApplication().windows.first?.makeKeyAndVisible()
}

キーボード表示、非表示のイベント

NSNotificationCenterで取得できます。

Observerの設定

キーボード表示、非表示のイベントを受け取るObserverの設定と除去です。
今回は、viewDidAppearとviewDidDisappearで実行しました。
キーボード表示時にサブウインドウを開き、非表示時にサブウインドウを閉じるようにしました。

override func viewDidAppear(animated: Bool) {
    // キーボード表示、非表示の通知を受け取る。
    NSNotificationCenter.defaultCenter().addObserver(self, selector: "keyboardDidShow:", name: UIKeyboardDidShowNotification, object: nil)
    NSNotificationCenter.defaultCenter().addObserver(self, selector: "keyboardDidHide:", name: UIKeyboardDidHideNotification, object: nil)
}

override func viewDidDisappear(animated: Bool) {
    // 通知を受け取らないようにする。
    NSNotificationCenter.defaultCenter().removeObserver(self)
}

/**
キーボードが表示された時の処理
:param: notificaiton 通知
*/
func keyboardDidShow(notificaiton:NSNotification) {
    println(__FUNCTION__)
    openSushiWindow()
}

/**
キーボードが非表示になった時の処理
:param: notificaiton 通知
*/
func keyboardDidHide(notificaiton:NSNotification) {
    println(__FUNCTION__)
    closeShushiWindow()
}

サンプルコード

以下に今回のコードを置いておきます。
haranicle/CustomKeyboardWithoutExtension

まとめ

この方法だとAppExtensionを使っていないので、iOS7以下でも使用できますね。
きっと、LINEのスタンプを選択するUIはこの方法でやってるんだと思います。

参考

Pocket

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

potatitips#11

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

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

Continue reading

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

Pocket

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

発表内容

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

Continue reading

Pocket

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

ATND

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

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

Togetter

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

Continue reading

Pocket

新iTunes Connect用のスクリーンショット作成の苦行をなんとかする

新iTunes Connect

こんにちは。haranicleです。
iTunes Connectが新しくなって、iPhone6/6Plus対応のアプリを提出しようとすると、
4.7inch,5.5inch用のスクリーンショットも登録しないといけなくなりました。
スクリーンショットの枚数 * 対応言語数 * 対応機種数 のスクリーンショットを
作らないといけないのはつらすぎる。

スクリーンショットのサイズ

各端末ごとに用意しないといけないスクリーンショットのサイズです。

画面サイズ Width Height
3.5inch 640 960
4inch 640 1136
4.7inch 750 1334
5.5inch 1242 2208

4inchから5.5inchまではほぼ同じ比率なので、5.5inch用のスクリーンショットだけ作って
あとは自動で生成されるようにしたい。

Shell Script

前置きが長くなりましたが、5.5inch用のスクリーンショットから自動で他の画面サイズの
スクリーンショットを作ってくれるスクリプトを作りました。

A shell script to create AppStore screen shots.

使い方

  • 事前にImageMagickをインストールしておく
  • 5.5inch用のスクリーンショットを作って、ファイル名の最後に1から5をつけておく。
    (例) ss1.png, ss2.png … ss5.png
  • Shell Scriptをコピーして「適当な名前.sh」として保存
  • 適当な名前.shのsettingsのfileNamePrefixを数字なしのファイル名に書き換える。
    (例) fileNamePrefix=”ss”
  • $chmod +x 適当な名前.sh
  • $./適当な名前.sh
  • destディレクトリが作成されて完成!

お試しあれ

Pocket

Xcode6でAppExtensionなアプリの提出でハマった

こんにちは。haranicleです。
そういえば、blogもっていたので、たまにはメモ。

AppExtension(Custom Keyboard)がついてるアプリをリリースしようとして、
XcodeでArchiveしてOrganizerでValidateしようとすると、こんなエラーが…

iTunes Store operation failed.
Bad bundle identifier. The bundle identifier ‘net.haranicle.myapp’ of the application extension ほげほげふがふがなんかのパス/MyKeyboard.appex should extend the dotted path of the bundle identifier of its containing application(‘net.haranicle.myapp’).

解決策

単刀直入に解決策。

Containing AppとApp Extensionは別BundleID、AppID、Provisioning Profile

BundleIDは↑のエラーメッセージにあるように以下のようにしないといけません。

Containing App: “com.mycompany.appname”
App Extension: “com.mycompany.appname.extensionname”

で、Bundle IDが異なるのでApp IDも別です。iOS Dev CenterでそれぞれのAppIDを作りましょう。
App IDが違うので、Provisioning Profileも別ですApp IDと同様にそれぞれのものを作りましょう。
最後にそれぞれのターゲットに対応したProvisioning Profileを設定して完成!
無事提出できたら、全裸でWaiting for Reviewしましょう。

Pocket

SHUIKitBlocksが便利なのでBlocksKitから乗り換えた

こんにちは。haranicleです。
この前の#yhiosでBlocksKitつかってるひとーって聞いてみたら、10人中2人だけで驚きました。
みんな、どうやってUIAlertViewのコード書いてるんだろう。

Continue reading

Pocket

pod installでMERGE_HEAD existsなエラーが出る

こんなエラーが出た。

[!] Pod::Executable pull --no-rebase --no-commit

You have not concluded your merge (MERGE_HEAD exists).

Please, commit your changes before you can merge.

このコマンドを叩いたらなおった。

pod repo remove master
pod setup

めでたしめでたし。

ソース
pod install often complaining about MERGE_HEAD existing · Issue #2024 · CocoaPods/CocoaPods · GitHub

Pocket

Olderposts

Copyright © 2017 blog.haranicle.net

Theme by Anders NorenUp ↑