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

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

Danger用にxcpretty-json-formatterで テストを実行して ld: symbol(s) not found for architecture x86_64 になった時に対応したこと

## 前段
– BitriseのWorkflow内でDangerを回している
– danger-xcode_summaryを利用
– xcpretty-json-formatterも利用
– Bitriseの`XcodeTest for iOS`は利用せずスクリプトでテスト実行
– FirebaseはCocoaPodsで入れる
– Xcode11.3.1, CocoaPods1.5.3, FirebaseCore6.6.6

## 現象

xcpretty-json-formatterの出力を指定した以下のスクリプトでテストビルドを実行

“`shell
set -o pipefail && env “NSUnbufferedIO=YES” xcodebuild -workspace $WORKSPACE -scheme $SCHEME \
clean build test -destination “platform=iOS Simulator,name=iPhone Xs,OS=12.4” \
GCC_INSTRUMENT_PROGRAM_FLOW_ARCS=YES GCC_

元記事を表示

UIKitに依存するSwift PackageをVSCodeで開発する

~~Xcodeがクソすぎて~~**VSCodeが好きすぎてSwiftのコードを書くのにもVSCodeを使いたい!**
と思って調べてみたところ、どうやらSwift PackageのプロジェクトならVSCodeでもそれなりにコード補完できるようになる、ということがわかりました。

こちらにあるのがApple公式の[sourcekit-lsp](https://github.com/apple/sourcekit-lsp)(Swiftの構文補完のためのLanguage Server)リポジトリで、中を見ると[VSCode用の拡張機能](https://github.com/apple/sourcekit-lsp/tree/master/Editors/vscode)のコードもあるみたい。

なので、まずはそちらのREADMEに従ってVSCodeのsourcekit-lsp拡張機能をインストールします。上記のsourcekit-lspのリポジトリをクローンしてきて、

“`
$ cd Editors/vscode
$ npm run createDevPackage
$ code –in

元記事を表示

iPhoneアプリ学習:ストップウォッチ

#はじめに
某プログラミング学習サイトでの学習記録を記します。

#No1:割愛

#No2:部品配置
・複数の部品にまとめて制約を付ける場合は、
 ・対象となる部品を全て選ぶ
 ・Embed InからStack Viewに登録する
 ・View Controller Scene > View Controller > View > Stack Viewを選択する
 ・位置の制約を付ける

#No3:部品をコードに接続する
・時間表示用のラベル
・ボタン3つ(Start,Stop, Reset)

#No4:ボタン押下でタイマーを開始する
@IBAction func (ボタン名) (_ sendor:Any) {
 Timer.scheduledTimer(
  timeInterval: 0.01, // 実行間隔[秒]
  target: self, // タイマーで実行するメソッドのある場所
  selector: #selector(self.update), // 実行するメソッド名
  userinfo:nil, // selectorに渡す情報。なければnil
  re

元記事を表示

[iOS]project.pbxprojなどのマージコンフリクト解消を最速でやるには

### おすすめツール

– Visual Studio Code

project.pbxprojファイルに限らないが、ファイル内にコンフリクトマーカーがある場合、そこを色付けで表示し、一発で飛べる。その上、「Accept Incoming Change」「Accept Current Change」「Accept Both Changes」の各ボタンが用意されており、ワンタッチで「マージされてきたブランチ」「現在のブランチ」「両方のブランチ」の変更を適用する事ができる。その他、軽く使いやすいためおすすめ。

### 解消の考え方

`project.pbxproj`ファイルは、プロジェクト内にあるファイルの定義およびそれらのフォルダ階層構造などを定義している。そのため、マージ(またはチェリーピック)するブランチ同士でファイルの位置が違ったり、新規ファイルを追加したりしていると必ずマージコンフリクトを起こしてしまう。

まず、現在のブランチと、マージによって持ってきたブランチで、ファイル・フォルダの階層構造がどう違っているかを確認する。

その上で、マージ後はどういった階層構造にした

元記事を表示

UITabBarItemにシステムアイコンをセットする

## はじめに
掲題の通り、UITabBarItemにシステムアイコンをセットする方法がなかなか見つからなかったため、備忘録として残す

## 設定方法
以下のように引数Imageに UIImage(systemName: “アイコン名”)を設定するだけ
アイコン名は以下から取得可能
https://developer.apple.com/design/human-interface-guidelines/ios/icons-and-images/system-icons/

“`swift
v.tabBarItem = UITabBarItem(title: R.string.localizable.bookList(), image: UIImage(systemName: “book”), tag: 0)
“`

以上!!!

元記事を表示

【Flutter】GoogleDriveへのバックアップ・リストア機能を実装するまでの道のり

![トップ2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228439/7356a55f-67ae-8929-5042-ca79983f4a38.jpeg)

7月にFlutter開発を初めてから2作目のメモアプリ「IdeaShuffleMemo」をリリースしました。
■AppStore
https://apps.apple.com/jp/app/id1517535550

■Google Play
https://play.google.com/store/apps/details?id=com.IdeaShuffleMemoApp&hl=ja

■アプリの詳細記事

ひらめきたい!あなたに!アイデアを発想するためのメモアプリ「IdeaShuffleMemo」

3つの機能を実装しようと取り組みました。この記事では、その中のバックアップ機能を実装する方法を書いていきたいと思います。

■パスワードロック機能実装ついてはこちら
https://qiita.com/YuKiO-OO/items/bf2d1d107d1a6

元記事を表示

【超初心者】WebデザイナーがiOSネイティブアプリ開発に挑戦して学んだこと共有

人類(というか自分)の大きな進歩についての感動を共有。

iOSネイティブアプリがシミュレーター&実機で動作するまでの取り組み。主にWebデザイナーから範囲広げたり、なんとなく学習考えている人向けの共有。

#前提スペック
・某大手企業勤務の雇われ(使い捨てとも言う)Webデザイナー
・HTML、CSS、CMS業務レベル

#取り組んだこと
・MacBookAir2020でXcode(Swift)を使って、iOSネイティブアプリの開発
・シミュレータとローカルの実機で、何となく動作させるまで(iPad)

#大変だったこと
・全部英語w
・Appleは互換性を大事にしてそうな気がしたけど、実際は数ヶ月くらい?のハイペースでコロッコロ仕様を変えてやがる。参考書やWebの情報が少し古いだけで、あまり役に立たない
・XcodeやSwiftにもバージョンがあって、コロッコロ変わる
・環境構築が思いのほか、難しくて大変すぎる。1日仕事どころじゃない

#意外だったこと
・画面のデザインはCSSとかでやると思ってたけど、ネイティブアプリ開発にCSSなんて全く登場しない(たぶん)
・アップル独自(s

元記事を表示

Xcode11 プロキシ設定

プロキシ環境化で作業をしているため、設定をすることが多いのですが、
Xcode11でプロキシの設定が変わっていたので、残しておこうと思います。

###### 変更ファイル
Xcode11以前
/Applications/Xcode.app/Contents/Applications/Application Loader.app/Contents/MacOS/itms/java/lib/net.properties

Xcode11
/SharedFrameworks/ContentDeliveryServices.framework/Versions/A/itms/java/lib/net.properties

###### 変更内容
パスワード設定がある場合でも、パスワードの指定は不要でした。

**動かない:disappointed_relieved:**
`http.proxyHost=http://username:p%40ssword@myproxy`
`http.proxyPort=8080`

**動いた:smiley:**
`http.proxyHost=http

元記事を表示

UserDefaultってすっごくシンプル!?(追加と取得)

#UserDefaultの書込み
って本当は簡単なのかもしれない。と思い、簡略化して書いてみました。

“`ruby:View1Controller.swift
import UIKit
class ViewController: UIViewController,UITextFieldDelegate {

@IBOutlet weak var emailTextField: UITextField!
var emailTextField = “”

override func viewDidLoad() {
super.viewDidLoad()
emailTextField.delegate = self
}

@IBAction func ButtonAction(_ sender: Any)

UserDefaults.standard.set(emailTextField.text, forKey: “userMail”)

“`
UserDefault.s

元記事を表示

SwiftUI で Animatable なシェイプを作ってみる

## シェイプにアニメーションをつけてみました

SwiftUI の勉強をかねて、[以前の記事](https://qiita.com/takehito-koshimizu/items/ffaf15a77831a6da2c13)で作成した SwiftUI のシェイプにアニメーションをつけてみました。



```

## sample
https://youheinakagawa.github.io/go-to-safari-js/

## npm package
[go-to-safari](https://www.npmjs.com/

imageViewをタップする

#profileでイメージ変更をしたい時など使用する、imageViewにtapアクションを持たせる
スクリーンショット 2020-07-05 18.35.08.png

xcodeの右上の「+」から TapGesture Recognizer を選択し、imageViewの上にドロップ

次にInteractionのUser Interacton Enabledにチェックを入れる
(僕はこれを忘れてて少しの間頭を抱えていました。。)

スクリーンショット 2020-07-05 18.32.56.pngFirebase Crashlyticsを効果的に使うお話

## 最初に

今回はユーザーさんからのクラッシュの問い合わせをCrashlyticsを使い
どうしたら素早くやバグを解決できるか考えてみました。
デバッグって大変ですよね。

導入自体については、公式のドキュメントをご確認ください。
https://firebase.google.com/docs/crashlytics?hl=ja

今回は、Android javaでのコードを記載しました。

## ユーザーID検索

ユーザーがログインした時などにユーザーの情報をセットしていくと、文字列をいれて送ることができます。

```java
Crashlytics.setUserIdentifier("userid-12345678910");
Crashlytics.setUserEmail("userid-email");
Crashlytics.setUserName("userid-name");
```

そうするとこれはクラッシュ詳細の「データ」のタブに表示されます。
この画像の右下あたりのユーザーの部分です。
スクリーンショット</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'>Firebase</div>
<div class='tag-cloud-link'>FirebaseCrashlytics</div>
</aside>
<div><a style='width:100%;' class='btn__link' href='https://qiita.com/ueno-yuhei/items/4f513e2b650e802a5249'>元記事を表示</a></div>
<h3 id=SwiftUI で星型のシェイプを作ってみる

## はじめに

[昔の記事](https://qiita.com/takehito-koshimizu/items/1b4e138458c29a970bc1)で、UIKit で星型の図形を作ってみたことがあったのですが、勉強ついでに SwiftUI でも試してみました。次のようなビューを作成してみます。

|正五角形|正六角形|
| ------- | ------- |
| Simulator Screen Shot - iPhone SE (2nd generation) - 2020-07-04 at 21.46.56.png | Simulator Screen Shot - iPhone SE (2nd generation) - 2020-07-04 at 2</p></blockquote>
</blockquote>
<aside class='widget widget-post'>
<div class='tag-cloud-link'>iOS</div>
<div class='tag-cloud-link'>Swift</div>
<div class='tag-cloud-link'>SwiftUI</div>
</aside>
<div><a style='width:100%;' class='btn__link' href='https://qiita.com/takehito-koshimizu/items/ffaf15a77831a6da2c13'>元記事を表示</a></div>
<h3 id=[Swift]Gameplaykit Programming Guide超要約

### GameplayKit Programming Guide

[GameplayKit Programming Guide](https://developer.apple.com/library/archive/documentation/General/Conceptual/GameplayKit_Guide/index.html#//apple_ref/doc/uid/TP40015172-CH1-SW1)

### GameplayKitとはどんなものか

- ゲームを作る際のアーキテクチャ 設計・構築
- ゲームを作る上で必要な複雑なアルゴリズムの構築をサポート
- 他の上位層のゲーム用ライブラリとは独立しており、ゲームを作る際自由に組み合わせて使うことができる。
- 例えば、Gamekitと、2Dゲームの場合はSpriteKit, 3Dゲームの場合はSceneKit, サードパーティ製のエンジンを使いたい場合はMetal や OpenGLESを組み合わせて使える。グラフィックがさほど要らないゲームならUIKitと組み合わせてもいい。
- GameplayKit

[iOS]ゲーム開発 初心者の学び

## 自己紹介

iOSで開発経験が2年程度ありますが、ゲームは全く作ったことがありません。趣味でゲームを作ろうと思っています。前提知識を随時まとめてみます。書いたコードはこちらです [Github](https://github.com/Satoru-PriChan/IOS_Swift_GameDeveopment_Cookbook_Chapter1)

## アーキテクチャ

- `Entity-Component Architecture`
- ゲームで使うオブジェクト(`Entity`)に、様々な再利用可能な振る舞いを定義した部品(`Component`)を持たせる形で作っていく。`GameplayKit`の中の`GKComponent`を継承したクラスにより、`Component`を作成していく。
- 自前でこうした仕組みを作ることもできるが、`GameplayKit`を利用していくことで楽にできる。

- `GKEntity`
- 通常は特にサブクラス化せず、`addComponent(component:)`メソッドでコンポーネントを追加していく。

Realm Swiftに関してのポイントまとめ

## ある種類のオブジェクトを全て削除したい

```swift:
// Delete all objects from the realm
try! realm.write {
realm.deleteAll()
}
```

・・・これだと、Realm上にある**全データを削除**してしまう。

特定の種類を全削除するには、まずのその種類のオブジェクトを全て読み込んでから、これを`delete()`メソッドに渡せば良い。

```swift:
let realm = try! Realm()
let objects = realm.objects(HogeHoge.self)

try! realm.write {
realm.delete(objects)
}
```

参考: [Can we delete all objects of particular type #4769](https://github.com/realm/realm-cocoa/issues/4769)

## マイグレーション

Realmに保存しているモデルに変更があった際には、`M