iOS関連のことを調べてみた2021年03月20日

iOS関連のことを調べてみた2021年03月20日

OAuth2.0とscene-based lifecycleについておさらいしながら、SpotifyLoginのアップデートをする

こんにちは!

今回は、githubで公開されている**SpotifyのOauth認証を通すためのswiftフレームワーク”SpotifyLogin”** をiOS13以降に対応させる作業を通じて、OAuth2.0とscene-based lifecycleについておさらいしていこうと思います。

なお、本記事はiOS13以降のこの現代世界で、ひょんなことからSpotifyLoginを使うこととなった方たち向けにも書いています(そんな人いますか?)。SpotifyLoginはOSSであるため、コードの修正案はpullリクを送るのが正攻法かとは思います。しかし私のリクエストの書き方が悪いのか、作成者の方が更新に力を割けていないのか、送ったリクエストが反映されないままなので、簡単にではありますが他の方のハマりを防ぐためにも一旦ここにまとめておこうかと思いました!

もちろん私の修正案が適切でない可能性もあるため、もし何かお気づきの点があればコメントにてご指摘頂けますと幸いです?

# SpotifyLoginって何?
github上で公開されているSpotifyのOAuth認証を通すための

元記事を表示

UIViewのドラッグ (UIGestureRecognizer)

生のタップイベント情報を操作するゴリゴリの方法もあるが、
基本的なタップイベントに関してはUIGestureRecognizerがテンプレートを用意してくれているので、使えるときはそちらを使いたい。

ドラッグに関しては、UIPanGestureRecognizerと言うテンプレートが用意されている。

# 実装
UIGestureRecognizerにアクションを設定して、Viewに持たせればおk。

“`ViewController.swift
import UIKit

class ViewController: UIViewController {

@IBOutlet weak var draggableView: UIView!

override func viewDidLoad() {
super.viewDidLoad()

let pGR = UIPanGestureRecognizer(target: self, action: #selector(dragging))
d

元記事を表示

【Flutter環境構築】

# はじめに

Mac を使用していることを前提とした記事なので,Windows をお使いの方は戻るボタンを押していただき別の記事をご覧ください.
手順はたった3ステップ.[公式ドキュメント](https://flutter.dev/docs/get-started/install/macos)を参照しながら進めていきます.
さっそく環境構築を始めていきましょう!

# Flutter のインストール

1. [SDKをダウンロード](https://flutter.dev/docs/development/tools/sdk/releases?tab=macos)
基本的にはStable 版の最新バージョンをダウンロード
2. Flutterの保存先ディレクトリを作成して,ダウンロードしたzipを解凍
※保存先場所は好きなところにディレクトリを作成してください.

~~~ bash
$ mkdir /Users/(user name)/bin/flutter
$ cd /Users/(user name)/bin/flutter
$ unzip ~/Downloa

元記事を表示

配列の要素をまとめて更新する方法(Swift)

## はじめに

以下の構造体があります。

“`swift:Manga.swift
struct Manga {
let title: String
let volume: Int
var selected: Bool
}
“`

こちらの構造体を格納した配列があり、全要素の `selected` プロパティを `false` にするにはどうすればいいでしょうか?

“`swift
var mangas: [Manga] = [
Manga(title: “進撃の巨人”, volume: 34, selected: false),
Manga(title: “ワンパンマン”, volume: 23, selected: true),
Manga(title: “プラチナエンド”, volume: 14, selected: true)
]

func deselectMangas() {
// TODO: `mangas` 内の漫画をすべて選択解除する
}
“`

ぱっと思いつくのは `forEach()` メソッドで全

元記事を表示

UIViewのドラッグ (生)

生のタップ情報から任意イベントを検知をする自由度が高い方法と、UIGestureRecognizerが用意した基本タップイベントのテンプレートを使う方法があるが、
生でもドラッグ検知だけなら簡単ということがわかったので、試してみた。

## 実装

“`DraggableView.swift
import UIKit

// ドラッグだけ実装したヴュー
class DraggableView: UIView {
// ドラッグ検知メソッド
override func touchesMoved(_ touches: Set, with event: UIEvent?) {
guard let touch = touches.first else {// このビューへのタップ取得。ちなみにデフォルトではマルチタップのプロパティはfalseになってるので、ここではfirstのみ考えればおk。
assert(false)
}
let loc = touch.location(in: se

元記事を表示

React NativeでIntegrated Component Test

# Integrated Component Testとは

外部サービス(Web API等)とIntegrationされたUI Componentに着目し、テストすることです。
(どこかに定義があるわけではなく、僕が勝手に呼んでいる名前です。)

[React Native公式でTestに関する説明](https://reactnative.dev/docs/testing-overview)があります。その中ではEnd-to-End Testsに分類されると思いますが、
ユーザシナリオに基づいてテストはしません。IntegrateされたComponentに着目し、テストを分割、実行していきます。

# なぜ、Integrated Component Testしたいか

理由は以下の通りです。

## 1. デグレチェック/リファクタリングするためのテストがほしい

React NativeでAndroidアプリを開発しています。
そこそこ機能が増えてきて、
コミットする度にデグレしてないか気になるし、
自信をもってどんどんリファクタリングしていきたい。
テストがほしいと思いました

元記事を表示

【SwiftUI】失敗作を無駄死にさせないシリーズ:NavigationBarもどき

# タブバーに合わせて変化するナビゲーションバー
を作成しました。
ファイル名

どうでしょう。下のTabBarに合わせて上のNavigationBarも切り替わっています!
良い感じですよね〜。とても良い感じにできています。

通常、ナビゲーションバーは`NavigationView`を使って作っていきますが、私はNavigationViewには画像とテキストを一緒におく方法はないと思い込み、`HStack`などを駆使して「なんちゃってナビゲーションバー」を作成しました。

以下がコードです。(ネタバレですがこれは失敗例です。)
仕組みとしては、NavigationBarViewファイルに、画像とテキストをまだ設定してないナビゲーションバーを作ります。そしてナビゲーションバーを表示したい

元記事を表示

Swift: クロージャのキャプチャって?パート2

#はじめに
パート1の続きです。

#ネスト関数とクロージャ
前回の例題をネスト関数で置き換えました。結果は全く同じです。

“`swift
func maker(_ a: Int, _ b: Int) -> (() -> Int) {
var localvar = 0
func localfunc() -> Int {
globalCount += 1 // globalCountは参照されるだけ
localvar += b // localvar, bがキャプチャされる
return localvar
}
return localfunc
}
“`

#メソッドとイニシャライザ

通常の関数と同様に、クラスなどのメソッド、イニシャライザもクロージャとして扱うことかできます。

“`swift
class Friend {
let name: String
init(name: String) {
self.name = name
}
deinit {

元記事を表示

【初心者向け】たった三行でiOSのinput要素にCSS効かせる方法【iPhone】

【備忘録】


Win環境だけで制作してる場合、iPhoneで確認した時このような見た目になることありますよね…

Safariでinput要素にCSSが当たらない場合、

“`
-webkit-appearance: none;
-moz-appearance: none;
appearance: none;
“`
この3行を追加する:writing_hand:
-webkit-のベンダープレフィックスを追加することで、Safariでも効くようになります。

―――――――――――
私も普段Win環境で制作してるので忘れがち。
抜けたまま実機確認して/(^o^)\となるので、inputには一緒に入れるようにしましょう!

元記事を表示

Swift: クロージャのキャプチャって?パート1

#はじめに
今回はクロージャの中でも特に厄介なキャプチャについてまとめてみます。パート1です。

#クロージャのメリット
クロージャのメリットはプログラムの実行中にクロージャのインスタンスを作り出し、定数や変数に代入したり、メソッドの引数として渡したりすることでプログラムの振る舞いを動的に変更することができる点です。

#クロージャのキャプチャとは
クロージャはよく無名関数と言われますが、常に同じ機能のインスタンスが作られるわけではありません。インスタンスが生成される際、クロージャの外側にある変数の値を取り込んでインスタンスの一部とし、インスタンスが呼び出される時にはいつでも値を取り出すことができます。これをクロージャのキャプチャといいます。

#キャプチャを理解する上で重要なこと
#####1.
グローバル変数はクロージャの内部からも変数自体に直接アクセス可能。クロージャの内部から変数の値を変更することもできます。
#####2.
クロージャ式を含むコードブロック内で参照可能なローカル変数は普通にローカル変数として存在している間はクロージャ内からも参照可能で、共通の値が参照、更新でき

元記事を表示

AVFoundationをがっつり使ってすっかりAV芸人になった回

畑田です。
ある開発においてがっつりAVFoundation芸人にならねばならなかったのでAppleのAVFoundationのドキュメントを読んで分かったことをまとめてみます。
# captureについて
AVFoundationのcaptureというサブシステムはビデオ、写真、音声を撮影、録音するためのものであり、以下のときに使用されうる。
– アプリに自前のカメラ機能を実装するとき
– 動画や写真を撮影する際にフォーカスや露光、安定性などについて、ユーザーにより直接的に操作させたいとき
– 撮影した写真やdepth maps(なにこれ訳せやん)の保存形式を指定したり、ビデオのメタデータをカスタムしたりしたいとき
– 撮影、あるいは録音デバイスから直接ストリーミングさせたいとき

**もし、ユーザーにネイティブのカメラアプリを使用させたい場合は`UIImagePickerController`を用いれば良い点に注意すること。**
captureの主要なパーツはsession, inputs, outputsであり、sessionは**一つ以上のinputと一つ以上のo

元記事を表示

独自クラスの配列を指定した要素でグルーピングしてTableViewに表示する

#筆者環境

|MacOS|Xcode|Swift|iOS|
|:–:|:–:|:–:|:–:|
|Catalina(10.15.7)|12.4|5.3.2|14.4|

#表示に使うデータを用意

`SampleData`というグルーピングに使う`groupID`と表示用の`title`を持っただけの簡易的なクラスを作成する。

“`swift:SampleData.swift
import Foundation

class SampleData {

let groupID: Int
let title: String

init(groupID: Int, title: String) {
self.groupID = groupID
self.title = title
}

}
“`

#表示に使うテーブルを用意
1. `TableView`を配置していい感じにレイアウトの制約をつける
2. `TableView`上に`PrototypeCell`を配置してインスペクタで`I

元記事を表示

Flutter 住所 or 郵便番号から緯度経度を取得する

### Flutterで住所or名称or郵便番号から緯度経度を取得する

検索しても、なかなか出てこなかったのでメモ代わり

https://pub.dev/packages/geocoding

Null Safety 対応バージョン
`geocoding: ^2.0.0`

Null Safety非対応バージョン
`geocoding: ^1.0.5`

“` dart
final searchWord = ‘東京タワー’;
List locations = await locationFromAddress(searchWord);
print(locations.first.latitude); // 35.6585805
print(locations.first.longitude); // 139.7454329

final zipCode = ‘105-0011’;
locations = await locationFromAddress(zipCode);
print(locations.first.latitude); // 35.6

元記事を表示

Xcodeで実機テストができなくなりました。”Command PhaseScriptExecution failed with a nonzero exit code”というエラー

先日挫折しかけたSwiftでのエラーの解決方法が判明したので、メモとして残しておきます。

“`
Command PhaseScriptExecution failed with a nonzero exit code
“`
まずこんなエラーが出てビルドできなくなりました。

“`swift
PhaseScriptExecution [CP]\ Embed\ Pods\ Frameworks /Users/◯◯◯/Library/Developer/Xcode/DerivedData/demo2-cuxtcawdfrqcqafwplsfrvhdggep/Build/Intermediates.noindex/demo2.build/Debug-iphoneos/demo2.build/Script-024CAB14D5D4ECD45067AA1C.sh (in target ‘demo2’ from project ‘demo2’)
cd /Users/◯◯◯/Documents/GitHub/demoapp
/bin/sh -c /Users/◯◯◯/Libra

元記事を表示

.gitignore に Pods/ を追記しても反映されない時の対処法

iOS のライブラリ管理で最もよく使われる CocoaPods の Pods ディレクトリを git で管理したくない時、
.gitignore のファイルに `Pods/`と記載する。

しかし Git のキャッシュが原因で反映されないことがある。

“`terminal
$ cd プロジェクトのディレクトリ
$ git rm -r –cached .
$ git add .
$ git commit -m “.gitignoreの反映”
“`

以上でバージョン管理を外せる。

元記事を表示

iOSエンジニア見習いがUIKitのドキュメントを読んでみた。Part1

# はじめに

新卒で入社してから1年半、Xamarin.NativeとReact.jsを触っていました。
その後、部署異動をきっかけにiOS/Swiftのエンジニアに転向しました。
今はベテランのiOSエンジニアの方の元でがっつり勉強をしています。
アーキテクチャの設計やプロトコル、デリゲートといったプログラミングの基本的な部分はそこまでつまづかなかったのですが、UIKitの仕様がわかっていないせいでつまずくことが多いと最近気づきました。
そこで、重い腰を上げてUIKitのドキュメントを読むことにしました。
自分と同じ入門者の目線で感想などを載せていくので、今後同じ境遇の方にとって参考になればと思います。

# UIKit Framework

まずAppleのドキュメントなんですが、読む気にならないのはなぜなのでしょうか。。
ドキュメントを見てぱっと理解できたことがないということと、あとは玄人しか受け付けなさそうなデザインがそうさせているような気がしますね。。代わってVue.jsなんかは初心者が親近感を持って読みたくなるようなデザインをしているなあと思います。

余談はおいておいて

元記事を表示

Flutterで普通のスワイプで画面をpopする

Flutterで`Navigator.push(context)`して遷移した先の画面で元の画面に戻るときには`Navigator.pop(context)`をアイコンに設置したりエッジスワイプしたりしますよね。
通常のスワイプでも戻したかったのでやり方を見つけるのに少々苦労しましたがなんとかできました。

“`Dart
GestureDetector(
onHorizontalDragUpdate: (details) {
if (details.delta.dx > 18) {
Navigator.pop(context);
}
},
child: ・・・,
);
“`

このように`GestureDetector.onHorizontalDragUpdate`を設定して横方向のスワイプをトリガーに`navigator.pop(context)`を実行するようにしました。
`details.delta.dx`はスワイプの速度で、正の向きが左→右です。しきい値として設定した`18`を超えると`navigator.pop(context)`を

元記事を表示

iOS14でLaunchScreen.storyboardに設定した画像が表示されない

## 環境

ReactNative 0.63.4
react-native-splash-screen 3.2.0
iOS14~

## 問題

スプラッシュスクリーンが今まで問題なく表示されていたが、iOSのみアプリ立ち上げ時に黒い画面しか表示されないようになってしまった。

各種フレームワークで同様の問題が発生しているのでiOS14の問題のようです。

[App running on ios14 shows white screen instead of splash screen #504](https://github.com/crazycodeboy/react-native-splash-screen/issues/504)
[Ios14 splash screen doesn’t show up #513](https://github.com/crazycodeboy/react-native-splash-screen/issues/513)
[[Bug] iOS 14 Launch Screen is not working #9764](https://gith

元記事を表示

【Mobile】静的セキュリティ解析ツール「MobSF」Mobile-Security-Framework-MobSFの使い方

## MobSF(Mobile-Security-Framework-MobSF)とは
[MobSF](https://github.com/MobSF/Mobile-Security-Framework-MobSF)は、Android/iOSのペンテスト、マルウェア解析、セキュリティ評価を自動化したオールインワンのフレームワークです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261934/dc8ddabc-4096-c5f7-1931-c2bc8dcd0a58.png)

静的解析と動的解析を行うことができます。MobSFは、モバイルアプリのバイナリ(APK、XAPK、IPA、APPX)とzip形式のソースコードをサポートしています。

## MobSFの導入方法
### STEP1 Dockerをインストール
[Mac に Docker Desktop をインストール](https://docs.docker.jp/docker-for-mac/install.html)

元記事を表示

UIStoryBoardのIBOutletがnilを返すときの対処法

clean build folder!

元記事を表示

OTHERカテゴリの最新記事