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

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

monacaでcordova-admob-plugin-freeを使った広告表示

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

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

#### 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](https://github.com/ratson/cordova-plugin-admob-free)

## ビルド環境の設定

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

元記事を表示

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>
<h3 id=【Swift】位置情報を取得する

# 概要

swiftで位置情報を取得する方法について、まとめました。

startUpdatingLocation() で位置情報の取得を開始し、取得した場合 func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) が呼び出され位置情報を確認することだできます。

“`
class ViewController: UIViewController, CLLocationManagerDelegate {

var locationManager : CLLocationManager?

override func viewDidLoad() {
super.viewDidLoad()

locationManager = CLLocationManager()
locationManager!.delegate = self

元記事を表示

【SwiftUI】ビューをジェスチャーで回転させ、90°ずつスナップを効かせる方法

#【SwiftUI】ビューをジェスチャーで回転させ、90°ずつスナップを効かせる方法
こんにちは、たいちです([@taichi_swift_](http://twitter.com/taichi_swift_))

>たかし「お絵かきアプリとかでよくある、ビューを回転させて90°づつピタって止めるやつ、どうやって実装するんだろ…」

こちらのお悩みを解決します。

##ビューを回転させる方法
まずは、基本のビューを回転させる方法です。
SwiftUIでは、
`.rotationEffect(_ angle: Angle, anchor: UnitPoint = .center)`
というmodifierを使用します。

実際に使うときには、
`.rotationEffect(Angle(degrees: 90))`
みたいに使うわけですね。

IMG_1985 2.jpg【SwiftUI】基本的なモディファイアの種類と使い方②

テキストの装飾に関するモディファイア

#lineLimitモディファイア
文字列の表示行数の最大値を設定
例:文字列”hogehoge”を20回繰り返して3行に収める

“`swift
Text(String(repeating:”hogehoge”,
count:20))
.lineLimit(3)
“`

#truncationModeモディファイア
文字列を省略する場所を指定
例:文字列の中心が省略

“`swift
Text(String(repeating:”hogehoge”,
count:20))
.lineLimit(1)
.truncationMode(.middle)
“`

#lineSpacingモディファイア
行間の幅を指定 
cssのline-heightと同じ

“`swift
Text(“hogehoge”)
.lineSpacing(50)
“`

#fontモディファイア
フォントの種類を指定
種類:
largeTitle:大きなタイトル
title:タ

元記事を表示

XCODEからiPhoneにアプリが送れなくなった

XcodeからiPhoneにアプリが送れなくなった。全然コードの問題じゃなさそうで、
「iPhone is not available. please reconnect the device.」
っとだけでてきて、iPhoneは認識しているのにアプリが転送されない。
散々調べた結果、これだった。。。。

まじかよー
https://stackoverflow.com/questions/61863826/iphone-is-not-available-please-reconnect-the-device

Xcodeのアプデートで完了。

元記事を表示

[Flutter] Apple Watchの呼吸アプリのアニメーションを作ります。

こんにちは~Dreamwalkerです。
もう夏ですね。暑いです

# 始める前に

呼吸アプリを利用している方いらっしゃいますか?
ストレス溜まっている時、とてもおすすめです。

こんな形のアプリなんですが、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137182/49d898c2-8974-ecff-64c4-da1cb0d00f2a.png)
Use the Breathe app https://support.apple.com/en-us/HT206999 

この呼吸アプリのアニメーションをFlutterでやってみまいと思います。

# コード

## CustomPaint Widgetを使います。

CustomPaintの中にはPainterというのが必要です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137182/d978b2cf-1e5c-ee7a-3b

元記事を表示

【Swift】Protocolとはなにか、どんな時に便利か

# Protocolとは
Protocolとはある機能を実現するclassやstructが必ず実装するべきメソッドやプロパティの名前や型を定義するものです。
他の言語いう抽象クラスやInterfaceにあたります。

“`swift
protocol CanFly {
func fly() // 実際の処理は書かない
}
“`
protocolを定義するときは、必要なメソッドやプロパティの名前や型を定義するのみで実際の処理は書きません。

# どんなときに便利か
特定のclassやstructが持っているべき要件(このメソッドやプロパティを持っているべき)を適用したい場合に便利です。
例えばBirdクラスを作ります。鳥の特徴は空を飛べて、メスは卵を産みますね。

“`swift
class Bird {
var isFemale = true
func layEgg() {
if isFemale {
print(“トリは卵を産みました”)
}
}
func fly() {
print(“トリは翼で羽ばたいて空を飛びました”)
}
}
“`

元記事を表示

【Swift】QRコードを読み取って文字列を取得する

簡単に実装したサンプルです。参考になると幸いです。
[asa08/QRreader](https://github.com/asa08/QRreader)

## カメラを設定する
`import AVFoundation`して、`AVCaptureSession`をインスタンスを生成します。

“`swift
private let session = AVCaptureSession()
“`
次に、カメラの設定を行います。

“`swift
// カメラの設定
// 今回は背面カメラなのでposition: .back
let discoverySession = AVCaptureDevice.DiscoverySession(deviceTypes: [.builtInWideAngleCamera], mediaType: .video, position: .back)

let devices = discoverySession.devices
if let backCamera = devices.first {
do {
// カメラでQR

元記事を表示

DribbbleでFlutterのUI実装力を高める

みなさん、こんにちは
とあるサラダ?の会社で開発やってます umatoma です。

最近はFlutterのUI実装力を高めようと、
Dribbbleで公開されているデザインをFlutterで再現してみているので、紹介したいと思います。

# Dribbble

https://dribbble.com/
> Dribbble is the world’s leading community for creatives to share, grow, and get hired.

Dribbbleには?のように、様々なデザインが投稿されていて、
アプリUIに関するデザインも沢山?あります。

また、動画で投稿されているものもあったりして、
アニメーションを含んだデザインが見れる点はとても良いです?

で、このDribbleで公開されているデザインをFlutterで再現して、
FlutterのUI実装力を高めようと試みています???

![スクリーンショット 2020-05-22 19.49.39.png](https://qiita-image-store.s3.ap-northe

元記事を表示

OTHERカテゴリの最新記事