iOS関連のことを調べてみた2019年12月05日

iOS関連のことを調べてみた2019年12月05日
目次

RailsエンジニアがReactNativeエンジニアになるにあたって苦しんだところワースト3

![top.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227429/b61cebb7-f2a4-79c0-a694-f48e993cfb1f.png)

# はじめに

こんにちは、株式会社OKANで「おかんPay」というプロダクトのPdMをしながらも、自らバリバリReact Nativeで実装している [かなすぎ](https://twitter.com/OKanasugi) と申します。
元々は、RailsでOKANの社内システムを構築していたサーバーサイドエンジニアだったのですが、志願してReact Nativeを使うアプリエンジニアになってから約半年が立ちました。
そこで、RailsエンジニアがReact Nativeを扱うアプリエンジニアになる時に苦しんだ箇所をまとめることで、自分と同じようにReact Nativeを新たに勉強する人の助けになればと思いながら記事を書きました。

# 想定読者

– Railsエンジニアだが、これからReactNativeアプリもつくってみたいなって思って

元記事を表示

|Swiftでバイナリ???を扱う?!>? 

Swiftでバイナリファイル扱うことはそんなに頻繁にはないと思うのですが、
案件の中でAndroidチームの人が、巨大なJSONファイルをバイナリに圧縮して処理していて、
iOSアプリでも同じようにできるんじゃないかということで、バイナリを扱うことになったので、その知見を残します。

なお僕がやりたかったのは、倍精度浮動小数点数(漢字多すぎですよね)のバイナリファイルを、
Swift上でDouble型の配列に落として使いたい、というのがゴールでした。

※バイナリの絵文字として01が出したかったのですが、?しかなかったので、仕方なく?を使っています。

# x進数のリテラル
バイナリファイルを扱う前に、Swiftのリテラルを確認しましょう。

[2.1.7. 数値リテラル | 基本 | Swift](https://www.studiogalago.com/the-swift-programming-language/language-guide/the-basics/numeric-literals/)

“`swift:x進数
let decimalInteger = 17
le

元記事を表示

SwiftUIアプリ開発実践ポイント

こんにちは、[たなたつ](https://twitter.com/tanakasan2525)です :cat:

SwiftUIが発表されて半年ほど経ちましたね。あっという間に時間は過ぎていき、iOS 13以降じゃないと使えないし、まだ気にしなくていいでしょなんて言ってられなくなるのもあっという間な気がします。

iOS Advent Calendarの5日目ということで今回は、いくつかSwiftUIでサンプルアプリを作ったり、実際にアプリをリリースしたりした中でたまってきた知見を書こうと思います。

SwiftUIは様々なプラットフォームで動きますがiOSアプリに注目し、開発する前に知っておきたい実践的なポイントなどを共有します。

※ Xcode 11.2.1、iOS 13.2.1 での動作を元に記事を書いています。

# SwiftUIの特徴

– 少ないコードでUIを作れる (コードレイアウト)
– 宣言的に記述できる
– Appleのすべてのプラットフォームで動く
– ただし、iOS 13、macOS 10.15、tvOS 13.0、watchOS 6.0以上

元記事を表示

[iOS] Bitriseのキャッシュをできるだけ生かしてCI / CDの高速化を図る

#はじめに
この投稿は[CyberAgent Developers Advent Calendar 2019](https://adventar.org/calendars/3981) 4日目の記事です!

本日はTapple iOSチームに今年加入した、19新卒の @nade が担当します。

今回はTappleのiOSアプリのCIのワークフローをキャッシュをなるべく生かす設定に変えることで、
Bitriseのワークフローを **40%〜50%** ほどの高速化に成功した話を書きたいと思います。

# 高速化前後のワークフロー
現在チームではBitrise上でテストを自動化しています。
ざっくり下記のようなワークフローです。

– リポジトリのクローン
– Homebrewパッケージのインストール(Xcodegen, Linterなど)
– Gemパッケージのインストール(xcov, CocoaPods, danger, fastlaneなど)
– Cocoapodsのインストール
– テストの実行

下記は高速化前のワークフローの実際のサマリー(最後に表示される実行時間)です。

元記事を表示

日本語で書かれたLocalizable.stringをGoogle Translation APIで翻訳してstructファイルを自動作成するツールをgolangで作る

## はじめに

以前Qiitaの記事でも書いた「[Go言語でiOS開発ツールを作成する:Localizable.stringsファイルからenumを生成する](https://qiita.com/BlueEventHorizon/items/88dcea8ceeec2a07f351)」というツールを拡張して、

「日本語で書かれたLocalizable.stringをGoogle Translation APIで翻訳してstructファイルを自動作成するツールをgolangで作る」

ことに挑戦してみました。

“`
挑戦結果のGitHubリポジトリーはこちら
https://github.com/BlueEventHorizon/EnumGenerator
“`

## 結果

例えば下記のようなLocalizable.stringがあったとすると、

“`
“あなたの心が正しいと思うことをしなさい。どっちにしたって批判されるのだから。” = “あなたの心が正しいと思うことをしなさい。どっちにしたって批判されるのだから。”;
“前進をしない人は、後退をしているのだ。” =

元記事を表示

iOS13以降でPush通知が届かなくなってしまったので調査した件について

人生で初めてQiitaに投稿します。
めっちゃ緊張してます。
Qiitaの文字3回うち間違えました。

なお、この記事の元ネタはもともと私が書いていたブログに書いていたものをリライトしたものです。

リライトしているのでこちらの方まだ読みやすいのはわかってますが、それでもほんのちょぴっとでもブログの方を覗いてもらえると嬉しいです。
https://yara-shimizu.com/2019/10/05/ios-ver13/

# iOS13になってPush通知が届かなくなってしまった??
タイトルの通り、iOS13にPush通知が届かなくなったので調べました。

## 環境
Mac Mojave 10.14.6
xcode 11(おそらく10以下でも発生する)
iOS 13.4.1
Objective-C

## 現象
・iOS12以前は正常にPush通知が送れている
・iOS13以降でのみ通知が届かなくなった

## 原因
これが100%原因かどうかはソースを見ないとなんとも言えないですが、私の場合はトークンを取得する次のコードの「description」が原因でした。

“`ob

元記事を表示

FirestoreのArrayContainAnyクエリでタイムラインを実装してみた

## はじめに
初アドベントカレンダー!!

普段はiOS開発のインターンをしながら、個人でコツコツアプリを作ったりしております。

今回はFirestoreのアップデートでArrayContainAnyというQueryが追加され、どうやらタイムライン実装で活躍してくれそうで、自分なりにやってみたので記事にしてみました。

※ 間違えている点や、改善点などございましたらコメントかTwitter(https://twitter.com/yuto_nakano44)
にご連絡いただければ幸いです

## ArrayContainAnyクエリとは
こちらの記事がとても分かりやすかったので詳しくはこちらをみていただけると!↓
https://medium.com/anti-pattern-engineering/待ちに待ったfirestoreにarray-contains-anyとin検索がキタ-1771cbc14724

使い方としては、newsコレクションのsports配列にbasketBallが要素として含まれているドキュメントが欲しい!
となれば下記のようになります↓

“`sw

元記事を表示

Makefileを利用してiOS開発を賢く便利に運用しよう?

## はじめに

[VALU Advent Calendar 2019](https://qiita.com/advent-calendar/2019/valu) 4日目の記事です!
VALU 社として記事を書きたい! と名乗りを上げて2年目になりました。ことしもよろしくおねがいします!

今回は「Makefile を利用して iOS 開発を賢く運用しよう」ということで,`Makefile` の補完機能を用いまして,チームメンバーが快適に,かつ本質に集中できる環境を維持することのできる試みのご紹介です。

## 目次

– [Makefile との出会い](https://qiita.com/YutoMizutani/items/6eea2ffac577ff481039#makefile-%E3%81%A8%E3%81%AE%E5%87%BA%E4%BC%9A%E3%81%84)
– [Makefile によるスクリプト管理は何が嬉しいのか](https://qiita.com/YutoMizutani/items/6eea2ffac577ff481039#makefile-%E3%8

元記事を表示

【Objective-c】AutoLayoutで位置を決める

UIButton、UILabel等はstorybord上で、位置を指定して配置できますが
コード上でもAutoLayoutを使用して位置を指定することができます。

“`
-(void) button_autolayout:(UIButton *)button top:(int)top left:(int)left right:(int)right bottom:(int)bottom {
//AutoLayoutを使用することを指定
[button setTranslatesAutoresizingMaskIntoConstraints:NO];

// 上 位置指定
NSLayoutConstraint* topAnchor = [button.topAnchor constraintEqualToAnchor:self.view.topAnchor constant:top];
// 左 位置指定
NSLayoutConstraint* leftAnchor = [button.leftAnchor constraintEq

元記事を表示

RxSwift MVVM における ViewModel 設計

自分は RxSwift で ViewModel はどうやって設計していくか下記三つ分けて書いていこうと思います。

– Immutable
– テストのしやすさ
– プロトコルの読み取りやすさ

## Immutable

– 可変を避けるため struct を使う。
– Observable, PublishSubject など値が流れ流けど不可変にする。
– Protocol には var で定義されるが、struct では let で宣告します。

## テストのしやすさ

テストしやすく、 mock しやすくするため、 外部リソースはできれば全て DI できるようにします。
例えばデータ処理、API 叩きなどが書いてある struct や class らはコンストラクタの引数で渡します。
そして、 ViewModel 自身の中身に、全域的なオブジェクトやクラスを直接使用すること、できればしないようにします。

## プロトコルの読み取りやすさ

– インプットとアウトプットを分けて定義する

### RxSwift コンポーネントの使い分け

– インプットは Publis

元記事を表示

apple好きやiOSエンジニアが活用したいよく見る情報リソース

Androidも大切だが、iOSアプリなどは特にレギュレーションが変わったり仕様の変更が激しい。
そんな中で随時情報を追いかけるのは大切なことなので個人的に定期的に参考にしている情報リソースのメモです。
そしてapple好き・ガジェット好きとしての趣味も含まれる。そんな方にオススメ。

## [iPhone Mania](https://iphone-mania.jp/)
その名の通りiPhoneマニア
apple関連のニュースや、レギュレーションの変更、リーク情報、iPhoneの便利機能など満載

## [カミアプ](https://www.appps.jp/)
iPhoneの小技やニュースなど

## [gori.me](https://gori.me/)
iPhone/iPad/Macbookの使い方や最新ニュースなど

## [Akiba PC Watch](https://akiba-pc.watch.impress.co.jp/)
秋葉原のショップでapple商品のオトクな入荷情報など
ガジェット好きにはおすすめ

## [ITmedia News](https://www

元記事を表示

【Swift】Arrayからユニークな順序付きリストへの変換を超絶シンプルに書く

# SwiftでArrayから重複なしの順序を保ったままのリストを生成したい!
と思って調べてみると、この辺の記事が参考になりますが、reduce()を使って愚直に全てをなめていく実装が散見されます:eyes:

– [swiftで配列のユニーク – Qiita](https://qiita.com/shou8/items/fb1ef9e738f637726c76)
– [配列から重複要素を削除する – Qiita](https://qiita.com/sgr-ksmt/items/157e4c6e390944237253)

今回はもっとスマートさを求めてシンプルに書けないか考えていきます:muscle:
(よりシンプルに書くことに特化しているのでパフォーマンスは気にしてません:yum:)

# Setは使える?
SwiftにはSetがあります。が、答えはノーです。
なぜなら、Setは重複しない順序を持たないリストだからです。
やってみます。

“`swift
let array: [String] = [“hoge”, “fuga”, “hoge”, “piyo”, “piy

元記事を表示

[はじめてのiOSアプリ]xcodeで地図アプリを作成(その6)

# はじめに

iOSアプリを作ってみたいけど
何から始めて良いのかわからない

とりあえず、
「やってみました」記事を参考に
地図アプリを真似てみようと思う

という記事の6回目です。

今回は、拡大・縮小ボタンを追加します。

– ピンチイン・アウトあるから、拡大・縮小ボタンは不要では?
– Simulatorでピンチアウト(Ctrl+Option+Click)するのは直感的じゃなく忘れがちじゃない?
– 直感的なボタンがあれば、ピンチアウトの操作を忘れても影響ないから
– 「やってみました」記事だし、ボタンを配置してみたかったから

# ボタンを追加
1. ボタンを配置
– [Main storyboard]を表示する
– 【なぜ?】
– [MKMapView]の上にボタンを配置する前準備
– メニューから[View]-[Show Library]を選択、表示されるウインドウで [button] と入力し [Button]を絞り込む
LibButtonItem.png

元記事を表示

【iPadOS13/Xcode11対応】画面が全画面で表示されなくなってしまったのでその対応を行った(Xcodeのキャプチャ付き)

# はじめに
iOSアプリ(iPad前提)開発中に、iOS12からiPadOS13(Xcode10から11)に上げたことで、**もともと全画面で表示されていた画面が、中央に小さく表示される**ようになってしまいました。

本記事ではその時の対応方法(「segueの設定による対応」と「コードによる対応方法」の2種類)を記載します。

# 前提
– Xcode Version 11.2
– iPadOS13

# 対応前の画面表示
画面の遷移先がこのように中央に小さく表示されてしまいます。

![スクリーンショット 2019-12-04 8.51.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145054/c13a4f6e-64d5-6b1e-b176-54a5cce846c7.png)

# 対応方法
iOS12(Xcode10)の際にSegueで画面遷移を行っていた箇所は「**対応方法1:segueの設定による対応**」で、コードで画面遷移を行っていた箇所は「**対応方法2:コードによる対応*

元記事を表示

Appleの機械学習がヤバい

近年、機械学習はさまざまな分野で利用され注目を高めてきました。また、Firebaseをはじめてとした様々なクラウドサービスで手軽に利用できるほど便利なものになりました。そんな中、今年発表されたAppleの機械学習フレームワークCoreML3がすごかったため、今回CoreML周辺の情報を簡単にですがまとめてみました。

## CoreMLとは?
Appleが2017年に発表した機械学習を扱うためのフレームワークであり、今年新たにCoreML3という名前で強力な機能の追加がなされた。機械学習モデルの仕様はオンデバイスで完結させることができ、さらに`CreateML`というFrameworkを使い機械学習モデルを超簡単に作成することが可能。モデルを作成するためのCreateMLアプリは[こちら](https://developer.apple.com/machine-learning/create-ml/)
下記の画像でCoreMLの上位レイヤー部分にあたるフレームワークがCoreML3にのFeatuesです。

【XCUITest】UITextFieldの値の削除と入力(iPadOS13/Xcode11対応)

# はじめに
iOSアプリ開発でXCUITestを実装しており、その際に、「UITextFieldの値を削除し、そこに新しい値を入力する」という処理が必要になりました。
stack overflowのこちらの記事( [UI Test deleting text in text field](https://stackoverflow.com/questions/32821880/ui-test-deleting-text-in-text-field) )を参考に、XCUIElementのExtensionでclearAndEnterTextを作成することでiOS12(Xcode10)では期待通り動いていたのですが、iPadOS13(Xcode11)に上げてからUITextFieldの値が削除されなくなってしまったので、その対応を行いました。その対応方法を記載します。

# 前提
– Xcode Version 11.2
– iPadOS13

# iOS12(Xcode10)では期待通りに動いていたclearAndEnterText
[UI Test deleting text i

元記事を表示

【iOSアプリ開発メモ】JSON Serverを使ってiOSアプリ開発する時のATS無効化手順(Xcodeのキャプチャ付き)

# はじめに
まだ完成していないWebAPIを利用してiOSアプリ開発を行う必要があり、その際、ローカルPCにAPIモックサーバー(Node.jsのJSON Server)を立てて開発を進めました。
通常だとiOSアプリは**ATS(App Transport Security)によりHTTP通信が利用できない**ため、上記作業を行う際に「**ATS無効化の設定**」を行いました。本記事では、その時の手順をXcodeのキャプチャ付きでメモしておきます。

# 前提
– Xcode Version 11.2
– iOSアプリからは「localhost」でAPIサーバーへアクセスする
– (下記のXcodeのキャプチャはSingle View Appでprojectを作成した直後の状態)

# ATS無効化手順(1から8まで)
1. XcodeでInfo.plistを開く
![スクリーンショット 2019-12-04 4.08.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145054/a1b9a9

元記事を表示

[iOS] アプリクラッシュでリジェクトされた際のクラッシュレポート復元方法

# はじめに
iOSアプリのストア申請時、アプリがクラッシュするとリジェクトされますよね。
そこで添付されたクラッシュログを復元する方法に手間取ったので、どのように解決したかを紹介します。

# なぜ手間取ったか
調べると、dSYMからクラッシュログを復元する方法はたくさん出てきます。
私の環境では、CIでビルドからAppStoreConnectへのアップロードまで行っていた為、dSYMはAppStoreConnectからダウンロードしていました。
そのdSYMとアップルが送ってくれたクラッシュログの紐付けうまくいかず、手間取ってしまいました。

### 一般的には
クラッシュログ(xxx.crash)と、予め保存しておいたdSYM(アプリ名.app.dSYM)を、`symbolicatecrash`に食わせてやると、復元できます。

### 私の環境
AppStoreConnectからダウンロードしたdSYMは、`appDsyms.zip`というZIPファイルで、解凍すると中には`[ランダムな文字列?].dSYM`というファイルが多数入っています。
つまり、dSYMが複数あるような状

元記事を表示

【Xcode】複数プロジェクトでのソースの共通化

#複数のプロジェクトでソースを共通化する

Xcodeは英語だらけなのでシェアしておく

##共通化とは
ここでいう共通化は参照のことです。
元となるAというプロジェクトのソースを、他のプロジェクトBから参照する方法です。

##やり方
1. 参照先のプロジェクトを開く
2. ProjectNavigatorに参照元のプロジェクトから参照したいファイルをドラッグ&ドロップ
3. コピーするか参照するかを選択するダイアログがでるので「Create folder reference」にチェックをいれてfinishを押す
4. これで参照の設定が完了です。

ソースをいじった場合に、参照されているすべてのプロジェクトで変更がかかるようになります。
プロジェクトを複製してコピーアプリを作成する場合などに使いましょう。

元記事を表示

iOSで開発/本番環境を分けてFirebaseを運用するTips

iOS Advent Calendar 2019の4日目の[@shtnkgm](https://twitter.com/shtnkgm)です!

本記事ではiOSで開発/本番環境を分けてFirebaseを利用するTipsを紹介します。
環境を分けて利用したいユースケースは以下のようなものが挙げられます。

– **開発/本番環境によって運用者を分けたい**
例)開発環境と本番環境を利用するチームが異なる

– **開発環境を本番環境と区別することで本番環境に影響なく開発をしやすくしたい**
例)テスト時に開発環境へのPush通知を間違って本番環境に送らないようにしたい

– **本番環境の計測数値に開発時のものが含まれないようにしたい**
例)AnalyticsやPerformance Monitoring, Crashlyticsの分析精度を高めたい

# 実現方法

## Firebaseで開発/リリース環境を分ける

まずはFirebase側の環境を分ける必要があります。Firebase側の環境を分けるには、以下のいずれかの方法で実現できます。

– F

元記事を表示

OTHERカテゴリの最新記事