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

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

【Apple Developer】App Store/TestFlightへのアプリ申請でできる限りレビューの回数を減らしたい時の前準備

# アプリのみで完結しないiOSアプリの新規申請はなかなか通らない件
ビジネスロジックが複雑なアプリは何かと審査にひっかかります。
審査員がまず機能を網羅的に確認できないから一つ一つの機能のレビューで1ヶ月審査に時間を使うなどあったりします。

なのでできる限り機能面の問い合わせでレビューのやりとりを減らしたい時は審査前のテスト情報として、下記質問に前もって答えておくとすんなりレビューを通してくれるのでおすすめです。

また、TestFlightで外部配信時にも審査が必要になったので、
ログインが必須なアプリはテスト用のログイン情報も必ずTestFlightのテスト情報欄に共有するようにしましょう。

“`
1. Is your app restricted to users who are part of a single company? This may include users of the company’s partners, employees, and contractors.

2. Is your app designed for use by a limite

元記事を表示

Flutterで個人アプリリリースをして、約1年間で得た知見をまとめる

# 目次
2020年10月に個人開発でFlutterを使ったスマホアプリをリリースしました。
そろそろリリースしてから1年経つので得た知見を簡単に纏めておきます。
誰かの役に立てば嬉しいです。

## リリースしたアプリ
![スクリーンショット 2021-08-23 22.41.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410187/8004d861-c243-612b-839a-5837e82aa05d.png)

アプリ名:**グルメマップ**
機能:**近くの飲食店をMap表示するアプリ**
利用技術:**Flutter**
リリース日:**2020年10月**
作ったきっかけ:**3秒くらいで近くのランチやディナー検索できるアプリが欲しかった**
利用API:
[Google Maps API](https://developers.google.com/maps/?hl=ja)
[Google Places API](https://developers.google.com/m

元記事を表示

Unity(iOS)で ローカルネットワーク上のデバイスの検索および接続を求めています。 って出ても気にすんな

# tl; dr
– Development builds of the Player contain the PlayerConnection class that allows remote debugging and other things across the local network. **This is expected behaviour**, and PlayerConnection is not used on release builds.
– https://issuetracker.unity3d.com/issues/ios-pop-up-message-would-like-to-find-and-connect-to-devices-on-your-local-network-appears-when-app-is-launched-on-ios-14

# 要は
少なくとも `Development build` が有効だと出ます。無効にしても出る場合はサードパーティーのプラグインなどを疑ってみてください。

元記事を表示

[Swift]pod ‘Firebase/Firestore’インストール後のビルドが遅い場合の対処法

## ビルドが遅い
Podfileに`pod ‘FirebaseFirestore’`をインストールしてビルドするとビルド完了に時間がかかります。

## 対処法
結論

“`swift
pod ‘FirebaseFirestore’
“`
ではなく

“`swift
pod ‘FirebaseFirestore’, :git => ‘https://github.com/invertase/firestore-ios-sdk-frameworks.git’, :tag => ‘7.11.0’
“`
とか書けば解決します。

## 理由
理由は[ドキュメント](https://github.com/invertase/firestore-ios-sdk-frameworks.git)に書いてありました。

>Why
Currently the Firestore iOS SDK depends on some 500k lines of mostly C++, which when compiling as part of your Xcode build takes a l

元記事を表示

Core DataのcreateOrUpdateはマージポリシーによって変化する

# はじめに

タイトルを悩んだが適切なタイトルの表現が難しい。

Core DataでcreateOrUpdate的なやり方をしたいとき、Constraintsを設定しそのConstraintsに従ってcontext.saveを実行する場合を想定。その際にマージポリシーによって更新されたりされなかったりが決まる。

# createOrUpdate実例

## nameプロパティにセットしない場合

### マージポリシーがNSMergeByPropertyObjectTrumpMergePolicy

![スクリーンショット 2021-08-23 17.45.53のコピー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16400/4df7e04d-98d2-866f-e32d-0294e87d14e9.png)

マージポリシーをNSMergeByPropertyObjectTrumpMergePolicyに切り替え、DBをクリアした結果は次の通り。

“`swift
@objc(Person

元記事を表示

RealmのcreateOrUpdateはオンメモリ側のプロパティに値をセットしなければその項目はnilになる

# はじめに

タイトルを悩んだが適切なタイトルの表現が難しい。

RealmSwiftのcreateOrUpdateこと`create(_:value:update:)`メソッドにおいて、`update`パラメータに`.modified`もしくは`.all`を指定した場合かつプライマリキーを持つオブジェクトを更新する場合にその際の挙動について書いておく(後述するがCore Dataとほぼ同じ挙動だった)。

公式のリファレンスに従ってやや冗長に言い換えると、『主キーを持つオブジェクトによって既存を更新する場合は、新しいオブジェクト自体でプロパティが更新される』といったところかもしれない。

https://docs.mongodb.com/realm-sdks/swift/latest/Structs/Realm.html#/s:10RealmSwift0A0V6create_5value6updatexxm_ypAC12UpdatePolicyOtSo0aB6ObjectCRbzlF

> If an object already exists in the Realm with

元記事を表示

flutterで端末の気圧センサーを用いたpluginを自作して公開してみた

#

# 下準備

まずこれを呼び出します。

`flutter create –template=plugin –platforms=android,ios -a java flutter_barometer`

テンプレート作成時に追加されている、 `example` ディレクトリで

`flutter build apk`

`flutter build ios –no-codesign`

を実行し、事前にアプリをビルドします。

# 作成

### Android
Android Studioで `[プラグイン名]/example/android/build.gradle` を選択してプロジェクトを開きます。

サイドバーにある`[プラグイン名]/java/[パッケージ名]/[プラグイン名]Plugin` というファイルに実装していきます。

### iOS

Xcodeで `[プラグイン名]/example/ios/Runner.xcworkspace` を選択してプロジェクトを開きます。

サイドバーにある

`Pods/Development Pods/hel

元記事を表示

[SwiftUI]UIActivityIndicatorViewを作成する

## 投稿の経緯
個人開発中のアプリでインディケーターを作成したので備忘録。

## 環境
Swift version 5.4.2
Xcode version 12.5.1

## 完成イメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643372/c35b9b9b-05e5-0240-1b17-e5440be21d0c.png)

表示されているViewの上に`opacity`をつけた背景と画面中央にインディケーターを表示させます。

## インディケーターの作成
“`swift
import Foundation
import SwiftUI

struct ActivityIndicator: UIViewRepresentable {
func makeUIView(context: UIViewRepresentableContext) -> UIActivityIndicatorView {
UIActiv

元記事を表示

UICollectionViewを簡単に使うためのテンプレート

## 環境
swift version5.4

## コード
### 下準備

“`swift
import UIKit

extension UIView {

/// クラス名を文字列で返す
static var className: String { String(describing: Self.self) }
}
“`

“`swift
import UIKit

extension UICollectionView {

func register(cell: T.Type) {
let nib = UINib(nibName: cell.className, bundle: nil)
register(nib, forCellWithReuseIdentifier: cell.className)
}

func dequeueReusableCell(withReuseCell cell: T.

元記事を表示

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

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

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

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

## 前提として押さえておきたい文脈

これはあくまで「自分たちで作ったクラスを継承する」みたいな文脈です。
SDKやLibraryなどで慎重に設計されたクラスを継承することに対して「良くない」という声は上がっていない認識です。
そもそもそれ無いとなんもできません。

私が得意なiOSだと例えばBaseViewControllerみ

元記事を表示

[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

元記事を表示

OTHERカテゴリの最新記事