Swift5.3
https://docs.swift.org/swift-book/LanguageGuide/Generics.html#ID553
CI
xcode-select
https://qiita.com/gooichi/items/017cf84ec52726ccd785
swift
:q
swiftc sample.swift
./sample
型を調べる
print(type(of: hgoe))
UI
Constraints
を追加したあとは
Resolve Auto Layout issues
(|△|)
Update Frames
を押すこと。
Proportionalの制約をするときは、対象となるオブジェクトと設定するもの2つを選ぶ。
Preview
バージョンが変わると結構変わってるので、注意。
4系では、基本的にcanvasを開いて、デバイスの変更や、言語の変更もできる。
これ最初に知っておけば、UIチェックがかなり早くなってたと思う。
基本シュミレータだけど、簡易チェックはPreviewで極力した方が良い気がする。
シュミレート
- シェイクするの動作をシュミレートすることができる。 Hardware -> Shake Gesture or Control + Command? " 現在位置を設定する Debug Location
- ランドスケープなどもどっかあった気がする
UI部品とコード
- アウトレット接続 コードからUI部品へ
- アクション接続 UI部品からコードへ
#available(iOS 11, macOS 10.13, *)
Event
イベント | 概要 |
---|---|
Did End On Exit | 編集終了後でフォーカスオフ時 |
Editing Changed | 編集時 |
Editing Did Begin | 編集開始時 |
Editing Did End | 編集終了時 |
Touch Cancel | タッチかキャンセル時 |
Touch Down | タッチダウン時 |
Touch Down Repeat | 複数回のタッチダウン |
Touch Drag Enter | ドラッグしてオブジェクト内に入ったとき |
Touch Drag Exit | ドラッグしてオブジェクトから離れた時 |
Touch Drag Inside | オブジェクトをタッチしてドラッグした時 |
Touch Drag outside | オブジェクトをタッチしてドラッグし、オブジェクトの外へ出た時 |
Touch Up Inside | コントロール内でのタッチアップ時 |
Touch Up Outside | コントロール外でのタッチアップ時 |
Value Changed | 値の変更時 |
NSUserDefaultsとかデータの管理が楽そう。
UIViewとSKViewの違い。 座標のYの扱い方が異なるので注意。UI上からした、SKしたから上
SKはゲームなどを開発するのに使用する。
Class
init, deinit
class内において、
class method: class func hoge()
instance method: func hoge()
class methodを型メソッドとswiftの本で書かれてる。
アクセス修飾子: internal, private, public
指定しない場合は、internalになる。
アクセス範囲
open > public > internal > fileprivate > private
publicを指定した場合は、モジュールの枠を超えてアクセスが可能になる。
通常は、internalを使用。
publicはoverrideできない。
親クラスにするにはopenを使用。
Subscript
クラスや構造体に使用できる。
使用した場合、配列や辞書のように要素にアクセスできる。
- Extension クラスに後付けでメソッドを追加できる。
- +演算子によるオーバーロード
func + (引数、引数) -> クラス名 {}
クラス名 + クラス名の扱いを指定できる。(==なども可能)
Optional
-nilに対する制約といった感じかな?-
参考URL
hoge!.hage!.var
オプショナルチェイニングと言うみたい。
甘かったので、リトライ。
var test:String!
Implicitly Unwrapped Optionals
という。
Optionalとは若干挙動が異なる。
Forced Unwrapping は操作で、Implicitly Unwrapped Optionals は型
Localize
File Inspectorで編集可能
* Interface Builder Storyboard
storyboardのレイアウトで異なるものを作る場合に使用。
日本語と英語の文字レイアウトなど。
* Localizable Strings
レイアウトは同じで表示言語が異なる場合に使用。
Protocol
Javaのinterfaceのような感じ。
class クラス名: [スーパークラス, ] プロトコル[, プロトコル名] {}
Threading
基本的には、main theadだけなので意図してGCD(Grand Central Dispatch)を使用しない限りはSingleThread。
参考URL
画像の描画、アニメーションの処理、NSRunLoop、Timers (NSTimer, CADisplayLink)が入ってくると、裏でThreadが作成される模様。
Apple Document
Apple Document Threading
ObjectMapperとCodable
Codableを使うべき。(デバッグしやすいため )
参考
AppDelegate
ライフサイクルを管理するクラス。
きれいに管理参考
配信
AdHoc, In-House, AppleStore
参考URL
- DeployGate: https://deploygate.com/
- EmLancher: https://github.com/KLab/emlauncher
開発支援
Flutter https://apps-gcp.com/introduction-of-flutter-about-header-and-footer/ 環境変数
$ xcodebuild -project [プロジェクトディレクトリ] -target [対象target] -showBuildSettings
$ xcodebuild -workspace [ワークスペースディレクトリ] -scheme [対象scheme] -showBuildSettings
xcodebuild -list
xcodebuild -project Operation.xcodeproj/ -target Operation -showBuildSettings
運用
- Icon
- 切替
- Build番号変更
[
参考URL
/usr/libexec/PlistBuddy
Cross Platform
現状有料でないと厳しいかと、、
- Unity
- Cocos2dx
- Angular, React Native系
- J2ObjC, Kotlin, Xamarin
- C++ https://medium.com/ubique-innovation/sharing-code-between-ios-and-android-using-c-d5f6e361aa98
シュミレータ問題(iOS)
- 入力をうけつけない
Simulator menu
Hardware -> Restart
で直った。
Release
- プロビジョニング
参考 - CFBundleVersion
https://t32k.me/mol/log/cfbundleversion/ - agvtool
参考
引数に関しては、"project name".xcodeproj/project.pbxproj
の変数を見ているっぽい。
optionによっては、info.plistの引数指定を静的に書き換えてしまうので、注意が必要。 - signing
証明書関連の参考 - APNs(Apple Push Notifications)
-
Endpoint
2019年11月04日 レガシーバイナリプロトコルでプッシュ通知を送信している場合、できるだけ早くHTTP/2ベースのAPNプロバイダAPIに更新することをお勧めします。 url
-
[Sending Notification Requests to APNs] (https://developer.apple.com/documentation/usernotifications/setting_up_a_remote_notification_server/sending_notification_requests_to_apns/)
自前でPush通知サービス
mBaaS
Xcode
tag && markdown https://cocoaengineering.com/2018/01/01/some-useful-url-schemes-in-xcode-9/
Logo
https://developer.apple.com/jp/swift/resources/
UserDefaults
iOS13から 4194304 byte 制限。
- https://grandbig.github.io/blog/2019/10/19/ios13-userdefaults/
- https://forums.developer.apple.com/thread/121527
メモ
あとでまとめる。
- ARC(Automatic Reference Counting)
deinitで確認する。
reference counter.
cf ponter. - weak
インスタンスが開放出ない場合など
Strong reference cycle.
循環参照など、、
weak referenceをつけた場合は、reference counterが増加しないため、1度の開放でリファレンスが解放される。 - unowned reference 参照化していたインスタンスが解放されても、変数にnilを代入する動作(ゼロ化)をおこなわない。
- オプショナルチェーン
who!.club!.teacher!.name
途中がnilでも例外が発生しない。 - replモード
llbdで:
orrepl
とうつ - 例
$ swiftc -g collatz.swift
$ llbd collatz
(llbd) run
(llbd) breakpoint set -n collatz
(llbd) breakpoint set -l 7
(llbd) breakpoint list
(llbd) breakpoint delete 1
delete or disable or enable
(llbd) p result // 10進数
(llbd) p/x result //16進数
next,setp, finish, continueとか
- 文書化コメント(documentation comment)
// TODO: メモ
// FIXME: メモ
// MARK: メモ
xcode 上のパスバーで表示が可能。
/// ro /* /
md形式
Binding
@Binding var isShow: Bool
init(isShow: Binding<Bool>) {
self._isShow = isShow
}
@StateをBindingに変換
@State var isShow: Bool
HogeClass(self.$isShow)
----
HogeClassは
init(_ isShow: Binding<Bool>)
ObservedObjectの場合
QObservedObject var user = User()
--- to Binding ---
TextField("名前", text: $user.name)
Lookup Examples
https://developer.apple.com/library/archive/documentation/AudioVideo/Conceptual/iTuneSearchAPI/LookupExamples.html
Alamofire
https://github.com/Alamofire/Alamofire/blob/master/Documentation/AdvancedUsage.md https://github.com/Alamofire/Alamofire/blob/master/Documentation/AdvancedUsage.md#network-reachability lock関連 https://mgrebenets.github.io/swift/2015/10/08/async-swift-scripting https://qiita.com/kazuhirox/items/9ecb25bc238ad2d47ff0
WkWebView
bug
- focus and error
Error
TODO
- RxSwift: 双方向バインディング
- Combine
iOS13以降
https://heckj.github.io/swiftui-notes/#aboutthisbook
https://qiita.com/you_matz/items/a3d640be2a8feaf698bd
https://www.raywenderlich.com/4161005-mvvm-with-combine-tutorial-for-ios
Push Notification(fcm)
gcm -> fcm
すごく楽になってる、、、
Firebaseにログイン
AppleのBundle ID
の命名規約のドキュメントが見つからず、最初に決定してから始めた方が良いと思う。
チーム開発の場合は、運用するgoogle account(firebase login)を決めた方が良さそう。
4KB以内。
Firebase コンソールからメッセージを送信する場合は例外となり、1,024 文字の制限
下記URLに送信の仕組みなど 共通フィールドを使用する場合URL message.notification.title message.notification.body message.data
fcm : 1 台のデバイスに送信できるメッセージは、1 分あたり最大 240 件、1 時間あたり最大 5,000 件です。
アップストリーム メッセージの制限
- APNs(Apple Push Notification Server)証明書(p12) .p12形式のファイルは自分の証明書で書き出すこと。
NotificationCenter
NotificationCenter基礎の基礎
【Swift】この時期だから見直すiOS10の新機能
リリース対策
注意
MFMailComposeViewController
を使用する場合、iPhoneのメールアカウントが一つもないとエラーで実行されない。
証明書
対応表
Android | iPhone |
---|---|
GridView | CollectionView |
Pem
// pass無で使用
openssl pkcs12 -clcerts -nodes -in APNs.p12 -out apns.pem
// pass有で使用
openssl pkcs12 -clcerts -nokeys -in APNs.p12 -out apns.pem
// 内容表示
openssl x509 -text -fingerprint -noout -in apns.pem
update link
App Store上のApp用のリンクが、apps.apple.com で始まるように変更されました。
itunes.apple.com で始まる既存のリンクは引き続き機能し、自動的に apps.apple.com ドメインにリダイレクトされます。
https://developer.apple.com/jp/news/?id=06142019a
How can I create easy-to-read short links to the App Store for my apps and company?
lookup link
ex). https://itunes.apple.com/lookup?bundleId=com.yelp.yelpiphone es). https://itunes.apple.com/lookup?id=(アプリID) Lookup Examples
上記両方いける、情報元のどれを信用して良いか分からないappsだとエラー。
TableView
- 参考: UITableViewCellの再利用を知る
- 参考: カスタムTableViewCellを作るときにはだいたいこうやってます-プロトタイプで作るか、xibで作るか
- TODO: 【swift】 UITableViewで長押ししたセルのindexPath.rowを取得する方法
- prepareForReuse
- awakeFromNib
String Format
Push
参考 https://qiita.com/mshrwtnb/items/3135e931eedc97479bb5
iOS13 PKPushCredentials broken
Codable
参考: https://medium.com/@bj1024/swift4-codable-json-encode-17eaa95372d1
decoder.dateDecodingStrategy = .iso8601
Debug
起動時
https://blog.cybozu.io/entry/2018/04/24/080000
Document
sudo gem install jazzy
ipa
- https://www.bravesoft.co.jp/blog/archives/427
- メモ
iPhone, iPad
https://www.micss.biz/blog/
https://developers.wonderpla.net/entry/2016/09/09/170429
MaterialDesign
https://note.com/k_k1/n/n2c172599d57c
[注釈1] MDCTextFieldについて
高さを82以上にしないと正常に動作しないデザインになっているようです。
参考:[TextFields] MDCTextField does not permit user input
https://github.com/material-components/material-components-ios/issues/4341 (2019-11-13)
[注釈2] MDCTextInputControllerについて
このコントローラによってMDCTextFieldにアニメーションやその他機能が追加される仕組みになっているようです。
これがなければ、MDCTextFieldをクリックした際のアニメーションが動作しません。(そもそも設定されていない状態になっている)
RxSwift
MVVM
というか、Androidと作りを合わせようとして、、、こうなった。
参考になりそうなサイト
Widgets
iOS14と https://qiita.com/shiz/items/309349d9cdb75084e74e
PythonKit
https://github.com/pvieito/PythonKit
「file→Swift Packages→Add Package Dependency」 PythonKitのGitHubリポジトリからPackage Dependency URL python3系のライブラリを読み込めなくてハマった、、
1) Disable App Sandbox in Signing and Capabilities:
In top right corner of App Sandbox, under Signing & Capabilities there is an "X", click that to remove App Sandbox
2) In "Hardened Runtime" under Signing and Capabilities: check "Disable Library Validation"
をやったらうまく行った、、、まじか、、
2) を残してた、、 orz...
コマンドラインからのコンパイル実行など
https://qiita.com/demmy/items/c4a6a430787d3097a6df
権限
https://developer.apple.com/documentation/xcode/adding_capabilities_to_your_app?language=objc sandboxとか、libraryとか注意
関連
https://github.com/apple/swift-nio
UnitTest
testable importでエラーの場合は設定を参照する。
自分の場合はdevelopはtestableにしてるが、releaseはtestableにしてないので、エラーになり自滅する。
@main to @UIApplicationMain
SwiftUI
print(ObjectIdentifier(viewModel))
Template
@available
Notice Deprecated.
@available(*, deprecated, message: "Parse your data by hand instead")
How to detect your iOS app is running on macOS Catalyst
#if targetEnvironment(macCatalyst)
About Catalyst
The Mac Catalyst version is usually the same as the iOS version. The corresponding minimum macOS version can be found in the same documentation page as follows:
Essential
- import Foundation
String, Dateなど基本的な型を扱う
#if targetEnvironment(macCatalyst)
#else
#endif
if #available(iOS 14.0, macOS 11.0, macCatalyst 14.0, tvOS 14.0, watchOS 7.0, *) {
}
PushNotificationまとめ
iOS13
state/display | banner and open | banner and not open | silent push |
---|---|---|---|
foreground | willPresent and didReceive | willPresent | ?didReceiveRemoteNotification |
background | didReceive | - | ?didReceiveRemoteNotification |
not exist process | didReceive | - | ?? |
- Registering Your App with APNs
- Setting Up a Remote Notification Server
- Sending Push Notifications Using Command-Line Tools
curl -v --header "apns-topic: $TOPIC" --header "apns-push-type: alert" --header "authorization: bearer $AUTHENTICATION_TOKEN" --data '{"aps":{"alert":"test"}}' --http2 https://${APNS_HOST_NAME}/3/device/${DEVICE_TOKEN}
Snipet
DispatchQueue.global().async {
// UI以外の処理...
DispatchQueue.main.async {
// UIの更新(それ以外は書かない)
}
}
// global(qos: .userInitiated)
// userInteractive > userInitiated > utility > background
@参考: https://scior.hatenablog.com/entry/2018/12/29/100000
呼び方
Trailing Closures 数の引数の末尾(最後)がクロージャーの場合、処理部分を外に配置できる記述方法です。
"@ViewBuilder"はカスタム属性定義で、後ろの引数labelの戻り値を複数設定する事が可能である事を示します。(最大10個まで)
CocoaPods
pod cache clean --all
pod setup
rm -rf ~/.cocoapods
rm -rf ~/Library/Caches/CocoaPods/ ; rm -rf Pods ; pod install
gem cleanup
gem install cocoapods
gem uninstall cocoapods
pod repo list
2重スクロールとタップイベント
userInteractionEnabled
- CollectionView(StoryBoard)
If you are using swift 5 or xcode 11 and later you need to set Estimate Size to none
ハマる