酢ろぐ!

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

開発

Xcode 9 GM SeedでJenkinsのビルドに失敗する

Xcode 9 GM SeedでIn-HouseなアプリをJenkinsでビルドさせるときにエラーが発生しました。 Jenkinsのコンソールログを見ると、Archiveには成功しているけれどExportに失敗しているログでした。 error: exportArchive: “MY_APPLICATION.app” requires a provi…

iPhone X シミュレータで上下の黒帯が入ってアプリ領域が欠ける

iPhone X シミュレータで上下の黒帯が入ってアプリ領域が欠ける現象が発生しました。 iPhoneでは互換性を保つための仕組みがあって、例えばiPhone 5が登場した時にアプリを起動すると上下の黒帯が入る現象がありました。4.7インチRetinaディスプレイに対応さ…

Xcode 9 GMでCarthageを使ってインストールしたRealmがビルドエラーになる

Xcode 9 GMをインストールしました。 ikatomo2をビルドしようと試みました。Realmを使っているのですがRealmの部分で下記のようなエラーが発生しました。 /MY_APP/db/Database.swift:10:8: Module compiled with Swift 3.1 cannot be imported in Swift 3.2:…

Xcode 9 GM Seedでcarthage updateを実行したらエラーが発生した

Xcode 9 GMをインストールして、carthage updateを実行したらエラーが発生した。 $ carthage update Carthage requires git 2.3.0 or later. 先に結論を書くと、原因はXcode.appのパッケージの名前を変更していたからでした。 Xcode 9 GMをXcode.appとしてま…

MongoDBが起動しない

MongoDBをbrewでインストールして起動させる MongoDBをbrewでインストールした。 $ brew install mongodb mongoを実行するとデーモンが立ち上がってないのでエラーになる。 $ mongo MongoDB shell version v3.4.6 connecting to: mongodb://127.0.0.1:27017 …

Cloud Functions for Firebaseを使ってhello worldを表示してみた

node.jsに対する苦手意識があるのでCloud Functions for Firebaseを使いながらnode.jsに慣れていきたいと思います。 $ npm install -g firebase-tools インストールができたみたいです。次に作業ディレクトリを作って下図の通りコマンドを実行していきます。…

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…