Swift

update create

swift url

github

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, *)

Document

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

運用

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

iOS for fcm

Xcode

tag && markdown https://cocoaengineering.com/2018/01/01/some-useful-url-schemes-in-xcode-9/

sandbox

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で:or repl とうつ
$ 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

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 件です。

アップストリーム メッセージの制限

  1. 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

pkcs12 options

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

String Format

String Format Specifiers

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

jazzy

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")

available

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

#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 - ??
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

Troubleshooting

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

ハマる