■目次
iOSアプリ開発Objective-CSwiftSwift+PlaygroundSwift+PushAmazon SNS公開Enterpriseで社内向けに配布更新CocoaPodsTIPSトラブルその他メモ
■iOSアプリ開発
■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に移行するらしいが、現時点では対応できないiOSもあり時期尚早? ストーリーボードに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に移行するらしいが、現時点では対応できないiOSもあり時期尚早? ストーリーボードに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) }
WKWebViewと向き合ってみた - Qiita https://qiita.com/UJIPOID/items/fd4b33cac48ad37733f5 「iOS11未満もサポートする場合はコードでWKWebViewを実装する必要がある」 ■WebViewのキャッシュをクリア WebViewのキャッシュは強力で、アプリを再起動しても古い情報を読み続けることが多い プログラムで対応することもできるようだが、なかなか厄介そう 原則としてページをPHPで作成し、CSSファイルなどは「?20180816」のような文字列を付けて読み込む…とするのが安全そう UIWebViewを使うときに気をつけていること - Qiita https://qiita.com/urouro_n/items/d4e5fb66f2039090000f ■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
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 ■旧サンプル http://refirio.org/twitter/?word=push
■Amazon SNS
[基本操作]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で社内向けに配布
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の再インストールからはじめると、すんなり書き出せることがある
■その他メモ
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