酢ろぐ!

カレーが嫌いなスマートフォンアプリプログラマのブログ。

開発-iOS

CocoaPodsでインストールしたRealmをCartageで管理するように変更する

もうかれこれRealmを使い出して、はや2年半くらいになります。 Realmは大きなライブラリなのでビルドする度にとても時間がかかっていました。ビルド1回終わるのに7〜8分かかってしまいます*1。 その都度ブーブー言ってたわけなんですけれど、ようやく重い腰…

iOSでGoogle AdMobの動画リワード広告を表示する

久しぶりにAdMobを試しています。たまにゲームなどで動画広告を見ると報酬が貰える実装がありますよね。動画リワード広告と呼ぶらしいです。 Google AdMobの動画リワード広告を表示する import UIKit import GoogleMobileAds class TableViewController: UIT…

BrightFuturesで非同期処理実行後にクラッシュしてしまう

メモ。 BrightFuturesで非同期処理実行後にクラッシュしてしまう不具合があった。原因がわからず数回試行してみて、下記のメッセージ部分でクラッシュしていることがわかった。 Attempted to completed an Async that is already completed. This could beco…

SwiftでUIView.beginAnimations(_: context:)〜UIView.commitAnimations()でアニメーションした場合のアニメーション終了時のイベントを取得する

UIView.beginAnimations(_: context:)〜UIView.commitAnimations()でアニメーションした場合のアニメーション終了時のイベントを取得したいと思いました。 Objective-Cを使った場合には対応方法がよく紹介されているのですが、Swift 3.1を使った書き方が調べ…

iOSシミュレータで磨りガラスが灰色で表示されてしまう

かなり昔のできごとで、ikatomoの開発途中で詰まったときの話です。はてなブログの下書きに残り続けていたので投稿しちゃいます。 すりガラスが灰色で表示されてしまう… フレンド詳細画面では名前の背景が磨りガラスになっていて、下方向にスクロールすると…

Share Extensionの実装でハマったところ

天どん v1.0の頃にいただいた「Safariからの共有したい」という要望に対応するためにShare Extensionを実装しました。ikatomoでToday Extensionの実装はしたことはありましたが、Share Extensionを実装するのは今回が初めてでした。 Share Extensionというの…

iOSアプリの戻るボタンをカスタマイズしているとUINavigationController#pushViewControllerで遷移しなくなる

数年前から開発しているアプリで謎の不具合が発生していました。「ときどきボタンを押してもフリーズしたようになって画面遷移しない」というものでした。 再現性がものすごく低くてほとんど発生しないことからスルーされてきました。つい先日、ほぼ100%再現…

(未解決)iOS 10.3.1にアップデートした一部の端末でIn-House/Ad-Hocバイナリがインストールできない

未解決案件。何かわかり次第、追記します。 環境について Xcode 8.3.1でビルドしたIn-House/Ad-Hocバイナリ アプリの配布場所は AWS S3に配置 (https) 現象について ビルドしたipaファイルとダウンロード用のplistをS3にアップロードしています。 ダウンロー…

ipaファイルを新しいProvisioning Profileを使って再署名(resign)する

現在エクスポートしている.ipaファイルに対して、新しいProvisioning Profileを使って再署名することができます。 利用用途としては、Xcodeの環境があまりにも古すぎて環境構築できない.ipaファイルを新しいProvisioning Profileで再申請したり、失効してし…

Xcode 8.3.1でAutomatically manage signingが有効になっているプロジェクトの場合にipaファイルが出力できない

Xcode 8.3以降でAutomatically manage signingが有効になっているプロジェクトで、コマンドライン(xcodebuild)を使ってipaファイルを作成することができず、途中でビルドエラーが発生してしまう問題にぶち当たりました。 個人的な感想としては、Xcode 8.3でx…

iPhoneシミュレータが起動できなくなった

Xcode 8.3.1でiPhoneシミュレータを起動させようとすると、画面が真っ暗なまま下図のようなエラーダイアログが表示されました。 エラーメッセージの内容。 Unable to boot device because it cannot be located on disk. Use the device manager in Xcode or…

Xcode 8.3でxcrun PackageApplicationが使えなくなってしまったので対策しました

開発中のアプリはMac miniを使ってJenkinsでビルドしています。Xcode 8.3.1がリリースされたことだし、古いバージョンのXcodeを削除してXcode 8.3をインストールしました。Xcode 8.3.1をインストールしていないのは現時点でダウンロードサイトに登録されてい…

NSTextAttachmentが含まれているNSAttributedStringでは行間をあけることができない

UILabelで「画像+複数行のテキスト」を実装したいが、行間の調整をすることができず頭を抱えていました。ミニマムコードで現象が再現するのか、このエントリを書きながら調査ました。 結論を先に書くと、NSTextAttachmentにもlineSpacingを設定する必要があ…

UIScrollView#scrollViewDidZoomが呼ばれなくなった

Swift 1.xの頃からメンテしているアプリがあって、コンテンツのアップデートを兼ねてSwift 3に更新しました。いきなりSwift 3に上げたのではなくて一応Swift 2.3からのアップデートになります。 そのアプリの、とある画面でズームイン・ズームアウトする機能…

Swiftで角丸・背景透過・枠線のボタンを作る

メモするまでもないかもしれないけれど、こんな感じのボタンを作った。 Swiftで角丸背景透過枠線のみのボタンを作る カスタムviewを使った。 import UIKit class MyRoundButton : UIButton { override func awakeFromNib() { super.awakeFromNib() setTitleC…

iOSのAutoLayoutで複数行テキストのボタンが正しく改行されない

複数行テキストのボタンをAutoLayoutで配置したら、テキスト量によって改行するボタンを作りたかったんだけど、ハマってしまって改行してくれないボタンになってしまった。 作りとしては、UITableViewに改行ボタンを配置したカスタムセルを表示しているだけ…

UICollectionViewの初期表示時にズレる

メモ。覚えていたらあとで説明を書く。ケアレスミスしてた。 UICollectionViewの初期表示時にズレる UICollectionViewを幅MAXで使わない時に初期表示時にズレるのか? UITableViewCellの中にUICollectionViewを入れて使っている。 UICollectionView横スクロ…

iOSアプリでFirebase.Storageから画像をダウンロードする

前回の続きから。 let imageKey = "" let storageRef = FIRStorage.storage().reference(forURL: "gs://appname-xxx.appspot.com") let imageRef = storageRef.child(imageKey) imageRef.data(withMaxSize: 2 * 1024 * 1024, completion: { (data, error) in…

iOSアプリでFirebase.Storageに画像をアップロードする

Firebase.Authと一緒に使用します。 //一律jpegにしてもいいかもしれないね let image = getImage() let data = UIImageJPEGRepresentation(image, 90)! let imageKey = "images/main_image.jpg" let storageRef = FIRStorage.storage().reference(forURL: "…

iOSアプリでFirebase.Authに匿名サインインする

アプリを使う上で必ずしもユーザーの詳細情報は必要ないけれど、ユニークユーザーとして管理はしたい場合があります。 ショッピングアプリの場合、商品をお気に入り登録したりカートに入れるところまではユーザー登録なしでおこない、実際に購入する段階にな…

iOSアプリにFirebase.RemoteConfigを導入する

本記事ではiOSアプリにFirebase.RemoteConfigを導入した際にしたことを紹介します。メモなのでそのまま運用できないかもしれません。 たとえば、ユーザーにアップデートを促す際にアラートを表示させます。 アラートの表示条件としては、ウェブに置いている…

iOSアプリにFirebaseを導入する

Firebaseにはいくつかのサービスがあって、それぞれがライブラリの形でCocoaPodsに提供されています。CocoaPods経由でインストールすることができるのでPodfileに1行追記するだけで済みます。 Firebaseを導入する 「Firebase」でログインして、プロジェクト…

Swift 3.0対応は大変だった

Xcode 6.3か6.4の時代に作ったiOSアプリがあってメンテしているんですけれど、iOS 7.xに対応する必要がありCocoaPodsも0.39*1環境でしか使えず、Podfileのuse_frameworks!も使えませんでした。 最近、deploy targetの見直しがあってようやくiOS 7.xを外すこ…

Xcode 8のiOS 10シミュレータを使っているとFacebook SDKの認証に失敗する

Firebase.Authを使ってFacebookログインの実装をしていたのですが、iOS 10でFacebook SDKの認証が通らなくなってしまって焦りました。 (追記)この現象はXcode 8のシミュレータ限定の現象のようです。stackoverflowでも同じ問題に悩んでいる方がいました。 エ…

SVGKitをアップデートしたらLOG_LEVEL_VERBOSEの定義がなくてビルドができない

ikatomoは数多くのサードパーティー製のライブラリを使用しています。 ikatomoをSwift 3.0へアップデートさせようと考えました。しかし、ライブラリの多くはSwift 3.0対応中で現時点での移行は難しそうです。 となればikatomoの更新作業は放置でも良いのです…

Swift3.0でRealmSwiftのビルドが通らない

Xcode 8とiOS 10が正式に公開されました。Swift 2からSwift 3への移植は結構大変という前評判だったので、ボチボチ手をつけていくかぁ……とSwift 3対応を始めたもののすぐに詰まってしまいました。 最近作っているikatomoもPokétomoも、両方ともデータを保存…

SwiftでRGBからHSVへ変換する

RGBの値をHSVの値に変換するためのコードを書きました。大昔にC#で書いた処理をSwiftに移植しました。 説明は上記の記事をご覧ください。以下、HSVクラスです。 class HSV { //色相 var hue: Double = 0 //彩度 var saturation: Double = 0 //明度 var value…

iPhone 4sだとCIDetectorが使えない

カメラで撮影した画像に対してCIDetectorを使って文字認識させようとしたところエラーが発生したので調査しました。 iPhone 4sだとCIDetectorが使えない 結論から書くと、iPhone 4sだとCIDetectorが使えません。 APIとしては存在しているのですがデバイスの…

はてなOAuthがちょっと使いにくいなと思った話

はてなOAuthがちょっと使いにくいなと思った話。 iOSではてなフォトライフに写真をアップロードするアプリを作りたいなと考えています。 はてなOAuthを使うのに最適な方法を考えているのですが思い付きませんでした。実際の最適解がよくわからないのでとりあ…

AutoLayout上でTTTAttributedLabelのリンク(下線)を使うと、iOS 7の場合に下線が一部欠けてしまう問題

UILabelの表示を豪華(?)にするライブラリのひとつに「TTTAttributedLabel」があります。 長文の途中でリンクを貼りたい場合……たとえば Twitterでリプライをもらった時に@ch3coohの部分だけリンクを貼りたいというニーズがあるかと思います。 TTTAttributedLa…