カテゴリー別アーカイブ: Xcode

【Swift5】localeの泥沼【ロケール】

時計や日付関係をイジっててLocaleがよくわからんかった。

言語設定?地域設定(書式設定?)?そのへんがごちゃごちゃです。
それぞれお互いに影響しているようで、地域設定が同じでも言語設定が変わると表記順が変わったり、
言語設定が同じでも地域設定で表記が変わったりします。
よーわからん。

とりあえず参考サイト
iOS11で変わったロケール – Toyship.org
iOS9から変わったNSLocale.preferredLanguagesの対応を考える – Qiita

重要だと思ったのは、本体の言語設定と地域設定以外に、「アプリ側の多言語対応」(Localized)も関係しているようです。
ややこしい。

以下のコードでいろいろ呼び出せるようです。
新規プロジェクトで試してみました。

デバッグエリアでは

といった感じです。
本体の言語設定だけ取り出すんはどしたらええんや、
あと、間に入るのはハイフンなのかアンダースコアなのか。。。

おまけ。
いろいろといじってるとコンナン出てきた。

これを動かすとデバッグエリアでは

こんな感じです。
1つ目はよく使われる組み合わせかな?
次の2つは言語設定と地域設定それぞれだろうね。
下の2つ通貨コードっぽいですね。
何かの参考になれば。

もひとつオマケの参考サイト
ロケールのリージョンコード | Second Flush

【Swift5】UIPickerViewで2列のピッカーを作る。

UIPickerViewで2列のを作りたかったのですがやり方が分からず少し悩みました。

UIPickerViewの参考サイト
【swift】UIPickerViewを作ってみる(ドラムロール)|株式会社イーガオ
[iPhone] UIPickerView の基本的な設定

特に指定せずとも、一列目がcomponentが0で、二列目が1で良いようです。

簡単にラベル2つとUIPickerViewを配置します。
【Swift5】UIPickerViewで2列のピッカーを作る。

Classに UIPickerViewDelegate, UIPickerViewDataSource を追加して、
それぞれ
pickerView.delegate = self
pickerView.dataSource = self
でつなぎます。
あとは列数は2,行数と、タイトルと、選択時の動作はswitchのcomponentで分岐します。
以下コード。

switch文のdefaultは適当です。
動かすと味気ない画面ですがちゃんと動きます。
【Swift5】UIPickerViewで2列のピッカーを作る。

二列ではなく、画面に複数のUIPickerViewを使いたいときはtagを使うと良いようです。

【Swift4】レビューのリクエストをする。

アプリを使っていると時々突然にアプリの評価を求められることがある。
あれって結構便利ですね。

apple純正で簡単に追加できるので利用してみた。

参考サイト。
SKStoreReviewController まとめ – Qiita

基本的な使い方は、適当なタイミングで

これだけで良いらしい。

ただ、
・年に3回までしか表示されない。
・3回に満たないときは呼ばれたらほぼ必ず表示される。
らしい。

なので適当なタイミングで呼ばれるように考えてみた。

100回呼ばれるごとにSKStoreReviewControllerを呼び出す。
但し、最初はしばらく使った30回目くらいでレビューをリクエストしたいので初期値を70にする。
これをviewDidLoadあたりに入れておけば、一日一回起動するなら年に3回程度になるかなという計算。

まあべんりだ。

【Swift4】【AdMob】【Stack View】広告を消したり表示したりする。

Stack Viewを使うと広告が表示されないときの処理が便利だった。
Stack Viewについては以前に書いたページを参照。
【Swift4】縦長のスクロール画面をscrollViewとstackViewを使って作る。
【Swift4】UITableViewの基本のき。

スクロールビューにスタックビューを入れていたり、高さの制限をかけていないビュー(テーブルビュー等)と一緒にスタックビューを使っていると、バナービューをisHiddenにすると綺麗にトルツメされるのですごく便利。

バナービューの状態の取得などについては下記サイトを参照。
バナー広告  |  iOS  |  Google Developers

GADBannerViewDelegateと、
bannerView.delegate = selfを、
設定しておけば広告リクエストの状態が受け取れます。
それを利用してバナービューの表示非表示を決めます。

先に、Storyboardでバナービューのishiddenにチェックを入れておくと広告を受け取った時点でバナービューが表示されます。

以下サンプルコード。

【Swift4】【Firebase】【AdMob】と【Analytics】(4) AdMobを設定。

前々々回
【Swift4】と【cocoaPods】で【Firebase】の【adMob】と【Analytics】をインストール | iPhoneアプリ備忘録
前々回
【Swift4】【Firebase】のプロジェクトを作成。【adMob】と【Analytics】の準備。 | iPhoneアプリ備忘録
前回
【Swift4】【AdMob】で新しいアプリIDとユニットIDを取得する。 | iPhoneアプリ備忘録
からの続きでAdMobを設置します。

今回はバナーを作成。
テスト用のアプリIDとユニットIDを使用します。

参考サイト
バナー広告  |  iOS  |  Google Developers

StoryboardでViewを配置して
①サイズを幅320高さ50に設定。
【Swift4】【Firebase】【AdMob】と【Analytics】(4) AdMobを設定。
【Swift4】【Firebase】【AdMob】と【Analytics】(4) AdMobを設定。

②Aspect Ratioにちぇっく。
③④下と左右に0ポイントでConstraint
【Swift4】【Firebase】【AdMob】と【Analytics】(4) AdMobを設定。

これで、320:50の比率でのバナーで画面の真下につくサイズのビューができる。
【Swift4】【Firebase】【AdMob】と【Analytics】(4) AdMobを設定。

このビューを選択し、identify Inspector で、Custom ClassのGADBannerViewを選択する。
【Swift4】【Firebase】【AdMob】と【Analytics】(4) AdMobを設定。

これをViewControllerに接続すると、

とゆーかたちでアウトレット接続ができる。

あとはFirebaseをインポートして、
ユニットIDを設定して、
rootViewControllerに接続して、
広告をロード(リクエスト)したら、
広告が表示される。

コードはこんな感じ。

アプリを起動するとこんな感じ。
【Swift4】【Firebase】【AdMob】と【Analytics】(4) AdMobを設定。

delegateの設定やらさらに便利な使い方もあるけど、基本はここまで。
うじゃうじゃ。

【Swift4】【Firebase】【AdMob】と【Analytics】(3) AdMob用に新しいアプリIDとユニットIDを取得する。

前々回
【Swift4】と【cocoaPods】で【Firebase】の【adMob】と【Analytics】をインストール | iPhoneアプリ備忘録
前回
【Swift4】【Firebase】のプロジェクトを作成。【adMob】と【Analytics】の準備。 | iPhoneアプリ備忘録
からの続きでAdMobのアプリIDとユニットIDを取得します。

AdMobはアプリごと、広告枠ごとにIDをつくって使用します。
そのやり方。

まずAdMobのアプリのページに行く。
Google AdMob

アプリを追加を選択。
【Swift4】【Firebase】【AdMob】と【Analytics】(3) AdMob用に新しいアプリIDとユニットIDを取得する。

公開済みかを選択。
まだならまだで大丈夫。
【Swift4】【Firebase】【AdMob】と【Analytics】(3) AdMob用に新しいアプリIDとユニットIDを取得する。

アプリ名とプラットフォームを選択。
 【Swift4】【Firebase】【AdMob】と【Analytics】(3) AdMob用に新しいアプリIDとユニットIDを取得する。

アプリがAdMobに追加されました。
【Swift4】【Firebase】【AdMob】と【Analytics】(3) AdMob用に新しいアプリIDとユニットIDを取得する。

次の広告ユニットを作成に進みます。
まずは広告フォーマットを選びます。とりあえずバナーで。
【Swift4】【Firebase】【AdMob】と【Analytics】(3) AdMob用に新しいアプリIDとユニットIDを取得する。

広告ユニットを設定します。
ユニット名はアプリ名も含めたほうがわかりやすいかも。
詳細設定も気になるようならいじります。
【Swift4】【Firebase】【AdMob】と【Analytics】(3) AdMob用に新しいアプリIDとユニットIDを取得する。

これでアプリIDとユニットIDが完成です。
【Swift4】【Firebase】【AdMob】と【Analytics】(3) AdMob用に新しいアプリIDとユニットIDを取得する。

スタートガイド  |  iOS  |  Google Developersを参考に設定しましょう。

【Swift4】【Firebase】【AdMob】と【Analytics】(2) 準備。プロジェクトを作成。

iPhoneアプリにFirebaseのAnalyticsとadmobを入れるために、firebase上でiPhoneアプリのプロジェクトを作成する。

前提としてFirebaseにログインできていること。
まずはFirebaseのコンソールでプロジェクトを追加します。
プロジェクトとアプリが連携できると自動でアナリティクスが開始されるようです。
Firebase console

↑Firebaseコンソールでプロジェクトを追加を選択。
【Swift4】【Firebase】【AdMob】と【Analytics】(2) 準備。プロジェクトを作成。

iosを選択
【Swift4】【Firebase】【AdMob】と【Analytics】(2) 準備。プロジェクトを作成。

アプリのバンドルIDを入力
【Swift4】【Firebase】【AdMob】と【Analytics】(2) 準備。プロジェクトを作成。

GoogleService-Info.plistが作成されるのでダウンロードしてXcodeプロジェクトに追加。
【Swift4】【Firebase】【AdMob】と【Analytics】(2) 準備。プロジェクトを作成。
copy item if neededを選びましょう。
【Swift4】【Firebase】【AdMob】と【Analytics】(2) 準備。プロジェクトを作成。

cocoapodを使ってfirebase SDKを導入する。
この辺は前回やったやつ。
【Swift4】【Firebase】【AdMob】と【Analytics】(2) 準備。プロジェクトを作成。

AppDelegateにコードを追加して接続。
【Swift4】【Firebase】【AdMob】と【Analytics】(2) 準備。プロジェクトを作成。

アプリを起動して接続が確認されると、
【Swift4】【Firebase】【AdMob】と【Analytics】(2) 準備。プロジェクトを作成。
ここが、
【Swift4】【Firebase】【AdMob】と【Analytics】(2) 準備。プロジェクトを作成。
こうなる。

これでFirebaseとの接続が完了してAnalyticsが確認できるようになる。

【Swift4】【Firebase】【AdMob】と【Analytics】(1) SDKを【cocoaPods】でインストール

【cocoapods】たまにしか使わないのですぐにわからなくなる。/(^o^)\ | iPhoneアプリ備忘録
前回↑から引き続きFirebaseのadMobを入れていきます。

参考サイト
iOS 用 Firebase 向け Google アナリティクスを使ってみる  |  Firebase
スタートガイド  |  Firebase

ってゆーかよく見直したらSwift3で似たような記事書いてる。/(^o^)\
【Swift3】と【cocoaPods】と【Firebase】と【adMob】 | iPhoneアプリ備忘録

ただこのあとにpodfileの書き方が変わってる。
【CocoaPods】Podfileの書き方が変わっていた。 | iPhoneアプリ備忘録

それらを参考にPodFileを書き換えます。

pod ‘Firebase/Core’
pod ‘Firebase/AdMob’
上記を追加しています。

で、保存したあとターミナルからインストールします。
Podfileのあるディレクトリを間違えないようにね。
で、

結果↓

とゆーことでFirebaseとAdMobが入りました。

xcodeでプロジェクトを開くときは、.xcodeprojファイルではなく、
新しく作られた.xcworkspaceファイルを開くことを間違えないようにしましょう。

【Swift4】UNUserNotificationCenterで通知が出ない。.quarterが邪魔だった。

以前の投稿で5秒後に通知を出すというところまでやった。
【Swift4】【Objective-C】UNUserNotificationCenterで通知の許可をもらう。 | iPhoneアプリ備忘録

しかし、現在時刻を取得して5秒後の時刻に鳴るようにしても通知が来ない。
なのでいろいろ試してみた。

まずは前回の復習から。
AppDelegateでゴニョゴニョしてViewControllerで前回も書いた5秒後に通知のコードを書いて、
未通知を呼び出すコードを書いてみる。

これを走らせるとデバッグエリアに通知の設定が表示されて5秒後に通知が出る。

今度はトリガーをインターバルのUNTimeIntervalNotificationTriggerから
カレンダーのUNCalendarNotificationTriggerで、現在時刻をDate()で取得し5秒後を指定してみる。
コードはこんな感じ。

これを走らせると、下記の通り。

dateComponentsの内容だけで、ノーティフィケーションは表示されず通知も出なかった。
特にXcodeでエラーも出てないのにノーティフィケーションに登録されなかったようだ。

let date = Date() から取ってくるのではなく、
dateComponentsを指定すると通るので、dateComponentsの何かが悪さしているっぽいのでいろいろとnilを入れて試してみた。

var dateComponents = DateComponents()
dateComponents = Calendar.current.dateComponents(in: TimeZone.current, from:Date() + 5)
// dateComponents.calendar = nil
// dateComponents.timeZone = nil
// dateComponents.era = nil
// dateComponents.year = nil
// dateComponents.weekday = nil
// dateComponents.yearForWeekOfYear = nil
// dateComponents.weekOfYear = nil
// dateComponents.weekOfMonth = nil
// dateComponents.weekdayOrdinal = nil
dateComponents.quarter = nil
print(“でーとこんぽーねんつ”,dateComponents)

結果、dateComponents.quarter が入ってると駄目なようだ。
これで一日費やした。/(^o^)\

オマケ。
アラームに使うために.quarterと秒数を取った日付の取り方。

参考サイト
DateComponentsの各要素について調べてみた – Swiftをはじめよう!

【Swift4】UITableViewで常時並べ替え可能にする。

参考サイト
UITableViewで常にCellの並び替え(ソート)ができるようにする – Qiita
UITableViewのデリゲートメソッドまとめ – Qiita

viewDidLoadに下記を追加して常時編集状態にする。
tableView.isEditing = true
tableView.allowsSelectionDuringEditing = true

並べ替え可能にするメソッド。
func tableView(_ tableView: UITableView, canMoveRowAt indexPath: IndexPath) -> Bool {
return true
}

並べ替え結果を処理するメソッド。
func tableView(_ tableView: UITableView, moveRowAt sourceIndexPath: IndexPath, to destinationIndexPath: IndexPath) {
// TODO: 入れ替え時の処理を実装する(データ制御など)
}

編集状態の見た目を編集する。
//左側の+やーを表示
func tableView(_ tableView: UITableView, editingStyleForRowAt indexPath: IndexPath) -> UITableViewCell.EditingStyle {
return .none //表示させない。
}
//編集モード時に左にずれるか。
func tableView(_ tableView: UITableView, shouldIndentWhileEditingRowAt indexPath: IndexPath) -> Bool {
return false //ずれない。
}

これらを前回の記事
【Swift4】UITableViewの基本のき。 | iPhoneアプリ備忘録
に適用すると。

起動すると
【Swift4】UITableViewで常時並べ替え可能にする。
この様な感じでいつでも並べ替え可能になる。