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

iOS関連のことを調べてみた2021年08月22日
目次

悪い継承はどんな継承か(未完成)

※ずっと下書きに入っててもったいないのでとりあえず公開

「継承ってあまりよくないよねー」と言ったような言説をここ数年で見かけるようになりました。
私も大体5年前くらいに継承という仕組みに対して失望しました。
とはいえ現状多くのプログラミングでは継承を多用しているはずで、継承=悪というのは乱暴だとも言えます。
ではどういう継承が悪いのか、継承のどういうところが悪いのかという話になると思いますが、これをスッと答えられる人は多くないのではないでしょうか?

私も言語化しづらいなーと思っていたのですが、普通にググってたら書いてたいたし、なんなら大昔からそんな事言われていたようなので、ざっくり調べました。
参考程度にどうぞ。
細かい話はしません、私には荷が重い。

## オブジェクト指向のアンチパターン

サンキューWikipedia
[Wikipedia – アンチパターン オブジェクト指向のアンチパターン](
https://ja.wikipedia.org/wiki/%E3%82%A2%E3%83%B3%E3%83%81%E3%83%91%E3%82%BF%E3%83%BC%E3%83%

元記事を表示

[iOS] [Swift] クエリ文字列(URLパラメーター)の作成

## 辞書 → クエリ文字列(URLパラメーター)にコンバート

“`swift
extension Dictionary where Key : StringProtocol, Value : StringProtocol {
var queryString: String {
var components = URLComponents()
components.queryItems = self.map {
URLQueryItem(name: $0 as! String, value: String(describing: $1))
}
return (components.url?.absoluteString)!
}
}
“`

## 使用法

“`swift
let queryDic = [“key1”: “value1”, “key2”: “value2”]
print(queryDic.queryString)
“`

元記事を表示

iOSの実機でビルド実行するとProvisioning profileが証明書に含まれていないとのエラーが出る場合の解決方法

こんにちは。[もぐめっと](https://mogmet.com)です。

本日の投稿は問題解決tips系の投稿です。

## 結論

iOS実機をビルドしてデバッグしようとするとprovisioning profileがうまくあたらなくてビルドできないので、端末の証明書を再発行するとうまくいく

## エラー内容

最近Flutterをやっているのですが、別端末でiosを実行しようとすると下記のようなエラーがでました。

“`
error: Provisioning profile “iOS Team Provisioning Profile: com.mogmet” doesn’t include signing certificate “Apple Development: Mog Met (XXXXXXXX)”. (in target ‘Runner’ from project ‘Runner’)
“`

ちゃんとAutomatically manage signingにチェックが入って組織も問題なさそうなのにこのエラーが出ました。

![image.png](http

元記事を表示

[iOS]UICollectionViewCompositionalLayoutを使うと横スクロールのUIScrollViewDelegateが取れない問題

間違ってたらすいません
UICollectionViewCompositionalLayoutってそもそも「縦スクロール内に横スクロール」は可能だけど、「横スクロール内に縦スクロール」みたいな構成はできないんですね。
できないんですよね?
たぶんできない。

それで、UICollectionViewCompositionalLayoutを適用したUICollectionViewのdelegateを設定してUIScrollViewDelegateを取ろうとすると、縦は取れるけど横が取れない。
まあ何となく取れない気がしますよね。

問題なのは横スクロールのUICollectionViewを作りたかった場合で、UICollectionViewCompositionalLayoutを使いたい場合。

そもそもそんなシーンどれだけある?と思いますが結構あります。
1つはpagingをしたい場合です。
UICollectionViewのpagingはマジで複雑だし微調整で数日掛かります。できればUICollectionViewCompositionalLayoutでpagingしてしまいたい。

元記事を表示

BitriseでGoogleService-info.plistをDLし、slackに通知を送る

#やること
1.GoogleService-info.plistをダウンロードする
2.Bitriseからslackに通知を送る

#環境
Swift 5.4
Xcode 12.5

#アプリ作成
今回はGoogleService-info.plistを使用するので、LifeCycleは「UIKit App Delegate」を選択してください。
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409860/bcf67dcf-f190-de98-d9bc-77a4be20fcbb.jpeg)
作成後GoogleService-info.plistでBundle IDが必要になります。

##GoogleService-info.plistをアプリに追加
[firebase](https://firebase.google.com/)にアクセスし、プロジェクトを作成します。
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4098

元記事を表示

TextFieldで変換が出来なくなった!

## 背景
シュミレータで動きを確認しつつ、実機で実行してみたらTextFieldに入力した値が濁点、半濁点のつけ外し、変換が出来なくなっていて困ったのでメモ。

## 原因
TextFieldで文字列の入力数の制限をかけていたのですが、それが問題でした。
TextFieldは、Eding Changedで接続してあります。
・問題のソースコード

“`swift
guard let text = username.text else { return }
username.text = String(text.prefix(20))
“`

最大文字数を20文字とし、それ以上は入力できないようにしていたのですが、この”prefix”が値を確定してしまうため、入力できませんでした。

## 解決策
一旦のしのぎとしてはこのような感じ(パワープレイ感は否めない)

“`swift
guard let text = username.text else { return }
if text.count > 20 {
username.text = String(

元記事を表示

App Storeレビュー時に審査員のネットワーク環境が原因でリジェクトされた話

## 結論
[審査員のネットワーク環境が原因で接続を確立できない](https://developer.apple.com/forums/thread/133938)のが原因。

対処法としては…
– レビュワーと交渉して別のネットワーク環境での接続を試してもらう
– 動作時の動画を送って問題なく動作することを証明する etc…

## 問題の発生
ClubHouse等で使われている[AgoraSDK](https://jp.vcube.com/service/agora)を使ったビデオ通話アプリの申請中、
Apple審査員から「通話機能が使えません」とのことでリジェクトされる。
→ ちなみに他の接続を要する機能は使えてました。

## 調査
### 原因の特定
カメラや音声設定の可能性もあるので、ひとまず該当箇所にログを仕込んで原因箇所を特定。
通話処理部分の各ステップごとに自社サーバー側へログを送信する処理を実装。
SDKで用意している関数内で通話接続の確立に失敗していることが判明。

社内Wifiや4G、LTE等の通信環境、端末やOSのバージョンを変えて試して

元記事を表示

deploygate用にipaファイルを作成する方法

deploygate用にipaファイルが必要になったのですが、
app storeの申請とはまた異なる流れですし、
https://docs.deploygate.com/docs/export-ipa
公式のリンクがだいぶ古いものなので、備忘録として記しておきたいと思います。

まずは、apple developerのサイトからログインしてください。
https://developer.apple.com/

## 1. Certificates

iOS Distrubutionで証明書を発行します。
Certificatesの横の+ボタンから発行します。

![スクリーンショット 2021-06-10 19.22.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/998564/142bd8b7-5910-eb67-42f0-2a587b788ef8.png)

## 2. identifier
次にidentifierの設定です。(Certificateをすでに作成している場合は、こちらからス

元記事を表示

OHHTTPStubsでHTTPリクエストのテストをする

# はじめに

[OHHTTPStubs](https://github.com/AliSoftware/OHHTTPStubs)はHTTPレスポンスのモックを作るためのライブラリとしてはよく知られていますが、HTTPリクエストのテストを行う方法について調べても具体的な方法がでてこなかったので自分なりにまとめてみました。

# リクエストのテストについて

公式のサンプルコードをみると、最初のところに`stub(condition:)`があるのがわかります。

“`swift
stub(condition: isHost(“mywebservice.com”)) { _ in
// Stub it with our “wsresponse.json” stub file (which is in same bundle as self)
let stubPath = OHPathForFile(“wsresponse.json”, type(of: self))
return fixture(filePath: stubPath!, headers: [“Content-

元記事を表示

iOS/iPadOS 15 での App Tracking Transparency framework 実装

日本の皆さん、你好です

iOS 15で私の既存アプリを動かしたら ATTプロンプトが表示されませんでした。
調べてみたら許可プロンプトを連続で出してる場合は表示されないことが判明。

アイヤー

あらためて目を皿のようにして公式リファレンスを読み込みました。
すると

あら!

> Calls to the API only prompt when the application state is: UIApplicationStateActive.

https://developer.apple.com/documentation/apptrackingtransparency/attrackingmanager/3547037-requesttrackingauthorization

ちゃんと書いてた・・・

ちなみにこの変更がされたのは iOS 15 beta3 か4 くらいです。
その後 beta5, beta6 でも変わらないので Appleはこの仕様を押し通す模様。

私のアプリでは複数の許可プロンプトを連続で表示しています。

元記事を表示

【WidgetKit】SceneDelegateを使用せずにウィジェットからの遷移を実装したい

##はじめに
Widget内で`Link`や`.widgetURL`を使用した場合、SceneDelegate内で処理を追加する必要があります。
AppDelegateのみで実装している場合、後からSceneDelegateを追加するのは面倒です。
そこで、なんとかAppDelegateでできないかなと模索しました。
なんとAppDelegateにUIWindowSceneDelegateを継承させて実装してあげると、なんと動いてしまいました。

##実装方法
下記の例のようにAppDelegateにUIWindowSceneDelegateを継承させて実装します。

“`swift
extension AppDelegate: UIWindowSceneDelegate {

@available(iOS 14.0, *)
// App launched
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UI

元記事を表示

Flutter調べ備忘録

## この記事は?
Flutter調べたことメモ。
全体像の俯瞰用にシンプルにまとめ。
(気が向いたら随時更新)

## 記載範囲は?
– 言語の特徴
– UIに関して
– アーキテクチャ
– メリデメ

## 言語の特徴
### dart
– オブジェクト指向
– 静的型付け

JAVAライク。

## UIに関して
### 大きく2種類
#### material
Android、MaterialDesignのUI。
[Material Components widgets](https://flutter.dev/docs/development/ui/widgets/material)

![スクリーンショット 2021-08-19 043125.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700755/220a2fee-92cf-494c-a920-6ffe379634d5.png)

#### Cupertino
iOSなUI。 iOSでよく見るUI部品は大体ある。
[Cupertino

元記事を表示

[SwiftUI]タップでキーボードを閉じる方法

## 投稿の経緯
個人開発中のアプリでタップしてキーボードを閉じる機能を実装したので記録に残します。

## 環境
Swift version 5.4.2
Xcode version 12.5.1

## extensionの実装
まず、UIApplicationUIApplicationを拡張します。

“`swift
import Foundation
import SwiftUI

extension UIApplication {
func closeKeyboard() {
sendAction(#selector(UIResponder.resignFirstResponder), to: nil, from: nil, for: nil)
}
}

“`

簡単に何をしているか説明すると、sendActionでセレクターに対してアクションを送信し、`UIResponder.resignFirstResponder`に`nil`を設定することで、最上位のファーストレスポンダがnilとなり、何もアクションしていない状態となりキーボードも閉じ

元記事を表示

[iOS15] [未解決]「アップデートの必要があります AppをこのバージョンのiOSで動作させるには、デベロッパによるアップデートが必要です」で自作アプリがインストールできない時

# とりあえず、検証結果

– **Xcode10.xでビルドしたアプリは動かない!**
– Xcode11は未検証です。AppCenterでビルドしてみればいいけど、そのためのコード変更がめんどくさいのでやってません。
– 一部僕のところで発生したアプリでは、Swift3を使ったライブラリをリンクしてあるので、それも問題かも。(だからXcode10から離脱できなかった)

**ありがとう iOS15! やっとXcode10を捨てられるよ!!**

# 20190819 追記 修正
どうやら、Xcodeのバージョンというよりも、**Development Target**の問題っぽい。
少なくともiOS11 / watchOS3 の設定ではNGでした。@ Xcode12.5.1
何が正解なんだ??
iOS13 watchOS6 の設定にしたところインストールまで出来ました。

どちらにせよ、Xcode10じゃダメってことで。わーい。さようならXcode10

#さらに追記修正 Xcode 12.4 はNGでした
Microsoft Azure AppCenterでXcode 12.4

元記事を表示

Unityでスマホアプリを開発する

Unityでスマホアプリを開発するために必要なものを全てドキュメントに残します。
また、自分自身Unityを使ってのアプリ開発は初めてなので少しでも疑問に思ったことは全てメモしていこうと思います。
完成するまでに随時アップデートします。

## プロジェクト作成までにするべきこと
### Unityのインストール
Unity Hubをインストールするのが良いでしょう。
そこからUnityをインストールします。
※ここでiOSとandroidのモジュールを追加すること
※後からでも追加できます。
(自分は後からモジュールを追加しました)
※日本語化したい人は日本語化のモジュールもインストール

![スクリーンショット 2021-08-18 9.21.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/615043/d9c21920-81ed-f69c-1524-0fe5dae42418.png)

こうなっていればOK!

### 2Dと3D両方のスクリーンが出てくる場合はどうすればいい??
→一旦2Dで

元記事を表示

【Flutter】ShareExtensionのアプリ名をローカライズする

ShareExtensionのinfo.plistに下記を追記する必要があります。

“`Runner/ShareExtension/info.plist
LSHasLocalizedDisplayName
“`

元記事を表示

[2021年版/BigSur対応]iOSPush通知証明書の更新方法

## はじめに
iOSエンジニア年1回の恒例行事、iOSのPush通知証明書の更新方法についてまとめました。
OSがCatalinaからBig Surに変わり、キーチェーンアクセスのUIが微妙に変わって苦戦したので、備忘録としてメモを残しておきます。

作成日: 2021/08
Mac OS: Big Sur 11.4

## STEP1. ローカルPCで証明書の要求ファイルを作成する

– キーチェーンアクセスを起動します。
– メニュー「キーチェーンアクセス」→「証明書アシスタント」→「認証局に証明書を要求…」を実行します。
![キーチェーンアクセスから認証局に証明書を要求.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/539259/137970b2-0956-6dad-d3c3-7955b331d186.png)

– 証明書アシスタントが起動するので、証明書情報を記入します。
– ユーザーのメールアドレス:開発者のメールアドレス
– 通称: 適当な名前を入力。キーチェーンアク

元記事を表示

Swift初心者が一ヶ月でアプリ開発するまで

#はじめに
この記事はSwift初心者の自分がiOSアプリを開発するまでに読んだ教本、参考になった動画について書きました。文才はないので分かりにくかったらすみませんm(_ _)m
# 自己紹介
高校3年生 将来エンジニアになりたいので夏休みからSwiftの学習を始めました。
プログラミング経験はPythonを少し触ったことのあるくらいでオブジェクト指向もよくわからない程度でした。
パソコンオタクだったのでブラインドタッチは早いです(笑)
#作ったアプリ
中学生時代はバスケ部で、たまに友達と体育館を借りて試合をすることがあるので電子得点板のようなアプリを作りました(調べたらもう似たアプリが結構あった:sweat_smile:)![Simulator Screen Shot – iPhone 11 – 2021-08-17 at 14.02.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1281785/6a4cb966-5587-0e32-385e-48d1630f72b9.png)

自作アプリは初

元記事を表示

SwiftUI 環境で表示中のUIViewControllerを取得する

## 概要

SwiftUIのプロジェクトで、現在フロントにあるUIViewControllerを手軽に取得する方法についてのTips

## SwiftUIとUIKitの連携

SwiftUIのViewとUIKit間での連携は

– UIHostingController
– UIViewRepresentable

を使った方法がある。

ただ、SwiftUIのプロジェクトで外部ライブラリなど使用する場合に

いま提示している「UIViewController」を渡すことが必要になるケースがある。

例えば、Googleの「UserMessagingPlatform」を使って

ATT事前許諾プロンプトを提示する際に

SwiftUIのコンテキスト上からライブラリ側にUIViewControllerを渡す必要がある。

方法は他にも色々ありそうだが、その時の対応メモ。

## 現在のUIViewControllerを探す

表示中のUIViewControllerを探す流れは

まず

1. UIApplicationから接続中のUISceneたちを取得
2. 前面にあるアクテ

元記事を表示

Building Mobile Apps at Scaleの自動テストの部分で知らなかったところメモ

世界的な会社がどうテストしているのか、ちょっとテスト関連のベストプラクティスを探して読んでみています。

個人的にはrobot pattern testingはちょっとした収穫でした。
またかなりSnapshot testが行われていることが印象的でした。
詳しくは以下

https://www.mobileatscale.com/

(ユニットテストは大事的なのが書いてあるんですが、知らなかったところ中心で書いているので飛ばしています)

### Snapshot test

IntegrationテストやUI/E2Eテストの特別な形。スクショをとって、保存されている画像と比較する。データは通常モックが使われる。違うとテストが失敗する。失敗の理由として画像が使われる

Snapshot testのUberでの事例

* iOSではFacebookからiOSSnapshotTestCaseを引き継いで、多用していた
* デバイスのサイズが多様だったのでAndroidで適切なスナップショットを行うための労力がこのプラットフォームでは高すぎると考えたのでAndroidでは行わないことを

元記事を表示

OTHERカテゴリの最新記事