iOS関連のことを調べてみた2020年05月27日

iOS関連のことを調べてみた2020年05月27日
目次

Qiita の記事の閲覧数とLGTMの数を表示するiOSアプリを作成

## この記事の内容について

Screen Shot 2020-05-26 at 4.54.30 PM.png

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 13.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の不具合に言及してい

元記事を表示

Swiftによるアプリ開発のためのComposable Architectureがすごいので紹介したい

# はじめに

Swiftを用いたiOS/macOS/tvOS/watchOSアプリ開発用に [Composable Architecture](https://github.com/pointfreeco/swift-composable-architecture)というのがあり、それがめっちゃ良いやん!と思ったのでそれを書いておきます。フレームワーク的に提供されていますが、特にSwiftUIを使ってどういう構成でアプリを作ろうかと考えている人がコードを読むだけでもとてもいい教材になると思います。

Composable Archtectureは関数型プログラミングとSwiftについての動画コンテンツ提供している Point-Free で考えられたようです。
https://www.pointfree.co/episodes/ep100-a-tour-of-the-composable-architecture-part-1

現在のバージョンは0.2.0です。

# 必須要件

Composable Architectureの必須要件を先に書いておきます。

– iOS13以上

元記事を表示

UIButtonに隠しActionをつける方法

# はじめに
ただどう動くんだろう?って言うだけの話で実用性は皆無です:innocent:
なんか UIButton に謎のアクションを付けれたというお話です。

# 環境
* Xcode 11.4
* iPhone 11 Pro Max (13.4)

# 実装
1. StoryboardでFirstViewControllerとSecondViewControllerを用意する
2. FirstVCにボタンをのせる
3. IBActionでボタンのアクションをFirstVCに紐付ける(`tappedFirst(_ sender: Any)`)
4. SecondVCにFirstVCのボタンをコピペする
5. IBActionでボタンのアクションをSecondVCに紐付ける(`tappedSecond(_ sender: Any)`)

こんな感じ

storyboardiOSアプリの GitLab CI/CD 環境を整える(コードレビュー編 SwiftLint, Fastlane, Danger)

# はじめに

## 本記事のゴール
iOSアプリのGitLab CI/CD環境を整えたい!

ということで、第一弾はコードレビュー編です。

以下のキャプチャのようにMerge Request作成時に自動でSwiftLintを実行+実行結果をコメントに残すことで、コードレビューを円滑にし品質向上に繋げることを目的としています。

![スクリーンショット 2020-05-26 15.19.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/121942/a041f6ff-f71d-55d4-c422-d8b642006aab.png)

## 環境
– macOS(ビルド用):macOS Catalina 10.15.4
– Xcode:11.4.1
– Swift:5.2.2
– SwiftLint:0.30.1
– Danger:8.0.0
– Danger Gitlab:8.0.0
– Danger Swiftlint:0.24.2
– Fastlane:2.148.1
– GitLab CE(

元記事を表示

[Swift5][FAB]フローティングアクションボタンの作り方

フローティングアクションボタンの作り方。

####実装イメージ
TableViewCellの上に浮いてるデザインで、スライドしても固定されるように実装します。
スクリーンショット 2020-05-26 15.49.12.png

####Storyboard
まずbuttonのみを置いてAutoLayoutをつけます。
スクリーンショット 2020-05-26 15.54.30.png
スクリーン</p></blockquote>
</blockquote>
<aside class='widget widget-post'>
<div class='tag-cloud-link'>iOS</div>
<div class='tag-cloud-link'>UIButton</div>
<div class='tag-cloud-link'>Swift</div>
<div class='tag-cloud-link'>FAB</div>
<div class='tag-cloud-link'>Swift5</div>
</aside>
<div><a style='width:100%;' class='btn__link' href='https://qiita.com/lsk4f5/items/2cc139d20ee1ef0da22f'>元記事を表示</a></div>
<h3 id=[Swift5] TextFieldのあるAlertを表示させる方法

SwiftでTextFieldのあるAlertを表示させる方法。

#### 実装イメージ
このようなタイトル、サブタイトル、入力欄、キャンセル、追加で構成されたAlertを作成して行きます。
スクリーンショット 2020-05-26 14.57.09.png

#### Storyboard
buttonを押すとAlertが表示されるようにするため、好きな場所にbuttonを1つ追加しましょう。
スクリーンショット 2020-05-26 14.19.46.pngmonacaでcordova-plugin-admob-freeを使った広告表示

少し面倒だったので忘れないようにメモしておきます。
admobで「ca-app-pub-」から始まるapp idを取得していることが前提です。

## ビルド環境の設定

– monacaクラウドIDEでビルド→ビルド環境の設定→iOS5.1.1を選択して保存する。
– monacaクラウドIDEで設定→JS/CSSコンポーネントの追加と削除→Monaca Core Utilityのバージョンを2.1.0以上に上げる。
– monacaクラウドIDEで設定→iOSアプリ設定→WebViewエンジンにWKWebViewを指定して保存。

## プラグインを用意する

#### cordova-admob-sdk
以下のサイトからv0.24.1のzipをダウンロードしました。
[cordova-admob-sdk](https://gitlab.com/ratson/cordova-admob-sdk)
#### cordova-plugin-admob-free
以下のサイトからv0.27.0のzipをダウンロードしました。
[cordova-plugin-admob-free](htt

Swift Method Swizzling (initializer, class method, instance method, getter, setter)

Swift 5のSwizzleについて1つのサンプルにまとめました。

自分もデバッグや一時的な動作変更に使う程度なので、間違いや補足などありましたらご指摘願います。

## UIView+Swizzle.swift

“`swift
import UIKit

extension UIView {

private struct SwizzleStatic {
static var once = true
}

class func swizzle() {
guard SwizzleStatic.once else {
return
}
SwizzleStatic.once = false
let swizzleMethod = { (original: Selector, swizzled: Selector) in
guard let originalMethod = class_getInstanceMethod(self

元記事を表示

高CPU消費でバックグラウンドの動画再生が60秒でiOSにキルされていた

iOS 13 WKWebView上の動画をAVPlayerにすり替えてバックグラウンドで動画音声を再生するアプリを作って公開しているのですが、わかりにくいエラーに遭遇したのでシェアしておきます。同じエラーの検索で来た人の助けになればうれしいです。

## 現象
バックグラウンド状態になってからも動画の音声は再生され続けるのですが、約60秒でクラッシュし、Xcodeのログ上には次のように表示されます。実機でしか再現しません。

“`
Message from debugger: Terminated due to signal 9
“`

これだけじゃ何が原因かよくわからない。

以下のエラーはリリース済みアプリの同現象を Firebase Crashlytics が捉えたもの。

“`
Fatal Exception: CALayerInvalidGeometry
CALayer position contains NaN: [nan nan]. Layer:

元記事を表示

[Xcode]The maximum number of apps for free development profiles has been reachedと出てインストールできない。

##原因
自作のアプリやプロビジョニングプロファイルを削除しても、インストールに失敗する場合は無料枠プロファイルのカウント処理がバグっている可能性が高いです。

##対応

iPhoneをMacに繋いで、コンソールでログを表示しながら再度インストールを試してください。

1. Window->Devices and Simulators->対象のデバイスを選択してOpen Consoleボタンをクリックでログを表示
2. アプリを実行して対象デバイスへのインストールを試みてください。
3. `MIFreeProfileValidatedAppTracker`でログを絞り込んでください。

“`
[MIFreeProfileValidatedAppTracker _onQueue_addReferenceForApplicationIdentifier:bundle:error:]: 182: This device has reached the maximum number of installed apps using a free developer profile: {(

元記事を表示

iOSアプリのローカライズとローカリゼーションのデバッグ – 開発言語の変更、ストーリーボードと文字列のローカライズ、ローカライズされていない文字列の特定とデバッグ

## ローカリゼーションとは?

自分が作ったアプリが人気になり、英語など他の言語にそのアプリを翻訳してもっと多くの人が使えるようにしたいと思うときが来るかもしれません。iOSのシステムは、ユーザー設定に基づきコンテンツを適切な言語で表示するなど、大方のローカリゼーションを行ってくれます。

## アプリをローカライズする方法

### `Development language` の変更

開発言語とは、アプリの開発時に使用する言語のことを指します。まず、設定の内容を確認する必要があります:

プロジェクトファイルをクリックし、(ターゲットではなく)プロジェクトファイルを選択します。ローカリゼーションのセクションで、`Development Language` が日本語なのか英語なのかを確認します。日本語の場合、設定は正しいので、何もする必要はありません。英語の場合、引き続き開発言語の変更のガイドに従ってください。

スクリーンショット 2020-05-24 16.05.37.pngIonic + Firebase Firestoreの中身を表示するアプリ

#はじめに
Ionicを使って[Firestore](https://firebase.google.com/docs/firestore?hl=ja)に登録したデータを表示するアプリを作成します。
表示するのは趣味で運営しているスノーボードまとめサイトの記事です。
[スノーボードまとめサイトTWEAK](https://sefy.work/)

以下のようにFirestoreに登録した記事の情報を一覧表示して、クリックすると記事に遷移するアプリを作成します。
![firebaseList.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410068/a99c59b6-71ec-e92a-52f6-ad66f7581761.gif)

#プロジェクトを作成する
以下のコマンドでプロジェクトを作成します。

“`
ionic start firestoreList blank –type=angular
“`

#必要なパッケージのインストールと環境設定
Ionicのアプリ内でwebページを開くため

元記事を表示

FlutterでWebRTCをやってみる with AgoraSDK

# はじめに
`WebRTC` を使ったアプリを開発する機会があり、何かお手軽な `package` ないかなーと探していたところ `Flutter` で `WebRTC` を手軽に利用できる `plugin` を見つけたので試しにアプリを作成してみました。

# WebRTC とは
`WebRTC` (Web Real-Time Communication) とは、ビデオや音声、データをブラウザ間でやり取り可能にするための規格で、`Google` によってオープンソース化されました。 ユーザーはその `API` を経由することでリアルタイム通信を実現できます。

[参考: WebRTCの基本とP2P通信が成立するまでを学ぶ](https://qiita.com/daitasu/items/ae21b16361eb9f65ed43)

最近ではコロナの影響もあり、ウェブ会議システムやチャットツールなどの利用者が急増しています。

– Zoom
– Hang out
– Discord
– Microsoft Teams

スクリーンショッ</p></blockquote>
</blockquote>
<aside class='widget widget-post'>
<div class='tag-cloud-link'>Android</div>
<div class='tag-cloud-link'>iOS</div>
<div class='tag-cloud-link'>Dart</div>
<div class='tag-cloud-link'>WebRTC</div>
<div class='tag-cloud-link'>Flutter</div>
</aside>
<div><a style='width:100%;' class='btn__link' href='https://qiita.com/yukitaka13-1110/items/e7350a5bc50f2056253f'>元記事を表示</a></div>
<h3 id=xcodeでiosのアイコンを設定する, Images.xcassets/AppIcon.appiconset

xcodeでのアイコンの設定が分かりづらかったので方法を書きます。

サイズのあった`.png`をprojectの`Images.xcassets/AppIcon.appiconset/`に置きます。そして、`Contents.json`を書きます。

`Images.xcassets/AppIcon.appiconset/`に`icon_1024x1024.png`を用意して、以下のスクリプトを実行すると、imagamagickでアイコンを作成します。

“`sh:icon.zsh
#!/bin/zsh

# Images.xcassets/AppIcon.appiconset/
# use : icon_1024x1024.png

mogrify -resize 20×20! icon_1024x1024.png icon-20.png
mogrify -resize 40×40! icon_1024x1024.png icon-20@2x.png
mogrify -resize 60×60! icon_1024x1024.png icon-20@3x.png
mogrify

元記事を表示

【iOS】XCUIElementTypeQueryProviderの定義済みクエリとUI要素の対応

XCUITestでUITestを作成する場合、UI要素の検索でXCUIElementTypeQueryProviderの定義済みクエリを
使うこともあると思います。
定義済みクエリを使用する時、クエリと実際のUI要素との対応が一部曖昧な部分があったので、
よく使いそうなUI要素との対応を備忘録的に記録しておこうと思います。

## UILabel
“`
func test_UILabelを取得() {
let label = app.staticTexts[“UILabel”] // accessibility identifierを指定
XCTAssertTrue(label.exists) // 指定したaccessibility identifierのUI要素が存在するか確認
}
“`
## UIImageView
“`
func test_UIImageViewを取得() {
let imageView = app.images[“UIImageView”]
XCTAssertTrue

元記事を表示

R.swiftでビルドエラー(Pods/R.swift/rswift: No such file or directory)が発生

## 事象
これです。よく見るやつですね。

“`
Pods/R.swift/rswift: No such file or directory
Command PhaseScriptExecution failed with a nonzero exit code
“`

Google先生に聞けばCleanすれば直るとか諸々削除してpod installすれば直るとかBuildConfigの設定が間違っているとか、色々な解消法が出てくるかと思います。

今回、数分前までBuildできていたものが、いきなりBuildできなくなり
一般的な解消方法を全部やってもダメで、数時間潰しました。

■一般的な方法 (引用元 https://qiita.com/masa-321/items/19f66557dcff65553f18)

“`
・Clean(Command + Shift + K)
・DerivedDataファイル以下全ての中間ファイル(キャッシュ?)を削除
参考:[Xcode][小ネタ] DerivedDataの削除についての備忘録
・Podfileを編集して、Podの再イン

元記事を表示

iOSのBageを標準とは違う位置に無理やりつける方法

ごくまれに、TabBarのバッチの位置をカスタムしたいとお願いされることがあります。
無理やりバッチをつけるのはちょっとめんどくさいですが、上手くできたので、メモっておきます。

“`swift

class CustomTabViewController: UITabBarController {

private var badges: [UIView] = []

override func viewDidLoad() {
super.viewDidLoad()

addBage(position: 3, text: “11”, frame: CGRect(x: 30, y: 5, width: 18, height: 18))
}

extension MainTabViewController {

// バッチをつける
private func addBage(position: Int, text:String, frame:CGRect) {
guard tabB

元記事を表示

Realmを利用したiOSアプリの実装(データの追加・編集・更新・削除)

## この記事の内容
モバイル向けデータベース管理システム **Realm** を利用した、iOSアプリの開発
![スクリーンショット 2020-05-24 13.05.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199441/605dbc4b-4988-8be4-fa58-a6d4e0b9ddc1.png)

## 参考にした記事
[Realmを使ってTODOアプリを作ってみよう!/ Swift(Realmの使い方、初級編)](https://qiita.com/pe-ta/items/616e0dbd364179ca284b)

## 開発したアプリ
前掲の記事を参考にして、ToDo を追加しテーブルビューで表示することに加えて下記機能を実装した。

・**Remove All ボタン** をクリックすると、ToDo を全て削除
Simulator Screen Shot - iPhone SE (2nd generation) - 2020-0</p></blockquote>
</blockquote>
<aside class='widget widget-post'>
<div class='tag-cloud-link'>Qiita</div>
<div class='tag-cloud-link'>Xcode</div>
<div class='tag-cloud-link'>iOS</div>
<div class='tag-cloud-link'>Swift</div>
<div class='tag-cloud-link'>Realm</div>
</aside>
<div><a style='width:100%;' class='btn__link' href='https://qiita.com/tanakadaichi_1989/items/dacd090f0e4d3ab145e8'>元記事を表示</a></div>
</div>
      </section>
	        
      
      
      
	        <!-- 記事下シェアボタン -->
        <aside>
<ul class=

  • OTHERカテゴリの最新記事