xcode

iOS13でアプリ名のローカライズがおかしくなる問題

日本とと英語に対応したアプリを作成していて開発メンバー向けに配布したところ「iPhoneのホーム画面に表示されるアプリ名を正式版にして欲しい」と連絡が来た。 そのとき実際にはアプリ名を設定済みでSimulatorでも検証機のiPhone7(iOS12.4.1)でもアプリ名の表示を確認していた。 iPhoneのホーム画面に表示されるアプリ名のローカライズ InfoPlist.string という Strings File を作成 XcodeProjectのLocalizations設定 デフォルトのEnglishに加えて、+ からJapaneseを追加。 このときローカライズ対応するファイルを指定しないと追加されないので、あらかじめ InfoPlist.string を作成しておく。 必要に応じて Use Base Internationalization をチェックするとBaseも追加される。 ローカライズに対応したファイルはXocde上では1つのファイルが折りたたまれたように表示されるが 実体は言語毎にディレクトリが作成されて内包されている。 en.lproj/InfoPlist.

ios

iOS13のFontFamilyName

iOS8系でフォントの一覧 iOS9系でフォントの一覧 iOS10系でフォントの一覧 iOS11系でフォントの一覧 iOS12系でフォントの一覧 iOS13系でフォントの一覧 取得方法 familyNameからfontNameを取得する。前回かより少し変更しました。 UIFont.familyNames .sorted { $0.compare($1) == .orderedAscending } .flatMap { UIFont.fontNames(forFamilyName: $0).sorted { $0.compare($1) == .orderedAscending } } .forEach { print($0) } 確認環境 iPhone 11 Pro

xcode

ObjCのXcodeプロジェクトをSwiftのプロジェクトに変更する

Objective-Cで作成されているプロジェクトをSwift混在プロジェクトに作り替えようという話があった。 XcodeのテンプレートプロジェクトではObjective-CとSwiftどちらの言語を選べるけど、言語が変わる以上に何が変わるのかというかどこが言語選択のキモになるかを調べたので需要は無いだろうけど、Objective-CベースのプロジェクトをSwiftベースのプロジェクトに作り替えた作業のログを書く。 日本語がおかしかったので編集したらもっと日本語がおかしくなった。 なんでSwift混在にしたいのか 最近は主にSwiftで開発を行っていて、サードパーティーのライブラリもSwiftのものを利用しているから。 Objective-C製のライブラリをSwiftで使うときは割とどうとでもなるけど、Swift製のライブラリをObjective-Cで使うときはライブラリが内部クラスなのか public なクラスなのか設定が必要とかそういうのがあったはず。 そのため新規開発する部分はSwiftで、外部ライブラリを使用したいObjective-Cの実装もSwiftでextensionで実装して、改修が不要だったりシンプルな既存の改修で済むような場合はObjective-Cのままでいこう。みたいな方向で落ち着きました。 ObjCベースのプロジェクトをSwiftベースに移行する流れ Step.1 Objective-Cのプロジェクトを作成する Single View Appで作成する。 名前はなんでもいいので ObjcBaseProj にした。 Step.2 Swiftファイル AppDelegate.swift を作成する AppDelegate.

xcode

Xcode11 の Single View App をiOS12以前に対応させる

Xcode11で Single View App を Swift Storyboard の設定で作成して、iOS10系以降をサポートする設定にした。 ビルドすると沢山エラーが出た。 AppDelegate.swift と SceneDelegate.swift で、iOS13からavailableになったクラスが使用されているため。 赤丸が点いた箇所、画像の AppDelegate.swift ではfuncの宣言箇所で @available(iOS 13.0, *) を書く(赤丸をクリックすると自動で挿入してくれる)。 SceneDelegate.swift は class SceneDelegate

ios10

iOS10のFontFamilyName

旧OS iOS8系でフォントの一覧 iOS9系でフォントの一覧 iOS10系でフォントの一覧 iOS11系でフォントの一覧 iOS12系でフォントの一覧 iOS13系でフォントの一覧 iOS10でフォント一覧を書き出すの忘れていた。 Swift3での取得方法が気に入らなかったので修正。ObjCとそーとのロジックが異なるけどもう不要かなって気もする。 取得方法 familyNameからfontNameを取得する。今回からソートするようにした。 //////////// // Objc NSMutableArray<NSString*> *array = [NSMutableArray array]; for (NSString *familyName in [UIFont familyNames]) { for (NSString *fontName in [UIFont fontNamesForFamilyName:

xcode

StoryboardやXibで 簡単にAttributed Stringを使う/RGB指定した色に違和感があったら

誰得2本立て。 簡単にAttributed Stringを使う StoryboardやXibを使って静的なテキストを設定するとき、例えばアンダーラインだったり一部だけフォントの色を変えたりするようなときはPlainではなくAttributedなテキストを使うわけなんですが、個人的にXcodeでは設定がうまく反映されなかったりして結構大変というか地味にめんどくさい。 そんなときは標準アプリ テキストエディット(/Applications/TextEdit.app) がオススメ。 テキストエディットでファイルを新規作成して、テキストを装飾したらテキストエディットでコピーして、そのままXcodeのUILabelなどにペーストすると装飾も一緒に貼り付けできる。 コピー&ペーストはPlainなテキストではなく背景色や文字の色など装飾も一緒に(Attributed)なテキストとして扱える。 RGB指定した色に違和感があったら XcodeでRGB(Hex)を使ってを指定するときは大体こんな感じ。 Colorsウィンドウでは指定されたRGBの値をスポイトマークの左側に表示してくれます。 デザイナーさんから「RGBは 0x4A90E2 でお願いします(alphaは当然FFという前提)」みたいに連絡されるわけなんですが、なぜかこんな事態も稀に。 1枚目

xcode8

Xcode8でBundle IDを設定する

Xcode8でBundle Identifier(以降Bundle ID)を設定する方法。 たしかXcode7あたりから設定箇所が変わりましたよね。 プロジェクトを作る Bundle IDはプロジェクトを作るときに設定する項目から自動的に作成されます。 <Bundle ID> = <Organization Identifier>.<Product Name> Bundle IDを変更する ただ単にBundle IDを変更する場合の手順 Project Navigator(左ペインの一番左のアイコン) プロジェクトの設定を開く Bundle IDを変更したいTARGETを開く Bundle Identifierを書き換える

ios

iOS開発初心者に知ってもらいたい開発スキル

この記事は画像がたくさんだったりしてすごく長いです。 SwiftでiOS開発の勉強をしている会社の新人と話をしているときに実装中のコードを見せてもらうと気になる実装があった。 let action = UIAlertAction(title: "title", style: .default, handler: { (action: UIAlertAction!) in ... }) UIAlertActionのイベントハンドラになるクロージャの引数の型が違う。 このイニシャライザのメソッド定義はこちら。 open class UIAlertAction : NSObject, NSCopying { public convenience init(title: String?, style: UIAlertActionStyle, handler: ((UIAlertAction) ->

xcode

iOS10.1 ATS

前回の検証がBeta版だったので安定版でも検証した 検証環境 iPad Pro 9.7 iOS10.1 Xcode 8.1 Swift3 検証方法 非SSLリクエスト先はhttp://www.example.com SSLリクエスト先はhttps://www.example.com 非SSLリクエストとSSLリクエストを行い結果を確認する(合計8つのリクエスト) UIWebView WKWebView NSURLSessionで該当URLのソースコードをダウンロードして表示 NSDataで該当URLのソースコードをダウンロードして表示 これらのリクエスト結果がATSの設定パターンでどのように変わるのかを比較する 検証手順 上記検証方法に対応したプロジェクトを作成して実機起動(シミュレータは実機と異なる動作をすることが多いため) http(s)

xcode

iOS10 ATS設定について

iOS10.1で検証しなおして表にしました。 この記事の内容はBeta版の動作です。 iOS10からATS(App Transport Security)の設定が増えるということと、「Webに接続するiOSアプリは2017年1月からHTTPSの使用が絶対条件になる、デベロッパーはご注意を」で色々と騒がれていましたが最近はあんまり聞かないですね。iOS10のリリースも近いはずなのに。 上のリンクのソースはこのPDFのp.100みたいです。 App Transport Security + Required by App Store at end of 2016 + TLS v1.2, with exceptions for already-encrypted buld

xcode

iPhone Simulatorでも通信速度調整したい

1. dmgファイルをダウンロードする ここからインストールしているXcodeに対応した Hardware IO Tools をダウンロード もしくはXcodeからダウンロードサイトを開いて Hardware IO Tools を検索してダウンロード 2. Network Link Conditioner をインストール dmgファイルを展開する Network Link Conditioner.prefPane を開くとシステム環境設定に追加される システム環境設定の Network Link Conditioner を開く あとはもう見たらわかるレベル

xcode

Swiftのコンパイルはストレスが溜まるので

SwiftでiOSアプリを作成しているとコンパイル速度が遅くてストレス溜まるなーというタイミングが多々あるのでコンパイル速度というかストレスを減らそうという対応を幾つか記載。 やったこと プロジェクトのコンパイル時間計測オプションを設定する Xcodeプロジェクトの Bundle Settings にある Swift Compiler - Custom Flags で -Xfrontend -debug-time-function-bodies を設定する BuildTimeAnalyzer を入れる BuildTimeAnalyzer プラグインをインストールする 現行バージョンではBuildTimeAnalyzerの更新中にビルドし直すとクラッシュするけど重いメソッドが見られるので便利。 InterfaceBuilderの自動コンパイルを止める StoryboardかXibファイルを開いてInterfaceBuilderが表示されているときに Automatically Refresh Views のチェックを外す。 Xcode -> Editor ->

ios

Xcodeでコードを書かずに角丸のボタンを作る

タイトルの通り、プログラムらしいことをしないで角丸ボタンを表示する 手順 角丸画像を用意する XcodeのAssetに画像を追加する 画像のスライス設定で可変領域を設定する 角丸画像を表示したいボタンの背景画像(Background image)に設定する コードで実装する 覚えてたら後で書く その他 動画のアップロードがイケてない。youtubeとかじゃないとうまくいかないのかも。

ios

iOSアプリのDBをCoredataからRealmへ

現時点の最新バージョン v0.96.2 での内容なので、バージョンによって違うかもしれないです。 GUIをインストール ブラウザが無いと閲覧できない。最新バージョンのzipをDL。 公式の日本語ドキュメントは最新バージョン用ではない可能性があるのでgithubのURLから直接落とす方が安心。 https://github.com/realm/realm-browser-osx/releases/ Xcode Plugin XcodeでModelファイルを新規作成するにはPluginを入れると簡単になるらしい。 Xcode Pluginは公式ドキュメントにならってAlcatrazからインストールする。 Xcode Pluginのインストールディレクトリパスはこちら ${HOME}/Library/Application\ Support/Developer/Shared/Xcode/Plug-ins Alcatrazのインストール コマンドラインから実行

xcode

Xcodeプロジェクトの残骸Schemeを消す

gitを使って開発しているとSchemeを追加/削除などで、Xcode上に残骸が出ることがある。 該当するアイコンがないので歯車が表示されるが、ユーザの設定を削除することで解消できる。 Xcodeの該当プロジェクトを閉じる ターミナルで下記コマンドを実行 $ cd path/to/project $ rm -rf <Your Project>.xcodeproj/xcuserdata/<Your Name>.xcuserdatad 極論xcuserdata配下のデータはすべて削除しても問題ないと思う。 .gitignoreに*. xcuserdatad を追加していても問題ない。

xcode

Xcode7からのBundle Identifier定義

--- 追記@2016/12/6 こっちにXcode8での設定方法を書きました --- 追記ここまで Xcode6系まではinfo.plistで直接定義する形だったけど Xcode7からはProjectファイルで定義するようになって、info.plistのbundle identifierの項目はこんな感じになっていた(Xcodeのマイグレーションをするとこうなるということで。 $(PRODUCT_BUNDLE_IDENTIFIER) メリット ビルド設定(Build Configuration)でバンドルIDが変更できるようになった。 Debugビルド、Releaseビルド、AdHocビルドなどでバンドルIDが変更できるのでターゲットを無駄に追加する必要が無くなった。 デメリット 理解していない人がinfo.plistを書き換えたら死ねる。 下手に書き換えられたら別アプリになるから。。。

ios

GoogleAnalyticsを組み込んだiOSアプリがiOS9実機ビルドできなかった

表題の通りGoogleAnalyticsを組み込んだiOSアプリのiOS9実機ビルドでエラーが出た。 とりあえず何も考えないでGoogleAnalyticsを最新版に更新したが変わらなかった。iOS9対応というかXcode7対応。 https://developers.google.com/analytics/devguides/collection/ios/v3/sdk-download?hl=ja エラー内容 ld: '/Users/xxxx/path/to/app/Libs/GoogleAnalytics/libGoogleAnalyticsServices.a(TAGDataProvider.o)' does not contain

ios

iOSエンジニアに知っていてほしいブレークポイント

アプリを改修するiOSエンジニアが知っていると得をするブレークポイント。 デバッグするときにブレークポイントを使用しないエンジニアはあまりいないと思う。 アプリを改修することになったとき、元々自分が実装したアプリ以外は画面の構成やイベントハンドリングが自分の思想とは全然違うことがあって、どこで画面遷移が行われているのか。どの画面がいま表示されている画面なのかわからないということはよくある。 そんなときに使うブレークポイントがSymbolicBeakpoint。 Xcodeで「⌘+7」を押してブレークポイントを表示して、ウィンドウ左下の+ボタンから作成する。 [UINavigationController pushViewController:animated:] [UIViewController presentViewController:animated:completion:] こんな感じで設定しておけば、このクラスメソッドやインスタンスメソッドが実行されるときにブレークポイントが作動して止まってくれる。 上記の場合だど実際にはUIKitのメソッドで停止するのでスタックを辿る必要があるけど、 どのクラスのどのメソッドから画面遷移のイベントが実行されたか判断できる。

ios

UITabBarの色を変える

UITabBarControllerのデザインをちょこちょこ調整する必要があった。 またいつか使いそうな気がするのでメモ。 この設定はiOS7.1系以降なら問題なく動くと思う。7.0系は問題があったようななかったような。 + (UIImage *)imageFromColor:(UIColor *)color size:(CGSize)size { CGRect bounds = CGRectZero; bounds.size = size; UIGraphicsBeginImageContext(bounds.size); CGContextRef contextRef = UIGraphicsGetCurrentContext(); CGContextSetFillColorWithColor(contextRef, [color CGColor]); CGContextFillRect(contextRef, bounds); UIImage

program

Xcodeでメソッドにコメント書く

コメントは大事 例えばこんな感じで書くと色々と便利。メソッドだけじゃなくてプロパティとかただの変数でもいい。 /** @method increment: @param i NSInteger 数値 @return 引数iをインクリメントして返す 引数iをインクリメントして返すお仕事 */ - (NSInteger)increment:(NSInteger)i { return ++i; } 気をつけること コメントは/*!ではなく/**で始めた方がいい。Swiftで/*!が無視された(今は違うかも? 説明を書くときは空行を入れる、もしくは@discussionを使う この2つくらい。 使い方 コメントを書いたメソッドをクイックヘルプ(オプション+