酢ろぐ!

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

開発

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

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

AndroidでSensorManagerを使って磁気センサー(コンパス)の方位を取得する

コンパスのように磁気センサーを使って磁北を指したい。 LocationServiceはユーザーの利用許諾が必要だったけれど、磁気センサーは特にユーザーに許可を得なくても利用できるようです。 sensorManager = (SensorManager) getActivity().getSystemService(Act…

AndroidでLocationManagerを使って位置情報を取得する

AndroidでLocationManagerを使って位置情報を取得する方法を紹介します。現在、minSdkVersionが19で開発しています。 事前情報 API 19ではFragment#requestPermissionsとFragment#onRequestPermissionsResultが使えない*1ので、一旦パーミッションの許可をFr…

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

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

Postfix(sendmail)で日本語サブジェクトのメールを送信すると文字化けしてしまう

macOSでPostfixを動かしてみました。 前回書いた記事の最後に日本語サブジェクトのメールを送信すると文字化けする件について書きました。 $ echo "本文です" | mail -s "タイトル" メールアドレス homebrewでnkfをインストールしました。 FROM_ADDRESS="ch3…

macOSでPostfix(sendmail)を使ってメールを送信する

macOSには標準でPostfixが入っているようです。設定方法はこちらを参考に設定していきました。 Postfixの設定をおこなう メールアドレスとパスワードを設定する $ sudo vim /etc/postfix/sasl_passwd smtp.gmail.com:587 username@gmail.com:パスワード メー…

iOSとAndroidとで非同期処理を書く

iOSとAndroidの両方を実装する機会が多いです。 Splatoon 2の発売に向けてikatomoの再開発をしています*1。その再開発にあたりiOS版とAndroid版とで処理を揃えたいと考えました。 ikatomo for SplatoonKENJI WADAユーティリティ¥120 処理を揃えるといっても…

「さくらのメールボックス」でカスタムドメインを使用する

証明書取るためだけに「さくらのメールボックス」の契約をしました。 2016年6月にAWS Certificate Managerが発表されて、無料でSSL証明書を発行することができるようになりました。僕もその話を聞いてAWS S3上で構築している静的サイトのSSL対応を試みたこと…

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

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

Realm Javaを使って複数の条件でソート(並べ替え)する

本記事ではRealm Javaを使って複数条件でソートする方法を紹介します。 Realm Swiftでの複数条件のソートしたい場合、「Realm Swiftを使って複数の条件でソート(並べ替え)する - 酢ろぐ!」の記事をご覧ください。 並び替えをする String[] names = { "onlin…

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

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

Realm JavaでnullableなInt配列のjsonファイルを読み込む

メモ。あとで書き足す(予定)。 Realm Javaではjsonファイルを読み込んでそのままRealmのオブジェクトをすることができます。しかし、intやstringといったプリミティブ型配列の場合にはそのままダイレクトにRealmに格納することができません。 JSON APIは数値…

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

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

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

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

Mastodonにアップロードした写真のExif(特にGPS情報)は保持されてしまうのか?

結論から書くと「Mastodonにアップロードされた写真のExifは保持されず、アップロード時に削除される」です。少なくともデフォルト設定では。 「Tendon for Mastodon」で写真投稿機能を実装しようとしている時に、プライバシー保護のためにExif(GPS情報)を削…

戻るボタンをカスタマイズしていると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ファイルを再署名(resign)する

現在出力しているipaファイルを新しいProvisioning Profileを使って再署名することができます。 利用用途としては、新しいIPAファイルは作成したくないがProvisioning Profileが失効してしまったり対応するUDIDが増えた時に、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をインストールしていないのは現時点でダウンロードサイトに登録されてい…

バージョン0.2 PreviewになったWindows Bridge for iOSを使ってみた

唐突にWindows Bridge for iOSのことを思い出しました。 Windows Bridge for iOSは、Objective-Cで書かれたiOSアプリをWindowsで使えるようにするプロジェクトの名称です。 Build 2015で発表された当時、Project Islandwoodと呼ばれていました。2015年8月にW…

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に改行ボタンを配置したカスタムセルを表示しているだけ…

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の更新作業は放置でも良いのです…

SwiftでRGBからHSVへ変換する

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

Pokétomoで稀にカイロスがキャタピーと誤認識されてしまう問題

Pokémon GO用のポケモンの個体値を計算するアプリを作っています。 (公開停止しました) Pokétomoではスクリーンショットを解析して個体値を求めるのですが、今回稀にカイロスがキャタピーと誤認識されてしまう問題についてメモしておきたいと思います。 個体…

iPhone 4sだとCIDetectorが使えない

iPhone 4sだとCIDetectorが使えません。APIとしては存在しているのですが、detector.featuresInImage(img)で常にnilが返されます。 少し悩んだのですが、フォーラムに同じ問題で悩んでいる方がいました。 CIDetector doesn’t work for QR-code detection o..…

Androidアプリのビルドで「Unsupported major.minor version 52.0」のビルドエラーが発生する

Jenkinsを使ってアプリをビルドをしているのですが、この2ヶ月間少し毛色の違うプロジェクトをやっていたこともあって、ビルドサーバーのジョブは増えていませんでした。 久しぶりにAndroidアプリのビルドジョブを追加すると、見たことのないタイプのエラー…

「Windows Bridge for iOS」でUITableViewを使ったiOSアプリを変換できるのか試してみる その2

Windows Bridge for iOSは、Objective-Cで書かれたiOSアプリをWindowsアプリに変換するソリューションです。詳しくはこちらの記事を御覧ください。 UITableViewを使ったサンプルアプリをWindows Bridge for iOS SDKで変換して、きちんとWindows側で再現でき…

「Windows Bridge for iOS」でUITableViewを使ったiOSアプリを変換できるのか試してみる

引き続きWindows Bridge for iOSネタです。 Windows Bridge for iOSは、Objective-Cで書かれたiOSアプリをWindowsアプリに変換するソリューションです。詳しくはこちらの記事を御覧ください。 さて今回は、UITableViewを扱えるのかを試してみたいと思います…

機能強化された「Windows Bridge for iOS」でiOSアプリをWindowsアプリに変換してみる

「Windows Bridge for iOS」が機能強化されたという情報が入ってきました。新しいバージョンではAutoLayoutに対応したようです。 iOS用Windowsブリッジチームはこのほど、CoreFoundationの正式な実装をWinObjCコードベースに統合し、完全なCoreFoundation及…

MacでiOSとAndroid用のアイコンを1024x1024のストア申請用の画像からスクリプトで一気に作成する

とあるプロジェクトでiOS/Androidそれぞれに対応したアプリを開発しているのですが、アイコン用にストア申請用の1024x1024の画像をいただきました。 たかだか十数枚なのでペイントツールを使って1枚1枚手作業で縮小しても構わなかったのですが、微調整が入る…

Xcode 7でビルドしたアプリをApplication Loaderを使って申請するとInvalid Swift Supportが発生する

Jenkinsからxcodebuildを使ってipaファイルを生成します。Application Loaderを使ってipaファイルをアップロードするとInvalid Swift Supportが発生したとメールが送られてきます。 Appleから送られてくるメール Application Loaderを使ってアップロードする…

iOS 9でHeiti TC/SCが使えなくなっている

すこし前にHeiti SCを指定しているはずなのに意図通りフォントが表示されていないことがありました。調べてみたらiOS 9ではHeiti TC/SCが使えなくなっていることがわかりました。 フォント名 Heiti TC STHeitiTC-Light STHeitiTC-Medium Heiti SC STHeitiSC-…

MacからAWS EC2のAmazon LinuxにSSHで接続する

AWS EC2(Amazon Linux AMI)で新しいインスタンスを作成するとec2-userというユーザーが作成されます。Amazon Linuxの場合にはデフォルトでec2-userですが、それ以外のAMIの場合には異なることがあるようなので別途確認してみてください。 MacからSSH接続する…

Amazon Linuxでec2-userと同じ鍵を使ってrootで直接ログインできるようにする

AWS EC2(Amazon Linux AMI)で新しいインスタンスを作成するとec2-userというユーザーが作成されます。Amazon Linuxの場合にはデフォルトでec2-userですが、それ以外のAMIの場合には異なることがあるようなので別途確認してみてください。 インスタンス作成後…

EC2 Amazon Linuxで`knife solo cook`を実行しようとするとrsyncで失敗する

EC2のAmazon Linuxでknife solo cookを実行しようとすると、rsyncで失敗してしまう現象が発生していました。 何故エラーが発生しているのか理解できなかったので解決まで時間がかかってしまいました。 実行環境 クライアント側 Mac OS X El Capitan(10.11.3)…

入門Chef Soloを読んでます

突然ですがChefの勉強を始めました。 ネットで調べてみようと思ったのですがQiitaみたく断片的なTipsであればたくさん記事があるのですが、なにせ右も左も分からないので体系的に書かれているサイトがなくて困りました。 そこで調べてみたところ猛烈にプッシ…

Realm Swiftを使って複数の条件でソート(並べ替え)する

本記事ではRealm Swiftを使って複数条件でソートする方法を紹介します。使用しているRealm Swiftのバージョンは0.97.0です。 Realm Javaでの複数条件のソートしたい場合、「Realm Javaを使って複数の条件でソート(並べ替え)する - 酢ろぐ!」の記事をご覧く…

SwiftでToday Extensionのデバイスの向きを判定する

少し前のエントリ「SwiftでToday Extensionの高さをUITableViewの高さに合わせる」で、Widgetの高さの上限値は「アプリ名のセクションを含めてWidgetが1画面で収まる高さ」と書いておきながら、デバイスを横にした時の処理を忘れていました。 下図は、現在開…

SwiftでSDWebImageを使ってダンロードした画像を加工してUIImageViewに表示する

iOSでネットワーク上のリソースをUIImageViewに表示するライブラリに「SDWebImage」というものがあります。導入方法については以下の記事で紹介しました。 SDWebImageを使ってUIImageViewに画像を表示させるには下記のように書くことができます。 // import …