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

iOS関連のことを調べてみた2020年03月03日
目次

FlutterとFirebaseで開発した 英語の瞬間翻訳トレーニングアプリ Lala の技術

どうも、[shohei](https://twitter.com/hobbydevelop)です。

大阪在住のフリーランスエンジニアです。現在はFlutterやReact Nativeを使ってプロダクト開発をしています。

今回はFlutterとFirebaseで開発した英語の瞬間翻訳トレーニングアプリ Lala の技術を紹介します。

アプリはこちらからダウンロードできます(無料でご利用できます)。

・iOS
[https://apps.apple.com/jp/app/id1493691416](https://apps.apple.com/jp/app/id1493691416)

・Android
[https://play.google.com/store/apps/details?id=com.gmail.hukusuke1007.lala](https://play.google.com/store/apps/details?id=com.gmail.hukusuke1007.lala)

## 概要

まずはLalaの概要を紹介します。アプリストアの情報をそのまま

元記事を表示

エンジニアがデザインを正確に確認する方法

# 背景
自分はiOSのエンジニアである。

UI周りの実装を行うときには、デザイナーからデザインデータをもらい、デザインツールでMarginやFontなどを確認しながらデザイン通りに実装を行う。実装が終わったら自分で再度デザインが間違っていないかを確認して、最後にデザイナーに確認してもらう。

しかし、デザイナーの確認のときに高い確率で「元のデザインとここが違うよ〜」ってデザイナーから指摘を受けて修正を行うことが多い。

例えば、「LabelのTextのlign-heightが違う」や「アイコンのbaseLineが少しずれている」などである。デザインデータは細かく見ているつもりだが、見落としてしまうことがある。。。

何度もデザイン確認を行っていたら、実装とデザイナーの時間が勿体ない。

## 書くこと
**エンジニアがデザインを正確に確認する方法について**

# 方法
**デザインデータと実装したスクリーンショットを合わせて、違いがないかを確認する!!**

## 例
赤色の枠のCellを実装する。([元データ – figmaresources](https://www.figm

元記事を表示

【SwiftUI】1-2 Building Lists and Navigation を噛み砕いていく【チュートリアル】

実行環境

– MacOS 10.15.3
– Xcode Version 11.3.1

最初の章「SwiftUI Essentials」は以下の3章からなってます
– Creating and Combining Views
– **Building Lists and Navigation (今回)**
– Handling User Input

今回はAppleさんがスタートファイルを用意してくれているので、プロジェクトファイルをダウンロードして「starting point -> 〜.app」から始めてください
スクリーンショット 2020-02-24 22.48.49.png

**該当ページからプロジェクトファイルをダウンロードしないと、できない演習がありますので、毎回必ずダウンロードし

元記事を表示

Multipeer ConnectivityによるiPad間通信で早押しボタンを作った

#概要
2チーム対抗クイズイベントのために、早押しボタンのiOSアプリを簡単に実装しました。
二台のiPadを用いて、各チームがiPadを早押しボタンとして使います。

iOS端末間のP2P通信を可能にするフレームワーク、Multipeer Connectivityを用いています。
回答ボタンを押した時の時間を端末間で通信し、正確なタイミング判定を実現しました。

画面に出ている数字はスコアカウンターです。

元記事を表示

Objective-CからSwiftへの移行でfailed to emit precompiled header ‘(略)/MyprojectName-Bridging-Header-swift_xxx.pch’ for bridging header ‘(略)ModuleName-Bridging-Header.h’

先週発生してマジで会社辞めようかと思いましたが、なんとか解決しました。
とにかく情報なくて辛かったので、書いておきます。

# 作業内容
Objective-CのClassをSwiftに書き換えるリファクタリングをしていました。
下記の作業内容をしました。

1) 移行先のSwiftのStructを一旦別名で作成
2) 移行先のClassと同名のStructを作成して、1)の記述内容をコピー
3) 1)と移行先のClassを消す
4) ブリッジヘッダーやその他Objective-Cヘッダから消したクラスに関する記述を削除
5) 必要に応じてObjective-C側に記述を追加

# エラー内容
ビルドしようとしたところ、下記のコンパイルエラーで先に進めなくなりました。
Clean BuildやXcodeの再起動、なんならMacBookの再起動までしましたが、ダメ。

“`swift
failed to emit precompiled header ‘/Library/Developer/Xcode/DerivedData/MyprojectName-lajanjvhqjnfjksd

元記事を表示

【iOSアプリ】Guideline 1.1 – Safety – Objectionable Content / 名実ともに糞アプリ【AppStore審査】

#ガイドライン1.1-安全性-不快なコンテンツ
いつもなら4.2.2 **「4.2.2 – Design – Minimum Functionality」**リジェクトを頂くのだが、今回はそれに加えて初の**「1.1 – Safety – Objectionable Content」**を頂いた。
初めてのことだったので検索してみたら、どうも不適切な表現などを含む場合に適応されるガイドラインらしい。

##証拠写真が添付されていた。
不適切なコンテンツなど含むようなアプリは作っていないので何かの間違いだと思ったが、画像が添付されていたので確認してみると

**「○○○」**(ひらがな3文字ですが、伏せ字にしときます。)

というテキストが表示されている画像が添付されていた。

チャットできる機能があるアプリで、そこの画面にデバッグ時にやりとりしたデータが残っていたのだ。
審査前のチェック時には問題なかったのだが、審査提出後にチャット機能を使って遊んだ人がいたらしい。
そしてそのチャットの文面に前述のNGワードが入っており、そこの場面を激写されたという訳だ。

完全にこちらのミスだが、下

元記事を表示

【Swift】Structでもmutatingじゃないメソッドなら再帰できる

気付き、ですね。

# 思い込み
https://stackoverflow.com/questions/36080491/swift-struct-type-recursion

この辺を見て、Swiftで再帰する=クラスを使わなければいけない(Enumは再帰Enumがある?)と短絡的に思っていました。

# 気付き
しかし再帰のときに問題なのは、mutatingなメソッドであって、immutableなメソッドなら再帰できることに気付きました。

# つまり
“`swift
struct Some {
func some(input: String) {
let word = input
if word != “これで終わりや” {
print(word)
some(input: “これで終わりや”)
} else { print(“returnするで”); return }
print(“終わるで”)
}
}

Some().some(input

元記事を表示

iOSアプリ開発 デザインパターン入門を読んで

# 目次

第1章 前準備 ~おすすめ書籍
第2章 前準備 ~オブジェクト指向とは
第3章 前準備 ~プロトコル指向とは
第4章 前準備 ~入門書には書かれていないが重要なiOS開発Tips
第5章 Model View Controllerデザインパターン
第6章 MVCでタスク管理アプリを作ろう
第7章 Model View ViewModelデザインパターン
第8章 MVVMでGitHubクライアントアプリを作ってみよう

# 第1章 前準備 ~おすすめ書籍
学習者のレベル別で技術書を紹介している。

# 第2章 前準備 ~オブジェクト指向とは
オブジェクト指向、継承の概念を図を使って解説していて、初心者の方には分かりやすいだろうなぁと思いました。
継承のメリット、デメリットに関しても説明されており、再確認できてよかったです。

# 第3章 前準備 ~プロトコル指向とは
オブジェクト志向のデメリットを何がデメリットかをはっきりさせて解説した上で、そのデメリットをプロトコル志向がどう解決したか解説されていて、理解しやすかったです。

# 第4章 前準備 ~入門書には書かれていないが

元記事を表示

SwiftUIで作るドラえもん【顔編】

# はじめに
日曜日で暇なので, SwiftUIを使ってドラえもんを作ってみました.

この記事で完成するドラえもんは以下の画像です.
口を開けているドラえもんは難しそうなので断念しました.
かなり近く本物に近くないですか?笑

スクリーンショット 2020-03-01 20.37.49.png

さぁ作って行きましょう.

# 土台づくり
まず,以下の画像のような土台となる青の円とその中にある円から作って行きましょう.
ドラえもんって意識してませんでしたが,地味に楕円なんだと感じました.
確かによくよく見たら楕円なんですよね.

以下コードです.

“`swift:ContentView.swift

struct base: View {
var body: some View {

元記事を表示

[Xcode]ディレクトリをターミナル にドラッグ&ドロップすれば絶対パスが表示される

Project Navigatorのgroupからターミナル にドラッグ&ドロップすればgroupまでの絶対パスが表示されます。

スクリーンショット_2020-03-01_11_15_51.png

## こういう時に便利
– Xcodeを開いていてさくっとルートディレクトリにファイルを作りたいとき。
– `Podfile`や`Cartfile`など

このままではルートディレクトリでは無いので先頭のパスを消す必要があります。

“`
$ cd /Users/[UserName]/iOS/[Project Name]/[Project Name]⬅︎先頭のパスが不要
“`

元記事を表示

Google Maps iOS Utils でマーカーをまとめて表示する

Google Maps SDK を使用していてマップ上にマーカーを立てることはよくあると思います
ただ、マップ上にマーカーをたてすぎると、広域表示にした際にマーカーが密集しちゃって見辛くなってしまうってこともよくあると思います

そんな時マーカーを1つにまとめたいなーと思ったので、その実装方法を残しておきたいと追います

![GrWyuKwR.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53717/1adb1bac-7d9e-de26-b807-cc4172bfaedf.gif)

# 開発環境
Xcode:11.1(11A1027)
Swift 5
iOS:13.1
CocoaPods: 1.8.0

# 実装

## ライブラリのインストール
Google Maps iOS Utils をインストールするために CocoaPods を使用します
以下のように Podfile を編集し、 `pod install` を実行してください

“`
target ‘YOUR_APPLICATION

元記事を表示

Debug areaにerror: module importing failed: Missing parentheses in call to ‘print’. Did you mean print(‘Whoops! You are missing the <' + arg.argName + "> argument.’)? (fbildb.py, line 98), File “temp.py”, line 1, in と表示されるとき。

Debug areaにいつのまに次のエラーが表示されるようになった。
スクリーンショット 2020-03-01 1.16.34.png

## 環境
Xcode11.1
Swift5.0
chisel 1.8.1

## 結論
上記のエラーは`chisel`を利用していたため、起きたものでした。
Xcode11ではエラーがあるとissueがあがってました。

– [Xcode11 error: module importing failed: Missing parentheses in call to ‘print’ · Issue #272 · facebook/chisel](https://github.com/facebook/chisel/issues/272)

`v2.0.0`では解決されているとの

元記事を表示

CustomCellに値を代入したときにFatal error: Unexpectedly found nil while implicitly unwrapping an Optional value: custom cell: file xxxというエラーが出た

nibで作成したCustom cellに値を入れようとした時に次のエラーが出ました。

“`
Fatal error: Unexpectedly found nil while implicitly unwrapping an Optional value: custom cell: file xxx
“`

## 結論

– tableViewのregisterメソッドが間違っていた。

“`:before
tableView.register(UserSearchCell.self, forCellReuseIdentifier: UserSearchCell.className)
“`

“`:after
tableView.register(UINib(nibName: UserSearchCell.className, bundle: nil), forCellReuseIdentifier: UserSearchCell.className)
“`

cellをコードで実装している時は`before`が正しくて、cellをnibで作成した時は`after`でテー

元記事を表示

*** Terminating app due to uncaught exception ‘NSInternalInconsistencyException’, reason: ‘-[UIViewController _loadViewFromNibNamed:bundle:] loaded the “xxx” nib but the view outlet was not set.’というエラーがでたとき。

## 概要
イニシャライザでnibを呼び出す時に次のようなエラーが出た。

“`
*** Terminating app due to uncaught exception ‘NSInternalInconsistencyException’, reason: ‘-[UIViewController _loadViewFromNibNamed:bundle:] loaded the “xxxViewController” nib but the view outlet was not set.’
“`

“`:init()
init() {
super.init(nibName: UserSearchViewController.className, bundle: nil)
}
“`

loadViewで呼び出した時はこのエラーがでなかった。

“`:loadView()
override func loadView() {
guard let view = UINib(nibName: “UserSearchViewControll

元記事を表示

Library not loaded: @rpath/Flutter.framework/Flutter

– 内容:
Flutterでアプリを作成し、実機で確認をしようとした際に、
下記のエラーが発生したため、実機での確認ができませんでしたので、
情報共有させていただきます。
※情報の判断はご自身の責任でお願い致します。

`dyld: Library not loaded: @rpath/Flutter.framework/Flutter`

– 環境:
Xcode 11.3
iPhoneX(iOS13.3.1)
iPhone5S(iOS10.3.2)

– 結果:
[本家サイト](https://github.com/flutter/flutter/issues/49504)に追記がありました。特定の条件の場合、エラーが出てしまうようです。
– signing identity profile
– iOS13.3.1
ですと、ダメなようです。

iPhone5S(iOS10.3.2)では、実機で実行されることを確認致しました。

以上となります。?

元記事を表示

iOSアプリの審査状況変更を、Slackに自動通知する(GAS + Slack Webhook)

iOSアプリの審査状況(ステータス)は、iOSアプリ開発に関わる方なら誰もが気になることですよね。
[AppStoreConnect](https://apps.apple.com/jp/app/app-store-connect/id1234793120)はリアルタイムで審査状況に関する通知を受け取ることができるため、こちらのアプリを使っている方は多いと思います。

今回は、Slackのチャンネルにも審査状況を伝えたい方のために、GASとSlack Webhookを使用して自動的に通知を行う方法を記載します。

# 仕組み
アプリの審査状況は、AppStoreConnectに登録してあるメールアドレスに対して、メールで通知させることができます。
また、Appleからのメールは定型文となっており、審査状況に応じてメールの件名が決まっています。
例.

– アプリ申請済み、審査待ち -> `[アプリ名], is now “Waiting For Review”`
– アプリ審査中 -> `[アプリ名], is now “In Review”`
– 配信準備完了 -> `[アプリ名], i

元記事を表示

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

元記事を表示

OTHERカテゴリの最新記事