■目次
アカウントXcode環境の作成.gitignore製品用、開発用などの切り分けSwiftSwift+PlaygroundSwift+PushObjective-CAmazon SNS公開Enterpriseで社内向けに配布TestFlightIn-Houseで書き出す更新CocoaPods作業アカウントの追加TIPSトラブルその他メモ
■アカウント
■Apple ID https://appleid.apple.com/ AppStoreでアプリをダウンロードしたり、iCloudを利用したりするためのアカウント Apple製品を使っているなら、すでに持っているはず ■Apple Developer Program https://developer.apple.com/jp/programs/ 証明書やプッシュなど、アプリの設定を管理するためのもの すべての機能を使用するためには、年会費を払う必要がある 【Xcode】無料の実機ビルドでどこまでできるのか - Qiita https://qiita.com/koogawa/items/15b231e2728ff64e08f3 ■iTunes Connect https://itunesconnect.apple.com/ アプリを公開するためのもの アプリを公開するためには、Apple Developer Programで年会費を払う必要がある
■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」のエラーになる。ダイアログに詳細が書かれているが、実機側で許可が必要 実機の「設定 > 一般 > デバイス管理」から、使用しているアカウントを選択して承認する これで実機で実行できた ※昔は実機実行のために開発者登録(要年会費)が必要だったり、 実機実行を許可するデバイスをあらかじめ登録したり …が必要だったが、今は不要
■.gitignore
無くても問題ないようだが、以下のように設定されているプロジェクトがあった。要確認
UserInterfaceState.xcuserstate Breakpoints_v2.xcbkptlist
以下を参考に作成すると良さそう XcodeでiOSアプリ開発をする時の.gitignore - Qiita https://qiita.com/ikuwow/items/4fae81a099bf82f44749
■製品用、開発用などの切り分け
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: REFIRIO CO.,LTD. (Enterprise) Organization Name: Refirio Organization Identifier: net.refirio Language: Swift 「Next」 ↓ プロジェクトの作成場所を選択 「Create」 Bundle Identifier はプロジェクトのGeneralを確認すると「net.refirio.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_Debug | 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 「Run」の「Build Configration」を「Production_Debug」に設定する 「Profile」と「Archive」の「Build Configration」を「Production_Release」に設定する buildtest1_develop 「Run」の「Build Configration」を「Develop_Debug」に設定する 「Profile」と「Archive」の「Build Configration」を「Develop_Release」に設定する ※「Run」の「Debug executable」にあるチェックを外すと、Distribution証明書でも直接実機にインストールできるみたい? でもチェックを外すことにより、デバッグ情報が表示されなくなるみたい? 他の設定も関連するかもしれないので要調査 ■BundleIDの設定(1つの端末に、本番アプリや開発アプリを同時にインストールできるようにする) 「PROJECT」の下にある「TARGETS」からアプリを選択 「Build Settings」内のページ中程「Packaging」内にある「Product Bundle Identifier」にカーソルを合わせると表示される、三角をクリックする つまり TARGETS → buildtest1 → Build Settings → Product Bundle Identifier を選択 BundleIDが一覧表示され、初期状態では以下のようになっている Develop_Debug | net.refirio.buildtest1 Develop_Release | net.refirio.buildtest1 Production_Debug | net.refirio.buildtest1 Production_Release | net.refirio.buildtest1 今回は以下のように設定する(右側の値をクリックすると、編集状態になる) Develop_Debug と Production_Debug は「net.refirio.buildtest1.dev.debug」「net.refirio.buildtest1.debug」にするのもアリか。検証したい Develop_Debug | net.refirio.buildtest1.dev Develop_Release | net.refirio.buildtest1.dev Production_Debug | net.refirio.buildtest1 Production_Release | net.refirio.buildtest1 ※「General → Identity → Bundle Identifier」でも設定できる。ただしその場所で設定すると、 上で設定した Bundle Identifier がすべて上書きされてしまうので注意(上書きされたものを戻したければ、再度手動で設定が必要) ■アプリケーション名の設定(インストール後に本番アプリか開発アプリかを判断できるようにする) TARGETS → buildtest1 → info → Custom iOS Target Properties Bundle name が「$(PRODUCT_NAME)」になっていることを確認する TARGETS → buildtest1 → Build Settings → Product Name Develop_Debug | buildtest1 Develop_Release | buildtest1 Production_Debug | buildtest1 Production_Release | buildtest1 今回は以下のように設定する(編集時、「buildtest1」は「$(TARGET_NAME)」と表示されるが、気にせず後ろに文字列を追加する) デバッグ版は後ろに「Debug」を付けるのもアリか。検証したい Develop_Debug | buildtest1 Dev Develop_Release | buildtest1 Dev Production_Debug | buildtest1 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」にすると、ページの下の方に表示される。見つからなければ、ページ上部の検索ボックスで「Swift」を検索してみる Develop_Debug | (空欄) Develop_Release | (空欄) Production_Debug | (空欄) Production_Release | (空欄) 今回は以下のように設定する Develop_Debug | -D DEVELOP_DEBUG Develop_Release | -D DEVELOP_RELEASE Production_Debug | -D PRODUCTION_DEBUG Production_Release | (空欄) Swiftプログラム内では、以下のようにすると処理の分岐ができる
print("TEST START") #if DEVELOP_DEBUG print("DEVELOP_DEBUG") #elseif DEVELOP_RELEASE print("DEVELOP_RELEASE") #elseif PRODUCTION_DEBUG print("PRODUCTION_DEBUG") #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
■画面の向き 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/
■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
■Objective-C
Xcode | くずのは探偵事務所 http://www.kyoji-kuzunoha.com/category/xcode 2018/02/18、Xcode9.2で1〜6まで試してみたが、若干表記が違う程度ですんなり動いた
■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
■公開
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/
■TestFlight
招待されたときのスクリーンショットとメモ C:\Users\Yamano\Dropbox\iOS\TestFlight TestFlightの使い方!iOSアプリをテスト配信、導入方法まで! | イリテク https://iritec.jp/web_service/11438/ TestFlightの使い方(テスター向け) - Qiita https://qiita.com/itokjp/items/e76f404647c2849aba3c 新TestFlightの使用方法 - Qiita https://qiita.com/Raugh/items/9e803fbb03391cf1b388 ■テスターの追加 App Store Connect で 「マイ App → (アプリ名) → TestFlight → 公開ベータテスト → + → 新規テスターを追加」 からユーザを追加 ■パブリックリンク パブリックリンクを使用すれば、URLを知らせるだけでTestFlightに参加してもらうことができる 以下は iTunes Connect に表示される、TestFlightパブリックリンクの説明
TestFlight の新機能 パブリックリンクを使用してTestFlightのテスターを招待 リンクを公開するだけで、Appのベータテストに不特定多数の人を招待できるようになりました。 任意の場所に公開できるこの招待リンクをクリックすると、TestFlight App内の招待ページが表示されます。 メールアドレスのリストを管理する必要はなく、テスターは匿名で参加することもできます。
■In-Houseで書き出す
組織内配布(In-House)やAdHoc(評価用配布)のために書き出す方法 実際に書き出したときのメモ C:\Users\Yamano\Dropbox\iOS\In-House用に書き出すメモ.txt
■更新
■証明書更新 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 ■CocoaPodsを導入済みの既存プロジェクトをビルドしたときのメモ SourceTreeでPULL エミュレータで実行しようとすると「No such module'SwiftGitOrigin'」と言われる Swiftでgifアニメを再生できるアプリを作る(SwiftGifOriginの使い方) - JoyPlotドキュメント https://joyplot.com/documents/2016/09/15/swift-gif-image/ CocoaPods.org https://cocoapods.org/ ターミナルでプロジェクトの場所へ移動 $ cd /path/to/terasapo $ sudo gem install cocoapods $ pod init Xcodeで「Product → Clean Build Folder」としてから「Product → Build」としてみる …が、それでも実行すると 「No such module'SwiftGitOrigin'」 と言われる Xcodeで開くプロジェクトを「terasapo.xcodeproj」ではなく「terasapo.xcworkspace」にするとビルドできた 開くべきプロジェクトが変わるようなので注意
■作業アカウントの追加
apple@example.com というメールアドレスがあり、Apple Developer Program や iTunes Connect には登録済みとする 必要に応じてDUNSナンバーの手続きなども完了しているものとする test-app@example.com というメールアドレスを作成したものとする メールアドレスのみで、AppleやGoogleのアカウントは無い状態 ■Apple Developer Program https://developer.apple.com/jp/programs/ に、既存アカウントの apple@example.com でログイン 左メニューの「People」をクリックし、「Invite People」から招待できる 「Invite as Members」に招待したいメールアドレスを入力して「Invite」ボタンを押す 「The email addresses indicated above are not valid.」と表示されたが、Apple Developer からログアウトして再度ログインすると招待できた すぐに test-app@example.com に、「You have been invited to join an Apple Developer Program.」というメールが届いた https://developer.apple.com/account/?inviteId=A7QP6UW45Y のようなURLが記載されている。クリックすると「Apple Developer へサインイン」という画面になった Apple ID は必要みたいなので、「Apple IDをお持ちでないですか? 作成はこちら」から新規作成画面へ メールアドレス: test-app@example.com パスワード: Rg9Qb_QNam3B 質問1: 十代の頃の親友の名前は? → 山田一郎 質問2: 子供の頃のニックネームは? → 山田二郎 質問3: 初めての職場での上司の名前は? → 山田三郎 アカウントの作成が完了するとログイン済になった (なお、この時点ではこのアカウントでiTunes Connectにはログインできない。ログインしようとすると「Apple IDがiTunes Connect用に設定されていません。」と言われる) 同時に以下のダイアログが表示されたので「Accept」をクリック - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Join Team You have been invited to join a development team in the Apple Developer Program. You are accepting this invitation with the Apple ID test-app@example.com. To accept with a different Apple ID, cancel, sign out, and click the link in your invitation email. Cancel Accept - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - これで Apple Developer Program でアプリIDの一覧などにアクセスできるようになった ただしMembersだと、プロビジョニングプロファイルの作成やApp IDの作成などができない。プッシュ証明書の作成もできなかった Adminsに変更すると、それぞれ作業ができるようになった(即座に反映された / が、アプリの新規作成など一部の機能は、ログアウトしてからログインし直さないと反映されないかも) ひととおりアプリの作成を行うなら、Adminsの権限が必要そう iTunesConnect及びAppleDeveloperのメンバーを追加してみた - Qiita https://qiita.com/toshihirock/items/dc78fc5e254c1886ad0d プログラムにおける役割とApp Store Connectにおける役割 - サポート - Apple Developer https://developer.apple.com/jp/support/roles/ Apple DeveloperとiTunes Connectに追加するユーザーとその権限|Wano Group Developers Blog https://developers.wano.co.jp/1251/ ■iTunes Connect ※Apple Developer Program とは別に招待が必要 https://itunesconnect.apple.com/ に、既存アカウントの apple@example.com でログイン メニューの「ユーザとアクセス」を選択 画面内の「+」をクリックするとユーザの登録画面になる 姓 名: アップル テスト メールアドレス: test-app@example.com (Apple ID と同じアドレス) 役割: Developer (場合によっては App Manager の方が適切かも) すぐに test-app@example.com に、「You've been invited to App Store Connect.」というメールが届いた (ただしロリポップメーラーで確認すると内容が白紙なので、Thunderbirdなどで確認。サーバ上にメールを残すためIMAPで受信) アクティベートのリンクをクリックすると、以下の画面が表示される - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - サインインして招待を承諾してください REFIRIO CO.,LTD.が、あなたをApple Developer Programのチームへの参加に招待しました。 メンバーとして、Appleプラットフォーム向けのAppの作成や配信をするために、 ベータ版ソフトウェアやApp Store Connectなどのリソースにアクセスできるようになります。 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 承諾時に「リクエストを処理できません。」のエラー画面に遷移したが、登録は正常にできた(別件で試した場合も同じようになった) ただしDeveloperだと、アプリの新規追加作成などができない App Managerに変更すると、それぞれ作業ができるようになった(即座に反映された / が、反映されない機能があればログアウトしてからログインを試す) ひととおりアプリの作成を行うなら、App Managerの権限が必要そう もしくはDeveloper権限を与えてもらい、管理者にアプリを新規に作成してもらい、そこに対して権限を与えてもらうか 1から始めるiOSチーム開発:iTunes Connectにメンバーを追加する - Qiita https://qiita.com/kurumaya/items/95dc2a6fc3c080f73706
■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/ 不可能ではないようだが、かなり大変そう 原則として変更しない方が良さそうなので、適当な名前でプロジェクトを作らないようにする
■トラブル
■実機書き出し時、「An error was encountered while attempting to communicate with this device.」のようなエラーが表示される 【Xcode9】An error was encountered while attempting to communicate with this device.のエラーが出た場合の対処方法【iOS11】 | ニートに憧れるプログラム日記 http://program-life.com/227 ■実機書き出し時、「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をダウンロードできる ■配列 Swiftで多次元配列を使う場合 - Qiita https://qiita.com/art_526/items/9282b63f51d85f58c3e5 [Swift]空の配列を用意してタプルを追加する https://code-schools.com/swift-array-append-tuple/ Xcode - Swift4でタプル配列をUserDefaultに保存して取り出したいです。|teratail https://teratail.com/questions/135321 Swift - 多次元の辞書型配列をUserDefaultsで保存する方法|teratail https://teratail.com/questions/127808 ■日時 Swiftで日付の形式を変換する - Qiita https://qiita.com/kwst/items/949402c635d1e2113f95 ■Alert [Swift3.0] テキストフィールド付きUIAlertControllerを表示する - JoyPlotドキュメント https://joyplot.com/documents/2016/09/04/swift_textfield_uialertcontroller/ ■TableView tableViewのロード方法色々 - Qiita https://qiita.com/tatetate55/items/858fc644b9b8d878cfd1 Swift3でテーブルのセルを横にずらせる(スワイプできる)ようにする - Qiita https://qiita.com/suzuki_y/items/f04f4e9578060d0e6306 Xcode - UITableViewで画面遷移後のセルの選択状態解除|teratail https://teratail.com/questions/57949 ■WebView WebkitViewを使ってWebページを表示する | Sasakura.Company https://sasakura-company.com/2018/08/15/webkitview%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6web%E3%83%9A%E... ■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 ■その他 iOS 12以降のAPIで "NSKeyedArchiver" と "NSKeyedUnarchiver" を使う - 文字っぽいの。 https://fromatom.hatenablog.com/entry/2019/02/01/174830 swiftでexpected declarationとエラーが出る - Qiita https://qiita.com/hyoutann/items/76513fc40ab5881f84a1 XcodeでMGIsDeviceOneOfType is not supported on this platform. - Programmer's Note http://hifistar.hatenablog.com/entry/2018/12/01/155046