xcode

A collection of 32 posts
Cannot find type 'anyClass' in scope @Xcode
xcode

Cannot find type 'anyClass' in scope @Xcode

Objective-CとSwift混在のプロジェクトで開発していたところ Swiftファイルを開いたらObjective-Cで定義されているクラスが cannot find type 'anyClass' in scope のようなワーニングが表示された。 ※ 画像では AppDelegate クラスは実際に定義されておりビルドも通るがエラーが表示される。 ビルドするとエラーが消えて、該当のSwiftファイルを閉じて開くとまたエラーが表示されるようなおかしな挙動。 対策 Xcodeのプロジェクトで Build Setting の項目 Precompile Bridging Header を NO に設定する。 Build Setting の検索窓に Precompile Bridging Header を入力すればすぐ見つかります。 参考 https://developer.apple.com/forums/thread/691672
1 min read
Swift(iOSアプリ)でprintと debugPrintとNSLog
swift

Swift(iOSアプリ)でprintと debugPrintとNSLog

iOSアプリを作っているときログ出力をするならprint|debugPrint|NSLogいずれかを使うけど、Releaseビルドではどれが出力されるのか確認したことが無かったので確認をした。 Objective-CでiOSアプリを作っているときNSLogの出力はReleaseビルドでもログ出力されることは確認していたのでよくあるifdefマクロで LOG(...) のようにしていた。 実装 実装はXcodeでFile > New > Project... > AppでSwiftを使ったアプリ作成 ViewController.swiftの viewDidLoad() に下記を追記 print(">>> this is test message from print") print(">>> this is test message from debugPrint") NSLog(">>> this is
2 min read
Unable to install "MyApp" 追記あり
xcode

Unable to install "MyApp" 追記あり

開発中のiOSアプリをXcodeから実機インストールしていたら Unable to install "MyApp" というエラーが発生するようになった。 MyAppはアプリ名 エラーのDetailsを確認すると This application’s application-identifier entitlement does not match that of the installed application. These values must match for an upgrade to be allowed. 私の環境では、このエラーは再現したりしなかったり。 Xcodeでキャッシュの削除(Product > Clean Build Folder | ⇧⌘Kまたは⇧⌥⌘K)で再現しなくなったりまた再現したり、XcodeやmacOSの再起動などしても変わらず。再現性がわかりませんでした。 思い返すとこの開発中のアプリはEnterpriseアカウントでアプリの配布をしているので、以前にEnterprise配布ビルドのアプリをインストールして以来ずっ
2 min read
iOS13でアプリ名のローカライズがおかしくなる問題
xcode

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

日本とと英語に対応したアプリを作成していて開発メンバー向けに配布したところ「iPhoneのホーム画面に表示されるアプリ名を正式版にして欲しい」と連絡が来た。 そのとき実際にはアプリ名を設定済みでSimulatorでも検証機のiPhone7(iOS12.4.1)でもアプリ名の表示を確認していた。 iPhoneのホーム画面に表示されるアプリ名のローカライズ 1. InfoPlist.string という Strings File を作成 XcodeProjectのLocalizations設定 デフォルトのEnglishに加えて、+ からJapaneseを追加。 このときローカライズ対応するファイルを指定しないと追加されないので、あらかじめ InfoPlist.string を作成しておく。 必要に応じて Use Base Internationalization をチェックするとBaseも追加される。 ローカライズに対応したファイルはXocde上では1つのファイルが折りたたまれたように表示されるが 実体は言語毎にディレクトリが作成されて内包されている
2 min read
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 Simulator (iOS13.3) 結果抜粋 AcademyEngravedLetPlain AlNile AlNile-Bold AmericanTypewriter AmericanTypewriter-Bold Am
2 min read
ObjCのXcodeプロジェクトをSwiftのプロジェクトに変更する
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でex
2 min read
Xcode11 の Single View App をiOS12以前に対応させる
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 自体がiOS13以降のサポートとなるのでこうなる。 これでビルドに成功するようになる。 iOS12系の実機で実行するとコンソールに以下のメッセージが表示され、実機の画面は真っ暗になる。 2019-10-02 02:28:28.466280+0900 Demo[495:13067] [Application] The app del
2 min read
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:familyName]) { [array addObject:fontName];
2 min read
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の値をスポイト
2 min read
xcode8

Xcode8でBundle IDを設定する

Xcode8でBundle Identifier(以降Bundle ID)を設定する方法。 たしかXcode7あたりから設定箇所が変わりましたよね。 プロジェクトを作る Bundle IDはプロジェクトを作るときに設定する項目から自動的に作成されます。 <Bundle ID> = <Organization Identifier>.<Product Name> Bundle IDを変更する ただ単にBundle IDを変更する場合の手順 1. Project Navigator(左ペインの一番左のアイコン) 2. プロジェクトの設定を開く 3. Bundle IDを変更したいTARGETを開く 4. Bundle Identifierを書き換える Bundle IDをConfigurationで分ける DebugビルドとReleaseビルドでBundle IDを分けたい場合。 1. Project Navigator(左ペインの一番左のアイコン) 2. プロジェクトの設定を開く 3. Bundle IDを変更したい
1 min read
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) -> Swift.Void)? = nil) } handlerの引数クロージャの引数はUIAlertActionなのに、なぜかUIAlertAction!と書
6 min read
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)リクエストのキャッシュが残らないよう都度アプリを再インストールする * 8リクエストが終わったら次の
1 min read
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 data like media streaming この件についてはiOS 10のApp Transport Securityと2016年末からのATS必須化についてAppleのエンジニアに聞いてきた(以下、ATS必須化について)で色々とまとめられていますが実際に確認しました。 検証環境 *
1 min read
xcode

XcodeのRunScriptで便利なスクリプトメモ

TODOやFIXME を#warningで表示 スクリプトの実行タイミングはいつでもいい # TODOやFIXMEをワーニング出力 # http://stackoverflow.com/questions/24183812/swift-warning-equivalent TAGS="TODO:|FIXME:" find "${SRCROOT}" \( -name "*.swift" \) -print0 | \ xargs -0 egrep --with-filename --line-number --only-matching "($TAGS).*\$" | \ perl -p -e "s/($TAGS)/ warning: \$1/" 参考 Fabricのスクリプト実行 実機向けReleaseビルドしたときだけスクリプトを走らせる 最後に実行すれば問題無い # Releaseビルドの実機ターゲットでのみfabricコマンド実行 if [ "
1 min read
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 を開く あとはもう見たらわかるレベル
1 min read
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 のチェックを外す。 Xcod
3 min read
ios

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

タイトルの通り、プログラムらしいことをしないで角丸ボタンを表示する 手順 1. 角丸画像を用意する 2. XcodeのAssetに画像を追加する 3. 画像のスライス設定で可変領域を設定する 4. 角丸画像を表示したいボタンの背景画像(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のインストール コマンドラインから実行 curl -fsSL https://raw.githubusercontent.c
3 min read
xcode

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

gitを使って開発しているとSchemeを追加/削除などで、Xcode上に残骸が出ることがある。 該当するアイコンがないので歯車が表示されるが、ユーザの設定を削除することで解消できる。 1. Xcodeの該当プロジェクトを閉じる 2. ターミナルで下記コマンドを実行 $ 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 bitcode. You must rebuild it with bitcode enabled (Xcode setting ENABLE_BITCODE), obtain an updated library from
1 min read
ios

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

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