■目次
アカウントAPP IDXcode環境の作成Objective-CSwiftSwift+Playground製品用、開発用などの切り分けSwift+PushAmazon SNSTestFlight公開Enterpriseで社内向けに配布更新CocoaPodsTIPSトラブルその他メモ
■アカウント
Apple ID https://appleid.apple.com/ Apple Developer Program https://developer.apple.com/jp/programs/ 【Xcode】無料の実機ビルドでどこまでできるのか - Qiita https://qiita.com/koogawa/items/15b231e2728ff64e08f3
■APP ID
Xcodeで Automatic Signing を使う場合でも、APP IDは作成されるみたい テスト用ならワイルドカードのIDでいいみたいだが、プッシュや申請が絡む場合はきちんと作成する必要があるみたい iOS App IDs を登録する https://i-app-tec.com/ios/ios-app-ids.html 個人開発だと適当になりがちなiOSの証明書とアカウントを理解する - Qiita https://qiita.com/guitar_char/items/7dbd7e2bc35a1fc9e5a0
■Xcode環境の作成
■Xcodeインストール Mac App Store で「Xcode」を検索してインストールする Xcode をインストールする、 iOSアプリ作成準備 https://i-app-tec.com/ios/xcode-install.html ■Xcode初期設定 メニューから「Xcode > Preferences > Text Editing」で「Line numbers」と「Code folding ribbon」にチェックを入れる 「Indentation」画面に切り替え、「Line Wrapping」の「Wrap lines to editor width」のチェックを外す ■Simulatorで実行 はじめてアプリを実行するとき、「Enable Developer Mode on this Mac?」と聞いてきたので「Enable」を選択 Simulatorメニューから「Window > Scale > 33%」と設定 Simulator画面内で「Settings > General > Language & Region > iPhone Language > 日本語」と設定 ■iPhone実機で実行 はじめて実機を繋ぐとiTunesが起動したので、利用規約に同意 Xcodeで繋いだ実機を選択すると「Processing symbol files」状態になった。結構時間がかかるので待つ 実機で実行しようとすると「Signing for requires a development team」でエラー 作成しようとしているアプリのプロジェクトを選択して「General > Signing > Add Account」を選択。Apple ID でログイン Tearmで自身のアカウントを選択してビルド キーチェーンへのアクセスを要求されるので「常に許可」 それでも「Could not launch」のエラーになる。ダイアログに詳細が書かれているが、実機側で許可が必要 実機の「設定 > 一般 > デバイス管理」から、使用しているアカウントを選択して承認する これで実機で実行できた ※昔は実機実行のために開発者登録(要年会費)が必要だったり、 実機実行を許可するデバイスをあらかじめ登録したり …が必要だったが、今は不要
■Objective-C
Xcode | くずのは探偵事務所 http://www.kyoji-kuzunoha.com/category/xcode 2018/02/18、Xcode9.2で1〜6まで試してみたが、若干表記が違う程度ですんなり動いた
■Swift
■画面の向き ViewControllerごとに画面の向きを固定する - Qiita http://qiita.com/masapp/items/38ed20b27dcc09c24cba ■パスの確認 ※パスは下のように取る? [0]ではなくlastとか使う方がいい?
let documentPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0] /* // パスの確認 let documentDirPath = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory, FileManager.SearchPathDomainMask.userDomainMask, true) print(documentDirPath) */
■WebViewでWebページを表示 ※これからはWebViewではなくWKWebViewが推奨される ストーリーボードにWebViewを配置する webViewという名前でOutlet接続する(名前は任意) あらかじめWebKitを読み込む
import WebKit
以下のコードでAppleのサイトを表示できる(「@IBOutlet」はOutlet接続によって追加されたコード)
@IBOutlet weak var webView: UIWebView! override func viewDidLoad() { super.viewDidLoad() let myURL = URL(string: "https://www.apple.com/jp/") let myRequest = URLRequest(url: myURL!) webView.loadRequest(myRequest) }
■WKWebViewでWebページを表示 ※これからはWebViewではなくWKWebViewが推奨されるが、現時点では問題も多いので注意 WKWebViewをストーリーボードで配置すると問題が多いので、コードで扱う必要があるかもしれない WKWebViewと向き合ってみた - Qiita https://qiita.com/UJIPOID/items/fd4b33cac48ad37733f5 「iOS11未満もサポートする場合はコードでWKWebViewを実装する必要がある」 以下はストーリーボードで実装する例 ストーリーボードにWKWebViewを配置する webKitViewという名前でOutlet接続する(名前は任意) あらかじめWebKitを読み込む
import WebKit
以下のコードでAppleのサイトを表示できる(「@IBOutlet」はOutlet接続によって追加されたコード)
@IBOutlet weak var webKitView: WKWebView! override func viewDidLoad() { super.viewDidLoad() let myURL = URL(string: "https://www.apple.com/jp/") let myRequest = URLRequest(url: myURL!) webKitView.load(myRequest) }
■WebViewのキャッシュをクリア WebViewのキャッシュは強力で、アプリを再起動しても古い情報を読み続けることが多い プログラムで対応することもできるようだが、なかなか厄介そう 原則としてページをPHPで作成し、CSSファイルなどは「?20180816」のような文字列を付けて読み込む…とするのが安全そう UIWebViewを使うときに気をつけていること - Qiita https://qiita.com/urouro_n/items/d4e5fb66f2039090000f ■WebViewの長押しメニューを制御 UITextfieldやUIWebViewの長押しメニューが英語になる場合の解決法 | イリテク https://iritec.jp/web_service/7326/ WKWebView でテキスト選択禁止や長押しによるメニュー表示禁止(TouchCallout)など | MUSHIKAGO APPS MEMO https://mushikago.com/i/?p=8385 ■Web上の画像を表示
@IBOutlet weak var myImageView: UIImageView! override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. let url = URL(string: "https://pbs.twimg.com/media/DGynUZqV0AAK9aq.jpg") let task = URLSession.shared.dataTask(with: url!) { data, response, error in if error == nil { if let dlImage = UIImage(data: data!) { self.myImageView.image = dlImage } } else { print("error") } } task.resume() /* // 以前の書き方 var myURL = NSURL(string: "https://pbs.twimg.com/media/DGynUZqV0AAK9aq.jpg") var myData = NSData(contentsOfURL: myURL) var myImage = UIImage(data: myData) myImageView.image = myImage */ }
■ローカルファイルを扱う
override func viewDidLoad() { super.viewDidLoad() /* // ディレクトリを作成 let documentPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0] if (FileManager.default.fileExists(atPath: documentPath + "/test")) { print("ディレクトリはすでに作成されています") } else { do { try FileManager.default.createDirectory( atPath: documentPath + "/test", withIntermediateDirectories: false, attributes: nil ) print("ディレクトリ作成成功") } catch let error as NSError { print("ディレクトリ作成エラー: ?(error.localizedDescription)") } } */ /* */ // ファイル・ディレクトリを一覧表示 let documentPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0] var file_names: [String] { do { return try FileManager.default.contentsOfDirectory(atPath: documentPath) //return try FileManager.default.contentsOfDirectory(atPath: documentPath + "/test") } catch { return [] } } let fm = FileManager() for file_name in file_names { var isDir = ObjCBool(false) let isExist = fm.fileExists(atPath: documentPath + "/" + file_name, isDirectory: &isDir) if isDir.boolValue == true { print("dir=" + file_name) } else if isExist { print("file=" + file_name) } else { print("nodata=" + file_name) } } /* // ファイルのテキストを表示 let file_name = "data2.txt" if let dir = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first { let path_file_name = dir.appendingPathComponent(file_name) do { let text = try String(contentsOf: path_file_name, encoding: String.Encoding.utf8) print(text) } catch { print("NG") } } */ /* // ファイルにテキストを保存 let file_name = "data1.txt" //let file_name = "test/data3.txt" let text = "abcd1234" if let dir = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first { let path_file_name = dir.appendingPathComponent(file_name) do { try text.write(to: path_file_name, atomically: false, encoding: String.Encoding.utf8) print("OK") } catch { print("NG") } } */ }
■Swift+Playground
■Playgroundでボタンやラベルを確認
import UIKit var myLabel = UILabel(frame: CGRect(x: 0, y: 0, width: 100, height: 30)) myLabel.backgroundColor = UIColor.gray myLabel.text = "テスト"
■PlaygroundでJSONを取得
import Foundation import PlaygroundSupport PlaygroundPage.current.needsIndefiniteExecution = true class Client { func someTask() { let target = URL(string: "https://lolipop-dp07080676.ssl-lolipop.jp/memos/ios/json.php")! let task = URLSession.shared.dataTask(with: target) { data, response, error in if let jsonData = data { self.printJSON(jsonData) } } task.resume() } func printJSON(_ data: Data) { do { let json = try JSONSerialization.jsonObject(with: data, options: .allowFragments) print(json) if let items = (json as AnyObject).object(forKey: "BOOKS") { for item in items as! NSArray { guard let title = (item as AnyObject).object(forKey: "TITLE") else { continue } guard let price = (item as AnyObject).object(forKey: "PRICE") else { continue } print(title) print(price) } } } catch { print("parse error!") } } } let client = Client() client.someTask()
■PlaygroundでViewControllerを使う [iOS 10] PlaygroundでUIKitの描画を行う | Developers.IO http://dev.classmethod.jp/smartphone/ios-10-playground-uikit-draw/
■製品用、開発用などの切り分け
BundleIDが同じアプリは上書きインストールされる つまり、AppStoreからインストールした本番アプリがあると、その端末には開発版をインストールできない が、スキーマを使用することによりこの問題を解消できる iOS開発で環境ごとにアイコンやアプリ名、コード等を切り分けるオレオレプラクティス - Qiita https://qiita.com/KazaKago/items/2835d76ced43f913c31d ■前提 Scheme buildtest1 ... 製品用 buildtest1_develop ... 開発用 Build Release ... 製品用 Debug ... 開発用 と設定するものとする なお、Buildを一つにしてスキーマで以下のように3段階で分ける手も考えられる (スキーマの切り替えは手軽だが、ビルドの切り替えはそれよりは少し手間) buildtest1 ... 製品用 buildtest1_staging ... 検収用 buildtest1_develop ... 開発用 が、 ・Xcodeがはじめから「Release」と「Debug」を用意している ・「製品版だがデバッグ情報は表示したい」にも対応できる という理由から、 「リリース時は buildtest1+Release、開発時は buildtest1+Debug だが、必要なら buildtest1+Release に切り替えることもある」 で良さそうなので、最初に上げた切り分けで良さそう ■iOSアプリの作成 Xcodeでプロジェクトを作成する Create a new Xcode project ↓ iOS Application Single View App 「Next」 ↓ Product Name: buildtest1 Team: TERRAPORT CO.,LTD. (Enterprise) Organization Name: テラポート Organization Identifier: jp.terraport Language: Swift 「Next」 ↓ プロジェクトの作成場所を選択 「Create」 Bundle Identifier はプロジェクトのGeneralを確認すると「jp.terraport.buildtest1」になっていた エミュレータと実機で、アプリを起動できるかテストする ■ビルドの設定 画面左のツリーでプロジェクトをクリック 「General」「Capabilities」などが並んだ画面になる その画面内の左側から PROJECT → buildtest1 → info と選択(「info」は画面の上部にある) Configurationsの項目があり、初期状態では以下のようになっている Name | Based on Configuration File Debug | No Configurations Set Release | No Configurations Set 今回は以下のように設定する Name | Based on Configuration File Develop_Debug | No Configurations Set ... 既存のDebugの名前を変更 Develop_Release | No Configurations Set ... 既存のReleaseから複製(下にある「+」をクリックして「Duplicate "Release" Configuration」を選択)して名前を変更 Production_Release | No Configurations Set ... 既存のReleaseの名前を変更 ■スキーマの設定 メニューから Product → Scheme → Manage Schemes... を選択 スキーマが一覧表示され、初期状態では以下のようになっている Scheme | Container buildtest1 | buildtest1 project 今回は以下のように設定する Scheme | Container buildtest1 | buildtest1 project buildtest1_develop | buildtest1 project ... 下にある歯車をクリックしてDuplicateで複製。ダイアログ左上で名前だけ変更 それぞれのスキームに対して、ビルドの設定を行う (スキームを選択して「Edit...」ボタンを押す。設定したら「Manage Schemes...」で前の画面に戻る。「Close」で完了する) なお、「Shared」にチェックを入れておくと、この設定をリポジトリに含めることができるらしいので、付けておくと良さそう(未検証) buildtest1の「Archive」「Profile」の「Build Configration」を「Production_Release」に設定する buildtest1_developの「Archive」「Profile」の「Build Configration」を「Develop_Release」に設定する ■BundleIDの設定(1つの端末に、本番アプリや開発アプリを同時にインストールできるようにする) 「PROJECT」の下にある「TARGETS」からアプリを選択 「Build Settings」内の「Packaging」内にある「Product Bundle Identifier」の先頭にある三角をクリックする つまり TARGETS → buildtest1 → Build Settings → Product Bundle Identifier を選択 BundleIDが一覧表示され、初期状態では以下のようになっている Develop_Debug | jp.terraport.buildtest1 Develop_Release | jp.terraport.buildtest1 Production_Release | jp.terraport.buildtest1 今回は以下のように設定する Develop_Debug | jp.terraport.buildtest1.dev.debug Develop_Release | jp.terraport.buildtest1.dev Production_Release | jp.terraport.buildtest1 ■アプリケーション名の設定(インストール後に本番アプリか開発アプリかを判断できるようにする) TARGETS → buildtest1 → info → Custom iOS Target Properties Bundle name が「$(PRODUCT_NAME)」になっていることを確認する TARGETS → buildtest1 → Build Settings → Product Name Develop_Debug | buildtest1 Develop_Release | buildtest1 Production_Release | buildtest1 今回は以下のように設定する(編集時、「buildtest1」は「$(TARGET_NAME)」と表示されるが、気にせず後ろに文字列を追加する) Develop_Debug | buildtest1 Dev Debug Develop_Release | buildtest1 Dev Production_Release | buildtest1 ■署名/証明書の設定 必要に応じて、それぞれのBuild設定ごとに設定する ■スキーマの切り替え Xcode左上の「実行」「停止」ボタンの右にある「buildtest1」部分で切り替えられる ■ビルドの切り替え Xcode左上の「実行」「停止」ボタンの右にある「buildtest1」をクリックして表示される「Edit Scheme...」をクリックし、 「Build Configration」で切り替えることができる ■ビルド設定によるプログラムの分岐 TARGETS → buildtest1 → Build Settings → Swift Compiler - Custom Flags → Other Swift Flags ※フィルタで「Basic」になっていると、「Swift Compiler - Custom Flags」が表示されないので注意 「All」にすると下の方に表示される Develop_Debug | (空欄) Develop_Release | (空欄) Production_Release | (空欄) 今回は以下のように設定する Develop_Debug | -D DEVELOP_DEBUG Develop_Release | -D DEVELOP_RELEASE Production_Release | (空欄) Swiftプログラム内では、以下のようにすると処理の分岐ができる
print("TEST START") #if DEVELOP_DEBUG print("DEVELOP_DEBUG") #elseif DEVELOP_RELEASE print("DEVELOP_RELEASE") #else print("PRODUCTION_RELEASE") #endif print("TEST END")
ただし環境が増えると分岐の対象が多くなるので、以下のように分けて設定するのも有効かもしれない(要検証) Develop_Debug | -D DEVELOP -D DEBUG Develop_Release | -D DEVELOP -D RELEASE Production_Debug | -D PRODUCTION -D DEBUG Production_Release | -D PRODUCTION -D RELEASE
print("TEST START") #if DEVELOP && DEBUG print("DEVELOP && DEBUG") #elseif PRODUCTION && DEBUG print("PRODUCTION && DEBUG") #endif print("TEST END")
■その他参考になりそうなページ iPhoneアプリ開発でデバッグ版とリリース版をきれいに同居させる - しめ鯖日記 http://www.cl9.info/entry/2015/07/29/010020 XcodeでDevelop/Staging/Release環境を上手に切り分ける方法 - Qiita https://qiita.com/Todate/items/a2e6a26731c79bd23e02 [Xcode] ビルド環境を切り替えるためにSchemeを追加する | DevelopersIO https://dev.classmethod.jp/smartphone/iphone/xcode-build-environment-adding-scheme/ テスト用iOSアプリの配布方法 - Qiita https://qiita.com/mishimay/items/47f7680014fc6141f5c4
■Swift+Push
※詳細な検証内容は AmazonSNS.txt を参照 以下は以前に調べたときのメモ ■参考ページ amazon SNSでiOSアプリにプッシュ通知を送る!画像つきで詳しく使い方もまとめました! | イリテク https://iritec.jp/app_dev/16197/ Amazon SNSを使ってiOSアプリにプッシュ通知を送信する方法 | レコチョクのエンジニアブログ https://techblog.recochoku.jp/2537 Lambda(node.js) + Amazon SNSでiPhoneにプッシュ通知を送るサンプルコード - Qiita https://qiita.com/Fujimon_fn/items/740ecfdd9328375c1616 おじさんのための2018年スマホPUSH通知事情 (+GCM終了のお知らせ) - Qiita https://qiita.com/keidroid/items/290af7b99952e889f4a7 ■未検証だが参考になりそう APNsとは?設定と実装方法の完全版! | Growth Hack Journal https://growthhackjournal.com/ios-remote-push-notifications-in-a-nutshell/ AWS SNSを使ってiOSへpush通知 - Qiita https://qiita.com/ijun/items/2cbff7664e49fb93bf39 プッシュ通知に必要な証明書の作り方2018 - Qiita https://qiita.com/natsumo/items/d5cc1d0be427ca3af1cb Swiftでプッシュ通知を送ろう! - Qiita https://qiita.com/natsumo/items/8ffafee05cb7eb69d815 Releases - noodlewerk/NWPusher https://github.com/noodlewerk/NWPusher/releases Push通知を送信できるアプリ Pusher [iOS8以降]Push通知の実装とテスト(swift) - Qiita https://qiita.com/k-yamada-github/items/258aec32a0d5b514f1cf ■旧サンプル http://refirio.org/twitter/?word=push
■Amazon SNS
※詳細な検証内容は以下のファイルも参照。以下は以前に調べたときのメモ C:\Users\Yamano\Dropbox\技術\AmazonSNS.txt [基本操作]Amazon SNSでメールを送信する | Developers.IO https://dev.classmethod.jp/cloud/aws/amazon-sns-2017/ まずは上の方法でメールとHTTPでの通知を試す 問題なければ、アプリへのプッシュ通知を試す amazon SNSでiOSアプリにプッシュ通知を送る!画像つきで詳しく使い方もまとめました! https://iritec.jp/app_dev/16197/ Rails + Swiftのプッシュ通知をAmazonSNSで実現する https://qiita.com/3kuni/items/62c4739cf1316b2c2ef4 トピック型のモバイルPush通知をRails + Amazon SNSで実装する https://tech.medpeer.co.jp/entry/2018/03/15/080000 プッシュ通知に必要な証明書の作り方2018 https://qiita.com/natsumo/items/d5cc1d0be427ca3af1cb 【Swift】いまさらですがiOS10でプッシュ通知を実装したサンプルアプリを作ってみた https://qiita.com/natsumo/items/ebba9664494ce64ca1b8 [Swift] Amazon SNS で iOSアプリにPush通知を送信する #アドカレ2015 https://dev.classmethod.jp/cloud/aws/aws-amazon-sns-mobile-push-swift/ Amazon Simple Notification Service https://docs.aws.amazon.com/ja_jp/sns/latest/dg/mobile-push-apns.html ■以下は連携された調査メモ Amazon SNS で、iOS・Androidにpush通知する方法 - Qiita https://qiita.com/papettoTV/items/f45f75ce00157f87e41a phpでAWSのSNSを使ってpush通知を送るときのパターン的なお話 ~ 適当な感じでプログラミングとか! http://watanabeyu.blogspot.com/2017/01/phpawssnspush.html 大規模ネイティブアプリへのプッシュ通知機能導入にあたって考えたこと - Qiita https://qiita.com/gomi_ningen/items/ab31aa2b3d46bb6ffa5e
■TestFlight
TestFlightの使い方!iOSアプリをテスト配信、導入方法まで! | イリテク https://iritec.jp/web_service/11438/
■公開
iOSアプリリリース手順1 - Certificate、App IDの準備 http://www.swift-study.com/ios-app-release-1-certificate-and-app-id/
■Enterpriseで社内向けに配布
※詳細な検証内容は以下のファイルも参照。以下は以前に調べたときのメモ C:\Users\Yamano\Dropbox\iOS\In-House で書き出すメモ.txt iOS Developer Enterpriseで社内向けiOSアプリを作って配布する方法 [完全版] | イリテク https://iritec.jp/selfhack/3355/
■更新
■証明書更新 Apple Developer:3分で完了!期限切れ間近の開発者証明書の更新手順 | siro:chro http://www.sirochro.com/note/apple-developer-certificate-update/ ■プロビジョニングプロファイル更新 http://refirio.org/twitter/?date=20160918 iOS Developer Program の契約は続けているのに、全然iPhoneアプリを作っていない…。 posted at 2016/09/18 00:04 ので、久々にMacを起動したけど、Xcodeはバージョンアップされているし、プロビジョニングプロファイルの有効期限は切れているし、再発行してみてもよく解らないエラーが出て実機に書き出せないし。で2時間ほど悩んでいた。 posted at 2016/09/18 00:05 ブラウザで Apple Developer にログインして更新された規約に同意して、Xcode > Preferences > Accounts からプロビジョニングプロファイルを作り直して、プロジェクトの General > Signing > Term で自分の名前を選択。 posted at 2016/09/18 00:11 で再度実機で動くようになった…はず。いろいろ試していたので、何か書き忘れているかもだけど、一応の備忘録として。 posted at 2016/09/18 00:12 Android Studio も、自宅PCではベータ版の時のままだったので最新版に更新。正式版になってから日本語化できなくなったと聞いていたけど、https://t.co/KPFIVflBQO の方法で日本語化できた。 posted at 2016/09/18 00:43 ■Apple Developer Program 更新 Appleにログイン https://developer.apple.com/account/#/overview/HEZ8494358 にアクセス Renew Membership ボタンを押して、利用規約に同意 Appleにログインして支払内容確定 ■「Your iOS Distribution Certificate will expire in 30 days.」メールが来た 「アプリを書き出して公開する」ときに必要な証明書の期限が切れる…というものらしい 公開中のアプリには影響しないようなので、もし「アプリを改良して更新する」ということがあれば、そのタイミングで更新することになるみたい Your iOS Distribution Certificate will expire in 30 days.が来た時の対処法 | Macfancy http://macfancy.com/2015/11/07/your-ios-distribution-certificate-will-expire-in-30-days-%E3%81%8C%E6... iOS - ios一年おきの証明書の更新について(85469)|teratail https://teratail.com/questions/85469 ■その他 Apple Developer で規約への同意が必要になっていないか確認する Xcodeのセッションが切れているときがある。ログインしなおす プロジェクトの General > Signing > Term で「none」を選択し、その後自分の名前を選択すると大丈夫のときがある
■CocoaPods
Swiftで外部ライブラリを追加する(CocoaPods) - Qiita http://qiita.com/YuukiWatanabe/items/98e5f6cb19787b9e95ca Swift で外部ライブラリを追加する - みかづきメモ http://mikazuki.hatenablog.jp/entry/2016/02/28/030000 iOSライブラリ管理ツール「CocoaPods」の使用方法 - Qiita http://qiita.com/satoken0417/items/479bcdf91cff2634ffb1
■TIPS
■アプリのアイコンを設定する (初心者向け)Swift3.0で初アプリ - アイコンを登録してみる - Qiita https://qiita.com/egplnt/items/5987773844c35a735dea PNG形式で、120pxと180pxの2パターンが必要 ■アプリの起動画面を表示する 【Swift4】アプリ起動時のスプラッシュ(ローディング)画面作成方法|ぴっぴproject http://pippi-pro.com/swift-launchscreen 専用のストーリーボードが、はじめから用意されている iOSのスプラッシュ画面実装における注意点と実装方法 - Qiita https://qiita.com/k-boy/items/7de88a834bf01a6e858f 画像を登録するだけでも実装できる が、たくさんの画像を準備するのが面倒かも?柔軟性も低いかも? ■アプリ起動画面の表示時間を長くする 【xcode】【iOS】アプリ起動画面の表示時間 | 【xcode】【iOS】【iphoneアプリ開発】すぐ使えるiOSプログラミングTips http://funkit.blog.fc2.com/blog-entry-1.html Swiftでも「sleep(3)」のようにすれば大丈夫だった ■画像の縦横比を保って表示する 縦横比を保ったまま目一杯表示したいならAspectFit - 極上の人生 https://kawairi.jp/weblog/vita/201311229639 ■プロジェクト名を変更する Xcodeのプロジェクト名変更 - Xcode9.2 http://somen.site/2018/02/10/xcode%E3%81%AE%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E5... Xcodeでプロジェクト名を変更する方法 (Xcode8.0) | Libra Studio エンジニアブログ https://tech.librastudio.co.jp/index.php/2016/10/05/post-1038/ 不可能ではないようだが、かなり大変そう 原則として変更しない方が良さそうなので、適当な名前でプロジェクトを作らないようにする
■トラブル
■実機書き出し時、「maximum number of apps」のようなエラーが表示される 【swift】実機テストで「The maximum number of apps for free development profiles has been reached.」というエラーが発生 http://pg.kdtk.net/1369 ■実機書き出し時、キーチェーン「access」のパスワードを何度も求められる 5つほど同じダイアログが開いているみたい すべてのダイアログでMacのログインパスワードを入力し、すべて「常に認証」にすれば書き出せた(表記はうろ覚え) 書き出しのために裏側で5つのダイアログが開き、それぞれに対して認証が必要だった…のかも ■実機書き出し時、どうしても書き出せなくて原因不明なら ・端末側でアプリを信頼しているか、「設定 → 一般 → プロファイルとデバイス管理」を確認する ・Appleのアカウントが有効期限切れになっていないか確認する ・Appleの規約が更新された場合、改めて規約に同意する必要がある ・MacOSの再インストールからはじめると、すんなり書き出せることがある Appleの規約が更新された場合、Apple Developer Program にログインすると以下のようなメッセージが表示される The Apple Developer Program License Agreement has been updated. In order to access certain membership resources, you must accept the latest license agreement by November 3, 2018. [Review Agreement] リンクをクリックすると規約が表示されるので、内容を確認して同意する なおEnterpriseなど別アカウントを紐付けている場合は、そのアカウント所持者に連絡を取るようにメッセージが表示される The Apple Developer Enterprise Program License Agreement has been updated. In order to access certain membership resources, Refirio must accept the latest license agreement by November 3, 2018. [Contact Refirio] 該当アカウントでログインし、リンクをクリックすると規約が表示されるので、内容を確認して同意する
■その他メモ
iOSアプリ開発の全体像 - Qiita http://qiita.com/gomi_ningen/items/b8c9c5c11aee91be820e iOSライセンス&配布方法まとめ - Qiita https://qiita.com/isaac-otao/items/126bced83d9af86c7ce5 【完全保存版】「iOS 11」新機能・変更点の完全ガイド 押さえておきたい15のポイントを解説 | CoRRiENTE.top https://corriente.top/post-49396/ [Swift 3.0] Playground で URLSession を使う http://dev.classmethod.jp/smartphone/iphone/swift-3-playground-urlsession/ iPad mini2のSwift PlaygroundsでUIKitを使ったHello worldを書いてみた http://kako.com/blog/?p=20856 [iOS8] Swiftでデバッグ出力する方法 http://qiita.com/hiroo0529/items/b84d4e85b5104cb008e8 なんとかストライクとは http://xavier.hateblo.jp/entry/2014/09/22/100201 クエスチョンマークとビックリマーク http://swift-salaryman.com/optional.php 日本語ドキュメント - Apple Developer https://developer.apple.com/jp/documentation/ SBクリエイティブ:絶対に挫折しない iPhoneアプリ開発「超」入門 増補改訂第5版 【Swift 3 & iOS 10.1以降】 完全対応 http://www.sbcr.jp/products/4797389814.html?sku=4797389814 ↑アプリ公開手順のPDFをダウンロードできる ■PDF関連 iOSでPDFを表示してみる メモ http://nonchalanttan.hatenablog.com/entry/2016/11/11/200000 【初心者向け】Swift3で爆速コーディングその1(画面作成とSnippetsの使い方) http://qiita.com/teradonburi/items/d0ffb6367e34966d761b 【iOS開発】Swiftで簡易PDFビューワを作成(PDFを読み込み、表示) http://kerubito.net/technology/1615