#author("2021-07-06T05:28:05+00:00","default:wikiadmin","wikiadmin") #author("2021-07-06T05:29:50+00:00","default:wikiadmin","wikiadmin") -iPhone,iPadプログラミングについて *XCode トラブル [#i9fb5c06] 最悪のIDE。Beta版なみの品質。ファイル消失やクラスを認識しないなどどうしようもない事態に陥ること多数。 -unable to build chain to self-signed root for signerが出て実機インストール失敗(MBP 13)。 -信頼されてないデベロッパと出たが、なんとか別マシンで成功 -ファイルを追加しても認識せず、もう一回おんなじ手順で上書きで認識 -ボタンのフォントサイズが変更できない(XCode13 beta1) -StoryBoardとViewControllerの紐付けがいくらどうやっても出ないので手詰まり。OptionキーとViewControllerで開くべし。 *環境切り替え [#f9602e6a] https://qiita.com/Todate/items/a2e6a26731c79bd23e02#%E3%82%A2%E3%83%97%E3%83%AA%E3%81%AE%E3% BuildConfigという仕組みで、内部で#ifで分けることができる。UserDefined Settingにキーを追加することで、info.plistでもBuildConfigに応じた値を取得可能 #if RELEASE return "https://www.example.co.jp" #else return "https://dev.example.co.jp" #endif TARGETSでも同じようなことができるのだが、使っているところは少ないようだ。 *ビルド [#m9c8b863] **ローカルでxcode-build [#k8e473e8] sudo xcode-select -s '/Applications/Xcode12.app/Contents/Developer' xcode-select -p xcodebuild -version xcodebuild -workspace project.xcworkspace -scheme Camera -configuration Debug archive -archivePath . -export_methodがapp-storeになってなければ本番にいくことはないだろう。 **fastlane [#fd927660] gym( scheme: "MyApp", configuration: "Staging", export_method: "ad-hoc or development or enterprise or app-store", include_symbols: true, clean: true, ) **bitrise (xcode-archive) [#o9cca60b] *iOS15 [#j64ac7e1] -Facetimeのzoom化 -LiveText(日本語非対応でGoogle Lensパクリ) -SafariのUI変更(タブの切り替えやスワイプが画面下部に集約されて片手操作しやすくなった) -WalletアプリがIDカードや部屋の鍵として使えるように -iCloudがiCloud+になりプライベートメールアドレス生成機能やiCloud Private Relayと呼ばれるVPNに近い機能 *XCode13 [#b6bc898c] https://www.hackingwithswift.com/articles/236/whats-new-in-xcode-13 -Swift5.5(async&awaitの導入、Swift package collections) -XCode Cloud -Vim モード導入 -バージョンコントロールとの連携強化(PR作成など) -Custom documentation with DocC *Store Kit2 [#f7bf20f8] -前方互換性をもった新しいSwiftベースのAPI -アプリ内で返金プロセスを実装できる *Swift 5.5 [#s12d1329] https://www.hackingwithswift.com/articles/233/whats-new-in-swift-5-5 -async await -@MainActor -#if *UIKit [#qe0435ca] |UIActivityViewController|シェアボタンなどで出てくるモーダル| |UIButton|通常のボタン| |UINavigationBar|設定アプリなど改装を持ったナヴィゲーション| |UITabBar|時計アプリ| |UIToolbar|サファリの下部のボタンなどを表示するバー| |UIBarButtonItem|UIToolbarのボタン| *用語集 [#w6fe3349] |ipa|zipファイルで固めたアプリのアーカイブ| |plist|プロパティのXMLファイル| |entitlements|package名などが記載されている。pushの設定などもこちら| |SwiftUI|iOS13より利用可能な宣言的UI| |UIKit|古くから使われているコードベースのUI。StoryboardもxibもUIKitが使われている| *配布 [#ff51be88] **端末の上限 [#m14190e4] -100デバイスでかつ契約更新時じゃないと登録追加ができないというクソ仕様。開発アカウント分割で乗り切るしかない **Deploy Gate [#w87e9750] -テスト用にアプリ配布ページを作成できる(ログイン不要) -事前にUUIDの登録は必要 - *Xcode [#p0528664] *勉強まとめ中 [#h768818e] -StoryBoardは複数設定できる。Mainであれば設定不要だが、初期起動を変える場合はGeneralで設定変更必要 -StoryBoradに複数のViewControllerを入れられる。Is Initial View Controllerで矢印のある初回ViewControllerを設定できる *トラブルシューティング [#qfef17cf] |Editor placeholder in source file|直しても出ていたことがあったので、Clean Build Folder| |UITableViewControllerがクラッシュ|オブジェクトインスペクタで修正して保存してなくて、紐付けが見つからず落ちた| **必要環境 [#ya02c4b4] OSの要求バージョンが比較的厳しくて、MacOSリリースされた翌年あたりからそのMacOSが必須となる。iOS14.5の対応に必要なXCode12.5からBig Surが必須となる **複数バージョン入れる [#j35865d7] 入れた後でXcode_xxみたいに改名するだけっぽい **ショートカット [#u2541d87] ***Windows領域操作 [#w5b012ff] 左側はCommand+0で非表示。数字で切り替え 右側はOpt+Coomand+0で非表示。数字で切り替え ***日常利用 [#c8aa8f2e] |ファイルを開く|Cmd+Shift+O| |選択範囲を整形|Ctrl+I| **調べる [#n7dc4fa8] -外部ライブラリの追加(環境変数とか) -cocoapods -プロビジョニングプロファイル -bundler **用語集 [#x0a9c18d] |インスペクターペイン|プロパティ編集| |ライブラリーペイン|フォーム部品| **ショートカットキー [#k4fcee07] |Ctrl + i |フォーマット| |変数状でOption|クイックヒント| *UI部品 [#x344649d] |UINavigationBar|設定画面で利用される階層ありのNavi| |UITabBar|時計で使われるタブBar| |UIBarButtonItem|一般的にアプリの下部の複数ボタン並べる| |ImageView|aspectfillで画像の縦横比に合わせる| *Objective-C [#kc6362d8] **一行知識 [#h84e1d64] |#import|<>だと標準ライブラリのディレクトリから検索。""だと現在のディレクトリから検索。一度読み込んだものは再度読み込まない。| |ViewController間での値の共有|プロジェクト名Delegateのプロパティを利用する。[[UIApplication sharedApplication] delegate]]で取得可能| |IBOutlet|InterfaceBuilderの部品のプロパティにつける接頭語。IBActionも同様| |IBAction|イベントプロシージャーのようなもの。| |XXXAppDelegate.h|Androidで言うところのライフサイクルを管理する。アプリケーションコントローラー| |XXXViewController.h|Viewのコントローラー。xibファイルを持つ| |オブジェクト型の変数|ポインタなので*varNameのように*が必要。| **Javaとの比較 [#e2fa3910] プロパティはJavaと同じ感覚でつかえるけど、メソッドの呼び方が他の言語と比べると特殊。メソッド呼び出しがネストしてたら目も当てられない複雑さ。 |this.someMethod(arg1, arg2)|[self someMethod:arg1 arg2:arg2]| |Hoge hoge = new Hoge();|Hoge *hoge = [[Hoge alloc] init];| |Array|NSArray| |List|NSMutableArray| |Map|NSMutableDictionary| |interface|protocol| |view.getI()|sender.tag| |プリファレンス|NSUserDefaults| ***インスタンス変数 [#ceacdd70] 結構混乱したので記述しておく。インスタンス変数は基本privateなものをさす。property宣言をすると自動的にインスタンス変数とアクセスメソッドが作成されるようだ。javaだとインスタンス変数はスコープに関係ないが、Objective-Cにおいてはprivateなものと解釈するのが安全。 **ARCとは [#j88e3d0c] 参照カウントを自動でやってくれる機構。コンパイル時にソースに参照上げ下げなどを挿入してくれる。 *iOS [#j529f156] **プロジェクトファイルの構成 [#y1a2abf2] 一つのViewControllerだけのアプリケーションであればシンプルで、ViewControllerで使いたい部品をViewController.hに接続してあげればよい。アプリ全体の起動、終了にかかわることはViewControllerに記述するのではなく、AppDelegateにまさに委譲している。これにより複数ViewControllerがあるアプリでも、アプリ全体に関する設定の記述を迷わなくてすむのだ。 **アプリケーションデリゲート [#y8329526] イベントの通知をうけるメソッドを定義してある。Androidでいうところのライフサイクルイベント。どのときに呼ばれるかはメソッド名を見れば一目瞭然。またActivityにListenerを実装するようにコントローラー自体にdelegateメソッドを持たせることも可能。その場合はViewController.hでプロトタイプを宣言しておく。たとえばUITextFieldDelegateを実装する場合は<UITextFieldDelegate>と宣言し、実装クラスでtextFieldShouldReturnメソッドを実装する。UIAlertViewにもdelegateを指定することができる。ボタン押されたときの処理分岐をViewControllerで実装することができる。 **複数Viewでの情報共有 [#a27fc3f3] アプリケーションデリゲートにプロパティを追加する。そのプロパティを各ViewControllerで利用する。なお利用するためにはimport文が必要 **TavBarにViewを追加するときの手順 [#e4f54712] +テンプレートからCoCoaTouchのUIViewControllerのサブクラスを選択。h,m,xibの3ファイルができる +タブアイテムを選択し、Identifyでクラスと結びつける。Attributeでxibと結びつける **コード内でUI部品の追加 [#e6e48136] UILabel *label = [[[UILabel alloc] init] autorelease]; [self.view addSubview:label]; *お役立ちリンク集 [#cf517e57] http://golog.plus.vc/iphone/906/ http://d.hatena.ne.jp/moto_maka/20110425/1303673150 *Xcode4 [#s6de4a5c] **ナビゲータエリア [#edcf650f] eclipseのパッケージエクスプローラーの位置にある。通常はファイル表示。シンボルナビデーターでクラス名やメソッド名のみ表示させることができる。 **エディタ [#wa8da91d] |アシスタントエディターの分割|Viewメニューから選べる。また右上のプラスボタンで分割できる| |アシスタントエディターで開く|Option(Alt) を押しながらクリックする| |開く場所を選ぶ|Option(Alt)+Shift を押しながらクリックする| |メソッド定義へ飛ぶ|Command(Windows)を押して、クリックか右クリックして定義へ飛ぶ| **外部ライブラリ [#d4c9c85f] frameworkフォルダに依存フレームワークを持ってくる *書籍情報 [#cc13fcfc] |書籍名|感想|場所|サポートサイト| |iOSデバッグ&最適化技法 for iPad/iPhone|入門レベルでは必要性を感じないが、そのうち再読必要|上福岡図書館|| |10日でおぼえる iPhoneアプリ開発入門教室|サンプル、画面キャプチャー豊富でこれよい!|自宅|| |よくわかるiPhoneアプリ開発の教科書|各パーツの説明は丁寧だけど、つなぎ合わせてのサンプルが少ない。Xcode4対応版もあるので注意|NCC|http://book.mycom.co.jp/support/pc/iphonesdk_book/| |iPhone/iPad/iPod touch プログラミングバイブル|同じ著者のAndroid本と同じくコード上で部品を配置していくスタイル。インターフェースビルダーすら使わない|NCC|| |Xcode4ではじめる Objective-Cプログラミング|ほぼObjective-C本。4.2対応。コンソールアプリから始まり最後にちょいiPhoneアプリ|NCC|http://www.rutles.net/download/Xcode4_ObjectiveC/sapotopeji.html| |Objective-C 超入門|ほぼObjective-C本。4.2対応|NCC|| *iTunesのバックアップフォルダ移動 [#k6599017] Cドライブバックアップ先を変更できないというクソ仕様なのでジャンクションで対応 |バックアップ先|C:\User\ユーザ名\AppData\Roaming\Apple Computer\MobileSync\Backup| +新しいバックアップ先を作成し、上記backupディレクトリ毎移動 +以下のコマンドを実施。MybileSyncにbackupディレクトリが存在するとエラーとなるので注意 mklink /J "C:\User\ユーザ名\AppData\Roaming\Apple Computer\MobileSync\Backup" "d:\new\backup" *iOS開発読み直し [#xe6f4c87] -OutletはViewをイベントリスナーで操作したいときに必要。 -通常のボタンなどはアクションでViewControllerにひもづけるだけでよいが、Webのロード完了のようにコールバックが必要なものはDelegateとしてViewControllerに処理は移譲する。 基本的にimplementsの代わりに<xxx,yyy>と記述する感じだ。