- 1. 【Flutter】Flutter製アプリをリリースしてみた、あとARとかも使ってみた話
- 2. iOS13でショートカットのバックアップを作成する
- 3. CleanArchitecture ファイルの自動生成(iOS・Swift)
- 4. RxSwiftで検索+ページネーションをいい感じにする
- 5. iOSの各種シミュレーターをfzfで選んで起動する
- 6. ローカライズファイルをAndroidとiOSで共通管理する
- 7. 【Swift】選択上限のある複数選択可能なTableViewの実装+スクロールしてもチェックマークがズレないようにする
- 8. iOSにユーザーデータを保存する方法と、そのためのコードの書き方: UserDefaults、Core Data、Key Chain、CloudKit
- 9. tns run iosよ、あなたはなぜiPad Airを起動するのか?NativeScript-VueのiOSエミュレータの初期デバイスをiPhoneに変更する
- 10. UIWebViewを使っているFrameworkを探す
- 11. iOSアプリにYouTube動画を埋めこもう2020
- 12. 俺の嫌いなXcodeが5秒でイチオシ開発環境に
- 13. SwiftのReverse GenericsというかOpaque Typeの紹介(社内勉強会用)
- 14. FirebaseCrashlyticsで強制クラッシュさせる時の方法が変わっていたお話
- 15. Wi-Fiオンオフ両方をこなせるショートカットを作ろう
- 16. Flutter + Firebase (FCM) でiOSのPush通知の実装
- 17. Xcode11でのsetting.bundleのバージョン更新スクリプト
- 18. Qiita の記事の閲覧数とLGTMの数を表示するiOSアプリを作成
- 19. “Could not find a storyboard named ‘Main’ in bundle NSBundle”に遭遇した時
- 20. create-react-native-moduleのexample/iosのビルドに失敗する
【Flutter】Flutter製アプリをリリースしてみた、あとARとかも使ってみた話
## アプリ概要
ゴルフの[オリンピックゲーム](https://www.clunk.jp/golf-olympic-rules#1)の計算やボールとピンまでの距離のAR測定,1−18までの乱数を生成することができる、ゴルフ幹事向けのアプリです。
[App Store はこちら](https://apps.apple.com/jp/app/engolf/id1507668448?l=en)
[Google Play Store はこちら](https://play.google.com/store/apps/details?id=com.tetsukick.engolf)![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261934/67933117-6fcb-fd17-a67e-2c6f9c547368.png)
## 前置き
\デデーン!/
![C8A144FA-0D15-4497-9D09-87E76FE70F28.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/561438/1d94abe3-9d5c-9d00-5b93-f5173a60224b.jpeg)
目当てのショートカットがなかなか見つからなかったり、割と不便なのでこの機会に整理します。
## iOSのバージョンによってはバックアップの復元方法が違う
iOS12での方法は既に先駆者様達が個人ブログ等でまとめてくださっているので、ここではiOS13でのバックアップ・復元方法について取り上げます。## 必要なもの
・iCloud Drive
・ファイルApp
・ショートカットApp## バックアップ
![9D25654D-66EC-4584-8019-AD6B06B762C5.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/561438/be434557-0CleanArchitecture ファイルの自動生成(iOS・Swift)
CleanArchitectureではファイルを大量に生成するので、できれば手動ではなく自動で行いたい。そのための手段をまとめた。
### Xcodeのテンプレート機能
#### メリット
Xcodeの機能として、テンプレートファイルを用意しておいておくと、ファイル生成時に選ぶことができる。
Xcodeの機能にすぎず、特別な設定は不要でプロジェクトの中身に何ら影響がない。テンプレートファイルは~/Library/Developer/Xcode/Templatesに置く。#### デメリット
テンプレートファイルは何処かから拾ってくるか自分で書く・編集する必要がある。自分は下記から拾った。
#### 参考
https://medium.com/swift2go/installing-the-clean-swift-template-in-xcode-6b4367006827### Kuri
#### メリット
普通に使いやすい
#### デメリット
ymlファイル・テンプレートファイルをプロジェクトルートに置かないといけない(プロジェクトの構成に影響がある)
RxSwiftで検索+ページネーションをいい感じにする
iOSアプリの以下のような条件の検索画面を RxSwift でいい感じに実装する方法をメモします。
– キーワードを入力して検索ボタンをタップすると検索開始する
– 検索APIは結果が多い場合を想定して、ページ番号指定によるページネーションができる
– 検索結果一覧の最後のアイテムを表示するタイミングで自動で次のページを読み込む
– 最後のページまで読み込んだら終了する### 実装方法
以下、検索画面 `SearchView` を想定したコードです。細かい説明はコメントとして書いてあります。また、ところどころに動作確認用の print 文が入っています。
– 検索ボタンを押した時は `search(by keyword: String)` を実行する
– 結果一覧の最後のアイテムを表示するタイミングで `requestNextPage()` を実行する“`swift:SearchView.swift
/// 検索画面
class SearchView {
/// キーワードを入力して検索ボタンを押した時に実行する処理
func search(by key
iOSの各種シミュレーターをfzfで選んで起動する
プリミティブな方法だと
“`console
$ xcrun simctl list
“`で、起動したいシミュレーターのUUIDを確認して
“`console
$ xcrun instruments -w 208E5166-9C5D-4CA5-A9DE-529AD562D311 # iPhone 11 Pro Max
“`とすると指定したシミュレーターが起動するのだが、Xcodeをアプデするとシミュレーターも更新されてしまうので、以前書き留めておいたUUIDが使えなくなる。また調べないといけなくてめんどくさい。
ということで、インクリメンタルに端末名で検索してEnterで起動するようにした。
`.zshrc` に以下を追記
“`zsh:.zshrc
function simc() {
xcrun instruments -w $(xcrun simctl list | grep -v unavailable | grep -E “^\s” | grep -v “:” | fzf | grep -oE “\((.+?)\)” | grep -oE “.{2
ローカライズファイルをAndroidとiOSで共通管理する
## はじめに
AndroidとiOSでサービスを展開している場合、同じ文言を使っている。
プラットフォームごとに管理することで文言の誤字が発生しやすく、コストも上がる。
ローカライズファイルを効率よく管理する方法を考えました## 前提条件
– AndroidとiOSで共通のリソースを扱う
– 差分を追いやすいこと## githubを使って管理
– オリジナルデータとなる文言とkeyはjsonにして管理
– githubを使うことで差分を追いやすくなる
– CIを使うことで自動化できる## ローカライズファイルを更新するツール
– JSONからローカライズファイルを生成するのを簡単にするためにツールを作成した
– [t-osawa-009/JSONToString](https://github.com/t-osawa-009/JSONToString)### 使い方
1.オリジナルデータとなるJSONファイルを追加“`json
[
{
“key”: “hoge”,
“key_android”: “hoge”,
“key
【Swift】選択上限のある複数選択可能なTableViewの実装+スクロールしてもチェックマークがズレないようにする
選択上限をつけた複数選択可能なTableViewの実装が調べても出てこなかったので、簡単に作ってみました。
##### 今回実現したいTableView
1. 複数選択可能
2. 選択状態がスクロールによって他のCellにズレない
3. 選択できる数に上限をつける[サンプルプログラム](https://github.com/asa08/multiple-select-table)
## 1. 複数選択を可能にする
“`MultipleTableView.swift
// tableViewのisMultipleTouchEnabledをtrueにする
isMultipleTouchEnabled = true
“`
これだけで複数選択が可能になる。## 2. 選択状態がスクロールによって他のCellにズレない
`Model`に選択状態を持って、その値を元に`Cell`を`init`する。“`MultipleTableView.swift
func tableView(_ tableView: UITableView, cellForRowAt indexPat
iOSにユーザーデータを保存する方法と、そのためのコードの書き方: UserDefaults、Core Data、Key Chain、CloudKit
データの保存はiOSアプリの持つ主要な機能です。たとえば、ユーザーが指定した色などの環境設定を保存したり、ウェブサイトのトークンをアプリに保存したり、ToDoリストのアプリを作ってタスクを保存したりすることができます。データをシステムに保存する方法はいくつもあります。
## 目次
[User Defaults](https://qiita.com/MaShunzhe/items/e7263507e07919a6adab#user-defaults)
[Core Data](https://qiita.com/MaShunzhe/items/e7263507e07919a6adab#core-data)
[Keychain](https://qiita.com/MaShunzhe/items/e7263507e07919a6adab#keychain-キーホルダー)
[iCloud CloudKit](https://qiita.com/MaShunzhe/items/e7263507e07919a6adab#cloudkit)この記事では、上記の方法それぞれについて、サンプルコ
tns run iosよ、あなたはなぜiPad Airを起動するのか?NativeScript-VueのiOSエミュレータの初期デバイスをiPhoneに変更する
# TL;DR
`package.json`に
“`
“scripts”: {
“ios-iphone”: “tns run ios –device ‘iPhone 8′”
},
“`を追加する
# 教えてくれた人
# tns run iosよ、あなたはなぜiPad Airを起動するのか
NativeScript−VueのアプリをMac OS Catalina10.15.4で開発中にiOSエミュレータを`tns run ios`(デフォルト)や`npm run serve:ios`(`vue-cli-plugin-nativescript-vue`でコードシェアリングしている場合)で起動すると、iPad AirのSimulatorが起動する。
UIWebViewを使っているFrameworkを探すアプリにUIWebViewが含まれている場合、App Store Connectへのアップロード時にITMS-90809の警告がメールで送信されたりするかと思います。
> ITMS-90809: Deprecated API Usage – App updates that use UIWebView will no longer be accepted as of December 2020. Instead, use WKWebView for improved security and reliability. Learn more (https://developer.apple.com/documentation/uikit/uiwebview).
警告にもある通り、既存アプリでUIWebViewを利用している場合は2020年12月で受け付けがされなくなるようなので、それまでに対応が必要です。
(参考: [ウェブビューを使ったAppのアップデート \- ニュース \- Apple Developer](https://developer.apple.com/jp/news
iOSアプリにYouTube動画を埋めこもう2020
iOSアプリにYouTube動画を埋めこんだので、その覚書です。
# 基本
YouTubeの公式ドキュメントを見ると、[YouTube-Player-iOS-Helper](https://github.com/youtube/youtube-ios-player-helper)というOSSを使うのを推奨されます。
基本WebViewをベースに、いい感じのサイズにしたYouTube動画を埋めこんで、コントローラーをつけるという感じです。(公式ドキュメント)
[Embed YouTube Videos in iOS Applications with the YouTube Helper Library](https://developers.google.com/youtube/v3/guides/ios_youtube_helper)(わかりやすいチュートリアル)
[[Swift] YouTube-Player-iOS-Helper を使って YouTube 動画を再生してみる](https://dev.classmethod.jp/articles/youtube-pla
俺の嫌いなXcodeが5秒でイチオシ開発環境に
iOS開発者の皆さん、毎日、ハッピーな開発ライフ過ごしてますでしょうか。
楽しい開発には快適な開発環境は欠かせませんが、もちろんiOS開発者の皆さんが使うのはXcodeですよね。
いや、俺はAppCodeという人はそっとタブを閉じましょう。JetBrains製品、良いですよね。Android Studio も素晴らしい。どんな言語でも同じ様な操作感で。でもちょっともっさりしてるんだよな。
その点、Xcodeは動きはキビキビしていて玄人プログラマー好み。でも一つ、**すごく嫌なところ**がありました。これさえ直してくれれば最高なのに。
普通、Xcodeって編集する時、複数のタブ開くじゃないですか。自分の場合はこんな感じ。
![スクリーンショット 2020-05-27 15.16.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22218/cfe2f4de-72cd-803b-226e-ffd2c3c488fa.png)
Storyboardと関連のソースファイルを幾つか。そして、デバッグす
SwiftのReverse GenericsというかOpaque Typeの紹介(社内勉強会用)
# Swiftとは
[Wikipedia](https://ja.wikipedia.org/wiki/Swift_(%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E8%A8%80%E8%AA%9E)) より
> Swift(スウィフト)は、アップルのiOSおよびmacOS、Linuxで利用出来るプログラミング言語。Worldwide Developers Conference (WWDC) 2014で発表された。アップル製OS上で動作するアプリケーションの開発に従来から用いられていたObjective-CやObjective-C++、C言語と共存することが意図されている。
swift.org [Language Guide](https://docs.swift.org/swift-book/LanguageGuide/TheBasics.html) より
> Swift is a type-safe language, which means the language helps you to
FirebaseCrashlyticsで強制クラッシュさせる時の方法が変わっていたお話
# 環境
– Xcode 11.4
– Swift 5.2
– FirebaseCrashlytics 4.0.0-beta.5# 概要(2020/05/27時点)
FirebaseCrashlyticsで強制クラッシュをさせようとしたら、以下の二点で微妙に詰まったのでメモ書きとして残しています。
– シングルトンインスタンス取得の方法が変わっていた
– 強制クラッシュを起こすメソッドが消えていた## シングルトンインスタンス取得
#### 以前のver
“`swift
Crashlytics.sharedInstance()
“`#### 現在のver
“`swift
Crashlytics.crashlytics()
“`## クラッシュさせる
#### 以前のver“`swift
Crashlytics.sharedInstance().crash()
“`#### 現在のver
公式ドキュメントによると `fatalError()` を使えとのこと。“`swift
fatalError()
“`# 引っかかった原因
日本語のドキュ
Wi-Fiオンオフ両方をこなせるショートカットを作ろう
## 前置き
iOSショートカットを使うと、Wi-Fiを完全にオフにできるので便利です。
ただ、「Wi-Fiオンの方も作ってホーム画面に配置する」となると二つもアイコン枠が必要なので少し邪魔です。
そんな問題を解決するために、「Wi-Fiオンオフを切り替えられる(=トグル式)ショートカット」を昔作ったので備忘録として書いておきます。## レシピ
![4EF57D4E-F0CF-4C43-8C29-84AD064E93D0.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/561438/5c55a4da-d7d9-24d7-8274-bc45d523d9ee.jpeg)ショートカットからホーム画面に戻る方法はいくつかありますが、[supermamon](https://routinehub.co/user/supermamon)さんの[Springboard](https://routinehub.co/shortcut/2900)を使って戻る方法がぶっちぎりで早いのでおすすめです。
## 実際に
Flutter + Firebase (FCM) でiOSのPush通知の実装
Flutter + FCM (Firebase Cloud Messaging) でiOSのpush通知を実装したのでその際のメモ。
## 参考にしたドキュメント
基本はFlutterのFCMプラグインのドキュメント通りに進めればできる。
https://firebaseopensource.com/projects/firebaseextended/flutterfire/packages/firebase_messaging/readme/Githubにexampleもある。
https://github.com/FirebaseExtended/flutterfire/tree/master/packages/firebase_messaging/exampleこちらのDevelopers.IOの記事には具体的な実装例が書いてあって、参考になった。
https://dev.classmethod.jp/articles/flutter_fcm_push1/## デバッグ
自分の場合はドキュメント通りに進めても何故かPush通知が成功せず。。。
デバッグの仕方もわか
Xcode11でのsetting.bundleのバージョン更新スクリプト
Xcode11からVersionとBuildは、MarketingVersionと、CurrentProjectVersionで管理されるようになりました。
これにより、Settings.bundleのバージョン更新スクリプト変更しないと悲しい状態になるので対応したメモ。“`shell
APP_VERSION=”$MARKETING_VERSION”
/usr/libexec/PlistBuddy -c “Set :PreferenceSpecifiers:1:DefaultValue ${APP_VERSION}” “${BUILT_PRODUCTS_DIR}/${WRAPPER_NAME}/Settings.bundle/Root.plist”BUILD_NUMBER=”$CURRENT_PROJECT_VERSION”
/usr/libexec/PlistBuddy -c “Set :PreferenceSpecifiers:2:DefaultValue ${BUILD_NUMBER}” “${BUILT_PRODUCTS_DIR}/${WRAPPER_NAME}/Se
Qiita の記事の閲覧数とLGTMの数を表示するiOSアプリを作成
## この記事の内容について
Open-Source Source code / オープンソース: https://github.com/mszmagic/Qiita-Contribution-Counter
この記事では、いくつかのヒントや私がアプリで使用した技術について説明しています。どちらかというとケーススタディのようなものです。
– ローカルデバイス上でユーザーのトークンを保存する
– 既存のウェブクッキーを使用してモバイルアプリケーションにユーザーをログインさせる
– `URLSession` を使用して `GET requests` を作る
– Swift でJSONレスポンスを解析する
– リモートサーバーから画
“Could not find a storyboard named ‘Main’ in bundle NSBundle”に遭遇した時
### 環境
– macOS Catalina 10.15.4
– Xcode11.4
– TargetSDK iOS13.4### いつ遭遇したか
iOSアプリを作る際に、最初に表示したい画面の名前を変えたかったので、`Main.storyboard`のファイル名を`Sample.storyboard`に変えてビルドすると、画面が描画されずに“`
Could not find a storyboard named ‘Main’ in bundle NSBundle
“`
と表示されてクラッシュした。**[Could not find a storyboard named ‘Main’ in bundle NSBundle 対処方法](https://qiita.com/kakipo/items/f93cc2bdc8b36b67adbb)**を参考に、info,plistの`Main storyboard file base name`を消したり、`Sample`に変えても効果なし。
## 解決方法
Xcode全体に`Main`で検索をかけてみると、info.pli
create-react-native-moduleのexample/iosのビルドに失敗する
## 現象
`create-react-native-module`を使ってNativeModuleを作成しようとしたところ、iosでビルド失敗してシミュレータが起動しなくなってしまった。“`sh
$ create-react-native-module –generate-example Example
“`## 実行環境
実行環境は以下です。
– Xode 11.5
– Cocoapods 1.9.1 (from brew)
– react-native 0.62.2
– create-react-native-module 0.19.0`react-native ios` ではビルドに失敗して起動しなかったが、Xcodeではビルドしてシミュレータを起動することができた。
Cocoapods側の不具合にでもあるのかなと推測。## 修正内容
Yogaに関するエラーが出ていたので、StackOverflowで似たようなことを書いてある記事を探してトライ&エラーで試してみた。
上手くシミュレーターが立ち上がったの解決策のものはCocoapodsの不具合に言及してい