読者です 読者をやめる 読者になる 読者になる

酢ろぐ!

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

iPhone

バージョン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からのアップデートになります。 そのアプリの、とある画面でズームイン・ズームアウトする機能…

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

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

iOSアプリにFirebaseを導入する

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

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も、両方ともデータを保存…

「Windows Bridge for iOS」でGame Technologyを使ったiOSゲームプロジェクトを変換できるのか試してみる

Windows Bridge for iOSは、Objective-Cで書かれたiOSアプリをWindowsアプリに変換するソリューションです。詳しくはこちらの記事を御覧ください。 結論を先に書くと、Game TechnologyにSceneKitを使ったGameプロジェクトはSceneKit自体が未サポートで変換で…

Windows Bridge for iOSで表示できるUIコントロールを調べてみた

Windows Bridge for iOSは、Objective-Cで書かれたiOSアプリをWindowsアプリに変換するソリューションです。詳しくはこちらの記事を御覧ください。 iOSではUISwitchやUIButtonなど標準のUIコントロールが用意されています。これらのUIコントロールはそのまま…

「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ではUISplitViewControllerを使うと画面が表示されなくなるようです

Windows Bridge for iOSは、Objective-Cで書かれたiOSアプリをWindowsアプリに変換するソリューションです。詳しくはこちらの記事を御覧ください。 先日、storyboardで定義したUITableViewControllerのプロジェクトを変換して、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及…

App Extension(Widget)を含んだiOSアプリをCocoaPods 1.0にバージョンアップさせる

記事自体は2ヶ月前に書いていたのですがちょうどiTunes Connectがトラブっていた時期だったので公開できずじまいでした。そのため一部記載しているバージョンが古い部分があります。 大半のプロジェクトでCocoaPods 1.0.0へ移行し終えてノウハウも溜まってき…

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

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

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

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

iTunes ConnectにバイナリをアップロードするとITMS-90080のエラーが返ってくるようになった

CocoaPodsをバージョン1.0.0に上げたのが原因でしょうか、App extensionを含むバイナリなのが問題なのでしょうか。 今日の夕方あたりからiTunes Connectにバイナリをアップロードするとワーニングが返ってくるようになりました。 お昼頃にはバイナリをアップ…

CocoaPods 1.0を導入後、JenkinsでCocoaPodsを含んだiOSアプリプロジェクトのビルドで署名に失敗してしまう

こんにちは、ビルド職人です。去年の今頃、このような記事を書きました。 CocoaPods 1.0にしたらこの現象が再発してしまいました。 === BUILD TARGET DZNEmptyDataSet OF PROJECT Pods WITH CONFIGURATION Release === Check dependencies Code Sign error: …

iOS 7.1.2でUIActionSheetに表示されている1番目の項目を選択しても何も実行されない

割と有名な話かもしれませんが iOS 7とiOS 8以降とでUIActionSheetの挙動が違っていたためハマりました。 Xcode 7.3.1ではすでにiOS 7はサポートされておらず、手元にiOS 7デバイスがなかったのでハマったとも言えます。挙動が掴めずに最終的にiOS 7デバイス…

XcodeのiOS Simulatorを単独で起動させる

開発環境やCocoaPodsの関係でiOS 7のサポートが切れると嬉しいなと考えています。 XcodeのiOSシミュレータは、単独で起動させることができます。 $ cd /Applications/Xcode.app/Contents/Developer/Applications $ open ./iOS\ Simulator.app または $ open …

CocoaPodsをv1.0.0にアップデートしたら「TypeError - Unable to convert Ruby value "FBSDKCoreKit" into a CFTypeRef.」がでてpod installが失敗するようになった

pod installできない系の問題に結構ぶつかってる気がする。今回は「TypeError - Unable to convert Ruby value `"FBSDKCoreKit"' into a CFTypeRef.」とエラーが出てJenkinsのビルドジョブが途中でabortしてしまう現象についてです。 CocoaPodsはここ数ヶ月…

CocoaPodsをv1.0.0にアップデートしたら「ArgumentError - invalid byte sequence in US-ASCII」でpod installが失敗するようになった

pod installできない系の問題に結構ぶつかってる気がする。今回は「ArgumentError - invalid byte sequence in US-ASCII」とエラーが出てJenkinsのビルドジョブが途中でabortしてしまう現象についてです。 結果から書くと、ビルドスクリプトに export LC_ALL…

SwiftでiOSデバイスに入っている楽曲データを取得する

iOSデバイス(iPhoneやiPod)に入っている楽曲データ一覧からアーティスト情報やタイトル情報を取得します。 let albumsQuery = MPMediaQuery.albumsQuery() if let albums = albumsQuery.collections { for album in albums { for song in album.items { // …

Swiftでタブバーにバッジを点灯させる/タブバーの部分に任意のUIViewを表示させる

iOSアプリでタブバーにバッヂを点灯させてみましょう。また消灯させる方法についても紹介します。 標準のバッヂはモサっとしていて嫌だと思う方もいるかもしれません。カスタマイズさせることを厭わない方向けに、タブバーの部分に任意のUIViewを表示させる…

iOSでreason: 'Could not load NIB in bundle: 'の例外が発生して起動しなくなった

Xcode 6.4で開発していたアプリをXcode 7.1で起動する状態にして、数ヶ月放置してXcode 7.3でまた起動させようとしたらアプリが起動しなくなってしまった。 Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Could …

iOSでFacebook SDKを使ってのログインに失敗する

先日「TwitterKitを使ってのログインで失敗する」という記事を書きました。Twitterにログインするだけのコードを書くのが随分と簡単になりました。 今日はFacebookにログインする処理を書いてみましたが、やはり少しハマってしまいました。導入ドキュメント…

iOSでTwitterKitを使ってのログインで失敗する

久しぶりにTwitter APIを弄る機会がありました。 最近はTwitter APIを叩くといえばCoreTweet(C#)一択なのですが、今回はiPhoneアプリだったのでCoreTweetは使えず。公式のTwitterKitを使ってログインさせてみました。 TwitterKitを導入する CocoaPodsを使っ…

CocoaPods経由でRealm 0.98.3をインストールすると'impl/async_query.hpp'が見つからないとエラーが出てしまう

今までとは別のプロジェクトにアサインされたので、いつものように開発環境を整えようとpod installをしてRealmをインストールしようとしたところ、謎のエラーが出てビルドができなくなりました。 謎のエラーとは'impl/async_query.hpp' file not find.とい…

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

本記事ではRealm Swiftを使って複数条件でソートする方法を紹介します。使用しているRealm Swiftのバージョンは0.97.0です。 たとえば、Userというオブジェクトがあります。Userクラスは下記のように定義しています。 import RealmSwift class User : Object…

Ruby 2.3.0にしてCocoaPods 0.39.0を使ったらpod installでエラーが出た

数ヶ月前に開発で使っているMacBook ProをOS X El Capitan(10.11.3)にしたんですが、当初使えていたXcode 6.4がなにかのキッカケで壊れてしまいました。Xcodeを起動した時にツールバー(?)にスキームや実行するiOSシミュレータを選択する部分が表示されないん…

SwiftでUINavigationControllerのナビゲーションバーを表示/非表示を動的に切り替える

UINavigationControllerのナビゲーションバーを表示/非表示を動的に切り替える方法としては、UINavigationController#setNavigationBarHiddenメソッドを使います。 // ナビバーの表示を切り替える if let nv = navigationController { let hidden = !nv.navi…

SwiftでSVGKitを使ってSVG画像を表示する

SVGはベクター形式の画像フォーマットのひとつです。SVGを使ったことがなかったので調べたこともないのですが、SVGをUIImageに変換するライブラリはいくつかあるようです。 ここでは、SVGKitを使って画像を表示しました。 導入にはいつもどおりCocoaPodsを使…

Xcode 7.2(iOS 9.2 SDK)を使うとUILabelが崩れたりNSAttributedString#boundingRectWithSizeで意図しない値が返ってくる

時間ができた時にコツコツと Xcode 6.4 + iOS 8.4 SDKを使って開発していたアプリをXcode 7.2でビルドが通るようにしていました。要するにSwift 1.2からSwift 2.1.1への移行です。 ある時、UICollectionViewのフッターの表示が崩れていることに気付きました…

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

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

Jenkinsを使ってToday Extension(Widget)を含むiOSアプリをビルドする

過去にxcodebuildを使ってビルドを自動化する方法を紹介しました。 本記事ではToday Extension(Widget)を含むiOSアプリをJenkinsでビルドする方法を紹介します。アプリ側とToday Extension側とで使用するプロビジョニングプロファイルが異なります。 ビルド…

SwiftでUITextFieldの文字入力を検出する

iOSでは文字入力用のコンポーネントとしてUITextFieldを利用します。文字入力中……1文字入力ごとにバリデーションしたい時があります。たとえば、 ログイン画面でユーザーIDとパスワード欄が両方入力された場合にログインボタンを有効にする ユーザー登録中に…

CocoaPodsを使ってEmbedded Frameworkにライブラリを追加したらiTunes Connectからリジェクトされる

CocoaPodsを使ってEmbedded Frameworkにライブラリを追加したらiTunes Connectからリジェクトされてしまった。 問題は解決していないので寝る前にメモを残しておきたいと思います。解決でき次第、追記するかもしれません。 やりたいこと jsonをダウンロード…

SwiftでもSDWebImageを使う

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

iOSでカスタムフォントを使う

その昔、iOSアプリでカスタムフォントを使うのはそれなりに大変だった気がするのですが、Xcode 7ではInterface Builderからカスタムフォントを直接指定できるようになっていました*1。 本記事では、iOSでカスタムフォントを使う方法を紹介します。具体的には…

【2015/8/31まで】Windows Phoneアプリ開発者は無料でXamarinのライセンスがもらえるよ!

C#でiOSやAndroidのアプリを開発できる「Xamarin」のライセンスを無料で入手できるキャンペーンをやっているようです。 Xamarinの代理店エクセルソフトの田淵さんのブログによると…… 2015/8/17 以前に公開された Windows Phone アプリ個人開発者に無料の Xam…

Objective-Cで書かれたXcodeプロジェクトをWindows 10で動かす「WinObjC」のプレビュー版がでました

Objective-CやJavaで書かれたiOSアプリやAndroidアプリをWindows 10で動かすためのWindows Bridgeプロジェクトがあります。ワシントン州の地名をとったコードネームでそれぞれ「Project Islandwood」「Project Astoria」と呼ばれていました。 https://dev.wi…

SwiftでGrand Central Dispatch(GCD)を使った並列処理が実行される順番を調べてみた

Grand Central Dispatch(GCD)を使った並列処理が実行される順番を調べました。 やりたいこととしては、別スレッド上で処理してすべての処理が完了したらUIスレッドに終わった通知を送りたい。つまり並列処理の待ち合わせ(並列プログラミングガイド的にいえば…

SwiftでWatchKitアプリのテーブルでセルの背景の角丸をなくす/セルの背景を消す/セルにセパレーター的なものを追加する

Apple Watch*1のWatchKitアプリで実装する際によく聞かれることのひとつとしてはテーブル(WKInterfaceTable)での表現力です。WKInterfaceTableを使っているといかにUITableViewが表現力に優れているのかが分かります。 それはさておき表題のように「テーブル…

JenkinsでCocoaPodsを含んだiOSアプリプロジェクトのビルドで署名に失敗してしまう

(開発的な意味で)チームで働くことはほぼなくて1人でiOSアプリを開発していると、1件1件最新ビルドが欲しいという要望に応えるのが難しかったです。……というか、僕は限界だったのでJenkinsを導入してJenkinsおじさんを酷使していました。 それ以降、Xcodeプ…

Swiftを使って文字列操作する

文字列操作する方法を手癖で書けるほどSwiftに馴染んでいないので、いつでも見返せるようにメモしておきます。 文字列同士の結合 let str = "daru" + "yanagi" println(str) var str = "daru" str += "yana" str += "gi" println(str) 区切り文字を使って文…

Swiftで数字をUnicodeScalarクラスを使って①や⑩の丸囲み文字に変換する

①や⑩というのを丸囲み文字と呼ぶようです。数値から丸囲み文字に変換する必要があったので調べてみました。 ⓪, ①,②,③,④,⑤,⑥,⑦,⑧,⑨,⑩, ⑪,⑫,⑬,⑭,⑮,⑯,⑰,⑱,⑲,⑳, ㉑,㉒,㉓,㉔,㉕,㉖,㉗,㉘,㉙,㉚, ㉛,㉜,㉝,㉞,㉟,㊱,㊲,㊳,㊴,㊵, ㊶,㊷,㊸,㊹,㊺,㊻,㊼,㊽,㊾,㊿, …

Swiftでreduceメソッドを使って配列の中から文字列長の長いオブジェクトを取得する

Swiftで配列の中から文字列長の長いオブジェクトを取得する方法を紹介します。 ここではString型の配列や特定のクラスのString型プロパティの配列から最も長い文字列を持つオブジェクトを取得します。判定の仕方を変更すれば文字列以外での判定をおこなうこ…

Swiftでリフレクションを使ってインスタンスからプロパティの一覧を取得する

Swiftでインスタンスからプロパティの一覧を取得してみましょう。以下のようなPersonクラスがあるとします。 @objc(Person) class Person : NSObject { let age: Int let name: String required init(age: Int, name: String) { self.age = age self.name = …

Swiftで文字列のクラス名からインスタンスを動的に生成させる

文字列からインスタンスを生成する方法として、Objective-Cでは「文字列のクラス名からインスタンスを動的に生成させる - iOSアプリ開発の逆引き辞典」で紹介しているようなコードを書くことで文字列のクラス名称からインスタンスを動的に生成させることがで…