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

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

fastlaneでIn-Houseで配布するコマンドを作る

 開発しているアプリを実機で確認したい場合、通常は、「iOS Developer Program」の「Certificates,Identifiers & Profiles」から、実機登録を行なって、AdHoc配信でインストールするかと思いますが、開発者が多い場合や、イベントの時だけなど、端末を登録したくない理由がいろいろ出てくると思います。
この場合に、もし、エンタープライズライセンスを持っている場合は、社内向けに配布ができる、In-Houseという配信方法があるので、それを活用して、開発中のアプリをインストールできるようにすると便利です。

ただ、In-House配信も簡単にとはいかないので、これもfastlaneのコマンド一発で、crashlytics もしくは、Firebase App Distribution までアップロードし配布できるようにすると、かなり運用が便利になります。
必要あれば、CircleCIなどのCIサーバーに、自動で実行するジョブをセットすれば、もっと楽になります。

この場合に問題になるのが、証明書やProvisioningProfileやTeamIDな

元記事を表示

【iOS】UISegmentedControlの見た目を変える(iOS13対応)

# 概要
[UISegmentedControlの見た目を変えたいなぁ](https://qiita.com/omotesando/items/b2481cb57fa941adf88c) – Qiita
さんを参考に、iOS13に対応したカスタムUISegmentedControlを紹介します。

見た目はこんな感じ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272677/1bc5d53a-6777-c9c0-7411-9e57b622357d.png)

# コード
今回書いたカスタムクラスを丸ごと貼ります。
プロジェクト内にコピペしてください。

“`swift:FlatSegmentedControl.swift
import UIKit

class FlatSegmentedControl: UISegmentedControl {
private var segmentItemWidth: CGFloat = 0
private var underli

元記事を表示

Multiple targets match implicit dependency for linker flags エラーの解決法

#FirebaseでGoogleSignInを導入したらエラーが発生。

share extensionを使った時も同じようなエラーが出た。

#解決法
###podfileを修正

以下を追加

“`
pod ‘GTMSessionFetcher’
“`

#解決後

“`
# Uncomment the next line to define a global platform for your project
platform :ios, ‘10.0’
use_frameworks!

def google_utilites
pod ‘GoogleUtilities/AppDelegateSwizzler’
pod ‘GoogleUtilities/Environment’
pod ‘GoogleUtilities/ISASwizzler’
pod ‘GoogleUtilities/Logger’
pod ‘GoogleUtilities/MethodSwizzler’
pod ‘GoogleUtilities/NSData+zlib’
p

元記事を表示

謎リジェクトされてしまった件について+対応

初めて以下のようなリジェクトをくらいました。

“`
差出人: Apple
Other – Other
Hello,

We are unable to continue this app’s review because your Apple Developer Program account is currently under investigation for not following the App Store Review Guidelines’ Developer Code of Conduct.

Common practices that may lead to an investigation include, but are not limited to:

・Inaccurately describing an app or service
・Misleading app content
・Engaging in inauthentic ratings and reviews manipulation
・Providing misleading custom

元記事を表示

iOSアプリの署名を更新

開発者の証明書の期限が切れるなどで証明書を更新すると、過去に作った`ipa`ファイルが開発用端末で使えなくなる。
ビルドし直すという手もあるが、時間が経っているとビルド環境が変わっている可能性が高い。

Fastlaneを`ipa`を再度署名することができる。

“`bash:コマンド例

FASTLANE_SKIP_UPDATE_CHECK=1 && \
FASTLANE_OPT_OUT_USAGE=1 && \
fastlane sigh resign myapp.ipa \
–use_app_entitlements \
–signing_identity ‘iPhone Distribution: Runo Sahara.’ \
–provisioning_profile “$HOME/Library/MobileDevice/Provisioning Profiles/myapp.Today.mobileprovision” \
–provisioning_profile “$HOME/Library/MobileDevice

元記事を表示

Core Haptics – カスタムハプティックパターンの作成と再生

Core Hapticsは、iOS 13で新たに追加された「ハプティック(触覚)パターンを作成し、再生する」ためのフレームワークです。ついにTaptic Engineを開発者が制御するためのAPIが公開されたというわけです。[^taptic]

[^taptic]: Core Hapticsはオーディオによるフィードバックも扱うので、厳密にはTaptic Engineを制御するだけではありません。

## 従来手法(UIFeedbackGenerator)との違い

Taptic Engineが初めて搭載されたのはiPhone 6sで、ハプティックパターンの再生自体は、iOS 10で追加された`UIFeedbackGenerator`により以前から可能

元記事を表示

admobの広告を実機で表示する際にエラーが起きたときの対処

# やりたかったこと

iOS向けのアプリケーション作成に手を出しはじめたのですが、admobによる広告表示を実機で確認しようとしたとき、
下記のエラーに見舞われましたが、なんとか表示まで持っていけたという話です。

公式のスタートガイド(https://developers.google.com/admob/ios/banner?hl=ja) に従い進めたところ、
シミュレータでのテスト広告表示まで問題なく確認できたが、実機(iPad mini 4)でのテストで躓いた部分を書きます。

# 前提/背景

admobによる広告表示のため、Xcodeのプロジェクトを作成した後に、CocoaPodsを用いて`Google-Mobile-Ads-SDK`をインポートしました。

公式ガイドの通りに実装をしてiPhoneSE, iPhone8のシミュレータでテスト広告の表示まで順調に確認できてました。

# 実機でのテストにおけるランタイムエラー

しかし、いざ実機でアプリケーションを動かそうとしたときに問題が発生しました。
ビルドは成功するのだが、実行時エラーでアプリケーションが落ちてし

元記事を表示

【iOS】遷移方法まとめとエンジニア1年生の独り言

# iOS遷移方法まとめ

案件にて、主に Navigation Controller に関する懸念点を考慮し Controller の構成を考える必要があったため、今回は iOSにおける一般的な遷移方法をまとめてみました。

遷移方法・Controller の hierarchy を決定するために役立てられればいいなと思っています。

また、最後に[エンジニア1年生の独り言](#エンジニア1年生の独り言)も記載しています。

ご指摘・ご感想・たわいもないコメントなどいただければ嬉しいです!

### 環境

– Xcode 11.2.1
– Swift 5.0
– iPhone 11 Pro Max (iOS13.2.2, シミュレータ)

# 遷移の種類

一般的な遷移の種類は大きく分けて以下の4つです。

– push遷移
– modal遷移: [番外編: modalとは?](#番外編:-modalとは?)
– tab切り替え
– page遷移

||push遷移|modal遷移|tab切り替え|page遷移|
|—|—|—|—|—|
|遷移時のアクション|指

元記事を表示

iPhoneアプリで自己証明書のサーバーにリクエストを送りたい

# はじめに
開発環境ではlocalhostに対してAPIリクエストを送って情報を得るケースがあります。
しかし、iPhoneのデフォルトではどのサーバーにも`https`であればきちんとした証明書を求めます。
証明書関連をしっかりするのをチーム全員に求めるのも酷なので(たまにしか触らない人も出てくるし)、アプリ側で吸収する方法を調べました。

# 環境
iOS 13.3

# ライブラリを使う
`Alamofire`というライブラリを使用するのが一番楽という結論になりました。
Security関連の設定を楽にできる仕組みが入っているためです。

# Alamofireインストール
https://qiita.com/ume1126/items/9ec378c02ca1b06287e9

上記記事を参照ください。
少し前の記事ですが、この記事を記載している時点で同じやり方で特に困りませんでした。

# Sessionの生成
`Alamofire`はSessionを元に動きます。
公式では`AF.request`という形でリクエストを作っていますが、`AF`の正体は`Session.de

元記事を表示

[iOS][Swift]UIColorからUIImageを生成する(ダークモード対応版)

# 概要
参考 https://qiita.com/akatsuki174/items/c0b8b5126b6c12f62001

参考リンクに挙げた記事の通り`UIKit`の`UIButton`のハイライト時の背景色を指定したい場合など、色から指定したいが仕様上`UIImage`でしか設定することができないという状況では、`UIColor`から`UIImage`を生成する必要があります。
iOS12までは参考リンクの通りで良いのですが、iOS13ではダークモードが搭載されたため特定のケースで上手く動かなくなることがあります。
本記事ではダークモードに対応したUIColorからUIImageを生成する方法を紹介していきます。

# 方法
先に方法だけ提示します。解説は以下の項に続きます。

“`swift
extension UIImage {
static func filledImage(byColor color: UIColor) -> UIImage {
let createImage = { (rawColor: UIColor) -> UII

元記事を表示

iOSアプリに必要なデータをCoreDataでbundleする

iOSアプリで読み取り専用データをbundleするための方法

# データ作成
実際に使うものと同様のデータモデルで作成する。

https://qiita.com/kenmaz/items/818d61cd0ece8664c017
の設定をしておくと、SQLiteのファイルパスがログに出力されるので便利。

サイズを小さくするためにVACUUMする。

“`sql
sqlite> VACUUM;
“`

# Bundleのやり方
普通にSQLiteのファイルをドラッグアンドドロップしてbundleする。
書き込みたい場合は Application Support とかにコピーしてから使う必要があるが、読み取り専用なのでその必要はない。
ただし、sqliteの一時ファイルである Hogehoge.sqlite-wal と Hogehoge.sqlite-shm も一緒にbundleしてあげる必要がある。
これが存在しないと、Unable to open って怒られる。
両方とも空ファイルでOK。
image.pngUICollectionViewのドラッグで、元の位置に戻すときに一瞬ちらつく現象

##ドラッグ時にちらつく

Xcode9時代にUICollectionViewのドラッグアンドドロップによる並び替え機能を実装していた画面にて、Xcode11.3でビルドしたところ、一見問題なく動いているものの、

– ドラッグ開始
– 元の位置に移動する
– 瞬時に元の位置に戻ったり、ドラッグ位置に戻ったりとちらつく

という現象に遭遇しました。
実はというと、Autolayoutで警告メッセージが表示されていたので、多分そっちを解決すべきなんですが、どうしてもAutolayoutが解決しなかった。

で、iOS11以降から使用できるというUICollectionViewDragDelegate/DropDelegateがあるためこちらに書き換えたところ、現象が解消されました。

## UICollectionViewDragDelegate

ドラッグ開始のデリゲート。
UIDragItemのitemProviderを通じてドラッグ後イベントにパラメータを渡したりできる。
よくある書き方はこんなかんじ。

“`Swift
func collectionView(_ collec

元記事を表示

BitriseでAdHocアプリ配布するまで

# ゴール
PRのMerge時に自動でアプリを作成し、SlackでQRコードを共有する。

# 前提
– Bitrise のアカウントを持っている。
– `Distribution` のP12ファイルを持っている。
– `Ad Hoc` の `Provisioning Profile` が作成されている。

# 準備
1. アーカイブ時に使用される `Provisioning Profile` を `Ad Hoc` のものに設定する。
説明が面倒なので省略(そのうち追記するかも…)

2. `Slack` の `Webhook` の設定を行い、`Webhook URL`を取得する。
001.png
002.pngiOSアプリ申請リジェクト Apple Developer Program account under investigation

#下記の理由でアプリ申請がリジェクトされる

###We are unable to continue this app’s review because your Apple Developer Program account is currently under investigation for not following the App Store Review Guidelines’ Developer Code of Conduct.

###googleで翻訳すると、
お使いのApple Developer Programアカウントは、App Storeレビューガイドラインのデベロッパー行動規範に従っていないため、現在調査中のため、このアプリのレビューを続行できません。

###ネットで解決方法を調べると

– 2019年初期から同様の事象が多発している。
– 個人開発者によく起きる
– かつ、1つ目のアプリ申請で起きやすい
– ゲームアプリに起こりやすい
– Appleの調査中は、開発者は何も出来ない(別のアプリのアップデートもできなくなる)
– 調査期間は、半年以上と

元記事を表示

XCTest(Unit Test)で明示的に書かれていないいくつかの仕様

単体テストで画面遷移もやっちゃおう、と思って格闘したときの覚書です。

# アプリの起動はテスト実行時一回のみ行われる
テスト対象のアプリは、テストの実行時一回のみ行われます。

“`swift
@testable import app
“`

つまりAppDelegateは初回のテストケースで一度だけ走ります。
各テストケースでは走リません。

# デフォルトのテストケースの実行順序はクラス名順 -> テストケースメソッド名順
テストケースの実行順序は名前の順になります。
個人的にはクラスの中で、上から下に舐めていって欲しい気持ちがあったのですが、それは仕様みたいです。
テストケースの実行をランダムにするオプションはあるんですが、デフォルトは名前順。

基本テストケースの実行順序に依存するようなテストコードを書くな、というのはあるんでしょうけど、
何らか制約が生じてしまうときは、名前で縛るしかないのかなあという感じです。
たとえば`test_1_何かの確認`、`test_2_何かの確認`みたいな。

# あるテストケースでアプリに加えた変更は次のテストケースに引き継がれる
テスト

元記事を表示

Swift で UITextView の URL リンクを短縮表示させる。

# 0.はじめに

Swift で UITextView に表示される URL リンクを短縮表示させたかったので、やってみました。

ついでに、キーワード検索時の強調表示もできる様にしてます。

以下の記事を参考にさせて頂きました。

* [UITextViewにタップ可能なリンクを挿入する \- Qiita](https://qiita.com/shtnkgm/items/3c8b6b794219fbf087ba)
* [UITextViewで複雑なHighlightを表現する \- Qiita](https://qiita.com/rinov/items/da450d0ba9dffaaf8967)

感謝 ♪♪♪

?‍♂️?‍♂️?‍♂️

# 1.コード

今回は、UITextView の Extension として、`setAttributedText` という関数を追加しました。

パラメータの説明は、以下。

* `text: String` : [元となるテキスト文字列]
* `shortUrlMaxNum: Int = Int()` : [短縮されるURLの最大文字数

元記事を表示

【ARKit】3Dアニメーションの切り替え

# はじめに
状況に応じてアニメーションを切り替えたかったので、そのメモ。

# 実行環境
– Xcode 11.2.1
– [MagicaVoxel](https://ephtracy.github.io) 0.99.4
– [Mixamo](https://www.mixamo.com)

# やりたいこと
– iPhoneのミュージックなど、他のアプリでの音楽が再生/停止の検知。
– 再生中はキャラクタが踊り、停止すると踊りを止めるようにアニメーションを切り替える。
(昔あった玩具のフラワーロック的なイメージ)

[Mixamo](https://www.mixamo.com)で作るアニメーションは、1つの3Dモデルに1つのアニメーションを割り当てるので、座ってる状態(sitting.scn)と踊っている状態(swing.scn)の二つのシーンからnodeを取りだして、差し替えることでアニメーションを切り替えることにしました。

【座ってる状態(sitting.scn)】
![スクリーンショット 2020-02-25 0.46.45.png](https://qiita-imag

元記事を表示

RealmのschemaVersionの管理方法について考える

# RealmのschemaVersion
Realmのドキュメントの[マイグレーション項目](https://realm.io/jp/docs/swift/latest/#マイグレーション)で言及されている通り、Realmを扱う際には`Realm.Configuration`の引数である`schemaVersion`にモデルにアップデートがあった際に以前のバージョンよりも大きい値を設定する必要があります。なお、この値はマイグレーションなどの処理を行う際に必要となり、Realm内部で`oldSchemaVersion`(初期値0)よりも最新の`schemaVersion`が大きいか否かで自動的にマイグレーションされます。([データ移行](https://realm.io/jp/docs/swift/latest/#値の更新)の際は`migrationBlock`で移行処理を記述する)

# schemaVersionをどのように管理すべきか
### 方法1. モデルのアップデートを行う際に手元でschemaVersionをインクリメントする
個人的にオススメしません。複数人で開発してい

元記事を表示

4LIFE Innovations is bracing up to acquire iOS 13 for iPhone App Development

4Life Innovations is one of the leading iPhone app development companies in India, has a team of techno-savvy enthusiasts, who are always keen to adopt the latest technologies and trends.

We always love to stay updated with the latest tech events and upcoming technologies released by Apple. This time, iOS developers at 4Life Innovations are ready to grab information about the latest release, iOS 13. We’re updating more and more about all the latest iOS 13 versions and learn how to implement the

元記事を表示

iOSプロジェクト新規作成時によくやること一覧

自身のプロジェクト生成時によくやることを記載した備忘録です。
毎回お世話になるサイトをまとめました。

# CocoaPodsの導入
iOSのライブラリ管理ツールです。高確率で使用することが多いです。
類似でCarthageというSwift製のライブラリ管理ツールもありますが、
今回はpodsについてのみです。
https://qiita.com/ShinokiRyosei/items/3090290cb72434852460

CocoaPodsのバージョン違いで予期せぬエラーが発生することも過去にあったため、
バージョンは開発チームで揃えておいた方が安心です。
任意のpodsバージョンのインストール/アンインストールは以下を参考にしています。

CocoaPodsの任意のバージョンのインストールとアンインストール

CocoaPodsのファイルを編集する際にviコマンドも調べることが多いので、
以下のリンクにviコマンドについて記載されています。
https://qiita.com/pe-ta/items/0510bee10bcfd88afeee

# Podsを用いてRealmSwift

元記事を表示

OTHERカテゴリの最新記事