酢ろぐ!

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

開発

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

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でも同じ問題に悩んでいる方がいました。 エ…

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-…

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 …

SwiftでUIColorの色を一段階暗くする

// 一段階暗くする var color: UIColor = UIColor.redColor() var hue : CGFloat = 0 var saturation : CGFloat = 0 var brightness : CGFloat = 0 var alpha : CGFloat = 0 if color.getHue(&hue, saturation: &saturation, brightness: &brightness, alpha…

SwiftでもSDWebImageを導入する

SDWebImageは画像をダウンロードとダウンロードした画像のキャッシュをおこなってくれます。細かな設定があり、キャッシュ総容量であったり有効期限を指定して使うことができます。 導入にはいつもどおりCocoaPodsを使います。Podfileに下記のように記述しま…

Androidでヘッドセット(イヤホン)の接続状態の変化を検出する

Androidでヘッドセット(イヤホン)の接続状態が変わったイベントを取得する必要がでてきました。ヘッドセットの状態変更関係を検出する用途では2つのIntentが存在しています。 Intent.ACTION_HEADSET_PLUGとAudioManager.ACTION_AUDIO_BECOMING_NOISYです。 I…

iOSアプリ開発の記事一覧

iOSアプリケーションの開発Tipsを紹介しています。 目次 目次 導入 基本的なプログラミング 文字列操作 リフレクション View 拡張機能・エクステンション マルチメディア 画像処理 カメラ ネットワーク SDWebImage デバイス/センサー システム マルチスレッ…

SwiftでNSAttributedStringを使って文字列を装飾する(UILabelに画像を表示する)

直近でやっていたプロジェクトでNSAttributedStringに関する知識が少なくて苦労したので忘れないようにメモしておきます。 NSAttributedStringに関してはすでに色んなブログやサイトで紹介されているのでご存知の方も多いかもしれませんが文字列を装飾してく…

Swiftでシングルタップとダブルタップとロングプレス(ホールド)に同時に対応する

iOS 3.2からUIGestureRecognizerが追加されてからよく使っていたのですが、シングルタップとダブルタップ、ホールド(ロングプレス)に同時に対応します。 シングルタップとダブルタップはUITapGestureRecognizerクラスで対応することができます。ホールド(長…

.NET向けのTwitterライブラリ「CoreTweet」の使い方まとめ

最近、うちのサイトによくCoreTweet関係で検索してこられる方が増えました。 今のところ最新版を使っての挙動を確認していますが、僕自身いつまで動作確認をしているかも分かりませんので、僕のサイトを見るよりもGitHubやコミッターの方々のブログを見て頂…

Xcodeでのビルドを自動化するxcodebuildコマンドとIPAファイルを作成してiTunes Connect(Testflight)に投げる方法

2014年にAppleがTestflightを買収してから数年経ちました。Androidのサポートが打ち切られたりして対応に追われたこともありましたが、数年経ち公式にiTunes Connectのアプリ申請プロセスに組み込まれるようになりました。 iOS 8を公開した時期から1つのバー…

C#とCoreTweetを使って自分がフォローしているリストの情報を取得する

本記事ではC#とCoreTweetを使って、自分が作成またはフォローしたリストを取得する方法を紹介します。 CoreTweetのNuGetを使った導入方法とTwitterの開発者サイトでのアプリケーション登録(アクセスキーの取得)に関しては以前紹介した「C#とCoreTweetを使っ…

C#とCoreTweetを使って特定のユーザーの直近のツイートを取得する

本記事ではC#とCoreTweetを使って、特定のユーザーの直近のツイートを取得する方法を紹介します。 CoreTweetのNuGetを使った導入方法とTwitterの開発者サイトでのアプリケーション登録(アクセスキーの取得)に関しては以前紹介した「C#とCoreTweetを使って簡…

Firefox OSスマートフォン「Fx0」の標準の地図アプリについて

まだ発売されていませんが田中プロのざっくばらんなトークでFirefox OSスマートフォン「Fx0」が発表されました。KDDIにはこれからも他社がやっていないことに挑戦してもらうためにもFx0には売れてほしいですね。 Flameを買えなかったのもあって、Firefox OS…

ASP.NET MVCでホスト型のFirefox OS アプリを作ったときに「.webapp」ファイルにアクセスできない

ASP.NET MVCでホスト型のFirefox OS アプリを作ったときに「.webapp」ファイルにアクセスできなくって困ったので、備忘録代わりに残しておきます。 まずは普通にプロジェクトへ.webappファイルを追加します。ソリューションエクスプローラーからプロジェクト…