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

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

【SwiftUI】外部APIを叩いて取得した結果をListに表示する

## はじめに

そういえば Apple の SwiftUI のチュートリアルには,
通信して取得したデータを表示する系のチュートリアルがなかったな
ということで SwiftUI の勉強会の LT 発表ネタにしようと思って
サンプルアプリを作ってみることにしました。

何を題材にしよう?と考えて,
勉強会なので connpass のイベントサーチAPI 使おうと決めました。

Enjoy SwiftUI vol2 で一部ライブコーディングした内容です。

## ObservableObject と ObservedObject

SwiftUI の View 周りの実装だけやるのであれば不要な知識なのですが,
データが絡まないことは実際のアプリだとほとんどないですよね。
ちょっと敬遠してた `ObservableObject` と `ObservedObject` を
確認することにしました。

### ObservableObject
`ObservableObject` はプロトコルでこのプロトコルに準拠すると
そのクラスはイベントが発行できるようになる。

例えば `ViewMo

元記事を表示

iOS13+のSafariでdevicemotionやdeviceorientationイベントの許可を取得する方法

iOS 13〜 の モバイル Safari では、端末の傾きや加速度などの情報を提供する DeviceMotionEvent や DeviceOrientationEvent を取得する際、ユーザーの許可が必要になりました。

実装に少し手間取ったのでまとめておきます。

## 注意点
### HTTPSであること
HTTPS通信であることが求められます。
開発環境の準備が面倒な場合は、Chromeで開発を進めるといいかもしれません。

### ユーザーのアクションが必要
ページ表示直後にいきなり許可を取得することはできません。
ボタンなどを設置してユーザーにクリックしてもらってonClickなどを発火させてから許可を得る必要があります。

### iOS 12.2 ではこの方法は使えない
iOS 12.2 ではユーザーがSafariの設定を変更しない限りイベントを取得できないという悲しい仕様です。

設定 > Safari > 「モーションと画面の向きのアクセス」の設定項目が追加されており、デフォルトでOFFになっています。

そのため iOS 12.2 では、ユーザーにこの設定をO

元記事を表示

FlutterでiOSをTestFlightにアップロードすると、 `ITMS-90338: Non-public API usage ` のエラーとなる問題

件名の通り
TstFlightにアップすると、下記のようなエラーメールが飛んできた

“`
ITMS-90338: Non-public API usage – The app references non-public symbols in Frameworks/Flutter.framework/Flutter: _ptrace. If method names in your source code match the private Apple APIs listed above, altering your method names will help prevent this app from being flagged in future submissions. In addition, note that one or more of the above APIs may be located in a static library that was included with your app. If so, they must be removed. For f

元記事を表示

【Xcode】メモリアドレスかViewの情報を取得

Xcodeのデバックコンソールで以下を記載
`po unsafeBitCast(0x1234567890ab, to: UILabel.self)
`

元記事を表示

アプリのMVPパターンについて

# 経緯
プロジェクトでAndroidとiOSを同時期に開発することになりました。
同じアプリだから挙動や仕様も合わせた方がいいよねという話をして、
Android、iOS両方で実績のあるパターンでかつ、メンバーの学習コストが少ない
アーキテクチャパターンを調査・検討することになりました。

いくつか候補が上がった中で、
MVPがiOSではデフォルトだし、Androidでもよく使われるパターンの一つなので、
まずはこれで行きたいという話になりました。
(AndroidではMVVMがいいかなぁと思いつつ、AndroidでもMVPでできないことはないので、
比較的わかりやすいMVP(PassiveView)で行くことに決まりました)

# 参考書
– [Android アプリ設計パターン入門](https://peaks.cc/books/architecture_patterns)
– [iOSアプリ設計パターン入門](https://peaks.cc/books/iOS_architecture)

この2冊を参考にそれぞれのOSでどう設計するかを検討しました。
ご存知の方も多いかも

元記事を表示

【Swift】GoogleMapsSDKを使ってアプリを作ってみてわかったこと

#概要 
スマートチャンネル/プログラミングさんの動画を参考にして、アプリを作成しました!
【プログラミング】swiftで現在地付近のお店を探すiPhoneアプリを作ろう ~ GoogleMaps編 #40(https://www.youtube.com/watch?v=GWSD8LDBrbM)

今回は、こちらの動画を視聴したことで
・わかったこと
アプリを作成する上で
・気になって調べてわかったこと
をまとめました!

#動画を視聴してわかったこと
1.CocoaPodsのインストール方法
Macのターミナルで以下のコマンドを実行して、インストールできる。

“`
sudo gem install cocoapods
“`
2.Podfileの作成方法
ターミナルで以下のコマンドを実行し、PODの雛形の設定ファイルである「podfile」を作れる。

“`
pod init
“`

#気になって調べてわかったこと
1.SDKとは
SDK(Software Development Kit)とは
>ある、システムに対応したソフトウェアを開発するために必要なプログラムや技術文書

元記事を表示

【WKWebView】UserAgentの取得方法

“`swift:
var webView: WKWebView? = WKWebView()
webView.evaluateJavaScript(“navigator.userAgent”) { (userAgent, error) in
// nilを代入しておかないと、errorが代入されuserAgentがnilになってしまう
webView = nil
print(userAgent)
}
“`

元記事を表示

ハイライト処理に touchesBegan(_:with:) を使うのはやめよう!

## 何事か

あるViewがタップされたときにそれをハイライトさせたいけど、ハイライトの演出をカスタムしたいとき。
私の観測上では [touchesbegan](https://developer.apple.com/documentation/uikit/uiresponder/1621142-touchesbegan) 系メソッドを利用してハイライト演出をするというコードが書かれやすいように感じます。ググり方によってはこれを使う方法がトップヒットするのでしょうか。

私はこの手法は良くないと思っているため、その問題点と改善案を紹介します。

## よくない例

例えば以下のようなコードです。
ハイライト時に表示される用のViewを用意し、 `touchesBegan` 系メソッドをオーバーライドしてそのViewの `isHidden` を書き換えるパターン。

“`swift
class BadHighlightView: UIView {
var highlightView: UIView!
init() { … } // highlightView を生

元記事を表示

世界一簡単に実装できるタグ風CollectionViewのカスタムレイアウト

現在開発中の[Parnovi](https://parnovi-work.studio.design/)でのCollectionViewのカスタムレイアウトについての記事です?

# レイアウトの種類

collectionViewのレイアウトは大きく分けて二つのセグメントに分かれます。

1. UICollectionViewFlowLayout
2. UICollectionViewLayout

後者の`UICollectionViewLayout`はカスタムでレイアウトを作るため比較的敷居が高いですが、だいたいのレイアウトは比較的簡単な前者の`UICollectionViewFlowLayout`で実装することができます。

# 完成イメージ
下記の`お悩みで探す`セクションが完成系のイメージです。
![Simulator Screen Shot – iPhone 11 – 2019-11-08 at 17.01.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/292456/ef80bbf3

元記事を表示

【Swift】CombineでshareReplayの実装を考えながら内部の仕組みを学ぶ

以前Publisherからの出力結果を共有するPublisherを見ていた時に
CombineにはRxのshareReplayのような動きをするPublisherがないということがわかりました。

https://qiita.com/shiz/items/f089c93bdebfaef2196f

そこで
今回はいくつかの例や投稿などを参考にしながら
shareReplayの実装の検証と
実装をするために必要なCombineの内部の仕組みについて
見てみたいと思います。

# Combineの内部の仕組み

下記の図のような流れになります。

![Subscription.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/219965/7b0cda0c-b0c9-7310-38d6-9cb49503e829.png)

ポイントとしてはPublisherからSubscriberへ
直接値を渡している*わけではなく*
PublisherがSubscriptionを生成し
それを経由してSubscriberへ値

元記事を表示

iOSアプリ開発を目指して〜1ヶ月の学習記録〜

##初めに
おはようございます || こんにちは || こんばんわ || 初めまして。
普段は小学生〜大人(主に高校生が多い)の前で授業や講義をしますので、話す事は慣れていますが
ネット上で学習記録や経験談を掲載する事は初めてなので、少し緊張しながら書いています。
もし誰かの役に立てれば&自身の記録になればと思い書く事にしました。
よってiOSについても、ライティングについても初心者ですがよろしくお願いします!
##内容
記念すべき初めての内容ですが、完全に表題通りです。
自分がなぜiOSアプリの開発をしようと思ったのか、この1ヶ月どんな学習をしてきたのか、また学習効果や結果はどうだったのか
はもちろん、今後の学習ロードマップのようなものも掲載したいと思いますので興味がある方は最後まで何卒よろしくお願いします。

###・なぜiOSアプリを開発しようと思ったのか。
そもそもなぜiOSアプリを開発しようと思ったかですが、本題の前置きみたいな内容ですので、そんな情報や前置きどうでもいいわ‼︎って方はすっ飛ばして下さい。
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

元記事を表示

Flutter Meetup Tokyo #12 参加報告 #flutter_meetup_tokyo

Flutter Meetup Tokyo #12 ブログ枠に参加させていただいたため、
簡単に概要だけまとめました!
LT15分枠のもののみ一旦感想を入れています。

詳しい内容は資料のリンクをはっているので、そちらをご参照ください!

## Flutter Meetup Tokyo #12
https://flutter-jp.connpass.com/event/147892/

## 開催概要
・共催: Flutter Japan User Group, 株式会社ガイアックス
・日時: 2019年11月7日(木)
・会場: 株式会社ガイアックス 6F Attic

## togetterまとめ
https://togetter.com/li/1427577

# 発表内容

## ①Add Flutter to existing apps
### ・ 発表者: 
 [@neonankiti](https://twitter.com/neonankiti)
### ・ 資料:
 https://scrapbox.io/neonankiti-portfolio/Add_Flutter

元記事を表示

FirebaseにXcodeアプリを登録する

**ここで、紹介する方法は2019/11/8の方法なので仕様が変わっている場合があります。**

#Firebaseの準備をする
まずは、[ここ](https://firebase.google.com/)からFirebaseにアクセスしてGoogleアカウントでログインする。
ログインが完了すると以下のような画面が出てくるので「プロジェクトの追加」を選択する。
スクリーンショット 2019-11-08 10.41.18.png

すると、以下のような画面が出てくるのでプロジェクト名を決めて「プロジェクト名を入力します」という部分に入力する。(ここで入力する、プロジェクト名はXcode上と異なっていても良い)
スクリーンショット 2019-11-08 10.45.42</p></blockquote>
</blockquote>
<aside class='widget widget-post'>
<div class='tag-cloud-link'>Xcode</div>
<div class='tag-cloud-link'>iOS</div>
<div class='tag-cloud-link'>Firebase</div>
<div class='tag-cloud-link'>iPadOS</div>
</aside>
<div><a style='width:100%;' class='btn__link' href='https://qiita.com/Tommy716/items/cd40454bd9deeb4059a9'>元記事を表示</a></div>
<h3 id=関数定義で使用される”_”について

## “_”は何のため?
swiftのプログラムを見ていると、たまに関数の引数名の左に”_”(アンダースコア)が書いてあるときがあります。

“`swift:howToUseUnderscore
func howToUseUnderscore(_ number1: Int, _ number2: Int) {
print(number1 + number2)
}
“`

引数名number1とnumber2の左に書かれている”_”は何を意味するのでしょうか、、、

## “_”で引数名を省略できる!

関数定義のとき、”_”を引数名の左に書くことで、関数を呼び出す際に引数名の記載を省略することができます。

– “_”を書かないとき

“`swift:howToUseUnderscore
func howToUseUnderscore(number1: Int, number2: Int) {
print(number1 + number2)
}

howToUseUnderscore(number1: 1, number2: 2) // -> 3

元記事を表示

【Swift】CocoaPodsでRealmをインストールする方法 & でもimportできない場合の対処法。

# はじめに
iOSの勉強をしている中で、データの管理をRealmにしてみようかなと思い、自分のプロジェクトにインストールしました。その際に困った部分があったので投稿させていただきました。同じ境遇の人の助けになりますようにと。

podでRealmSwiftをインストール
→プロジェクト内の.swiftファイルでimport RealmSwiftを追記
→エラーメッセージ「**No such module ‘RealmSwift’**」

結果…ビルドしたらエラー消えた、、!
podのとかRealmのインストール方法を知りたい方は、一緒に下に進んでいきましょう!↓↓↓

# やりたいこと
1. CocoaPodsを使う
2. RealmSwiftをインストールする
3. プロジェクトの中でRealmSwiftをimportする

## 実行環境
・MacOSX Catalina バージョン10.15.1
・Xcode バージョン11.2

## CocoaPodsを使うための準備(環境構築)
コマンドラインツールで以下のように打ちます。
“`sudo gem install coco

元記事を表示

【Swift】UITabBarControllerでアプリ起動時に指定したタブを表示する

UITabBarControllerで最初にデフォルト表示されるタブを指定する方法です。
調べてもObjective-Cでの記述ばかりだったので残しておきます。

## 結論
`TabBarController.swift`を作り`selectIndex`で表示したいタブの番号を指定する

“`swift:TabBarController.swift
class TabBarController: UITabBarController {

override func viewDidLoad() {
super.viewDidLoad()
selectedIndex = 1
}
}
“`

これで理解できる方、この記事はここまでです。

以下、順に`TabbarController.swift`を作った場合と作らなかった場合の挙動と、実装の手順を示していきます。

## 確認環境
Xcode 11.1
iOS 13.1(Simulator)
Storyboard使用

## プロジェクト生成
画像のような状態のデモプロジェクトを用いて

元記事を表示

[iOS][Swift]SnapKitをRxSwiftと連携する

# はじめに
iOSでコードベースでレイアウトを組む際に便利なSnapKitと、振る舞いを宣言的に記述できるRxSwiftを連携する方法について説明します。

# 前提
以下のライブラリについて基本的な知識を有している方向けの記事です

– RxSwift https://github.com/ReactiveX/RxSwift
– RxCocoa https://github.com/ReactiveX/RxSwift/tree/master/RxCocoa
– SnapKit https://github.com/SnapKit/SnapKit

# サンプルアプリ
https://github.com/idomazine/RxSnapKit
`git clone`後、 `pod install` を実行しXCodeでビルドします。

# RxでConstraintの値を操作

以下のように記述することでSnapKit.ConstraintのプロパティをRxのBinderに適応させることができます。

“`swift
import RxSwift
import RxCocoa
i

元記事を表示

PythonistaでiOSの写真に画像を追加する

# Pythonistaで処理した画像をiOSの写真に追加したい

## サンプルコード

“` sample.py
import photos
import os
import tempfile
from PIL import Image

imageName = ‘lena.png’
img = Image.open(imageName)
temp_path = os.path.join(tempfile.gettempdir(),imageName)
img.save(temp_path)
photos.create_image_asset(temp_path)

“`

## 解説

画像を追加する関数は“photos.create_image_asset() “なのですが、どこかに画像が保存されていないといけないので、“temp_path “を取得し、一旦そこに保存しているよって感じです。

スクリプトがあるディレクトリと同じところに一旦保存するよりもなんとなくスマートですね。

元記事を表示

【意外と知らない】iOSアプリでのビルドコード

![スクリーンショット 2019-11-07 11.31.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49481/777478e0-0837-580c-c106-f36cd67e3f91.png)

意外と知らない人多いと思うのですが
***iTunes Connect***に送信するアプリ(iOS等)のビルドコードですが
バージョンコードが変われば同じものを使用してもいいんです。

Androidだとだめなはずなので勘違いしている人多いかもしれないですね。

元記事を表示

Combineフレームワーク リンク集

# はじめに

Combineフレームワーク についてのリンクをまとめてみました。
特にサンプルコードを見てみるのは、Combineフレームワークの概要を掴むのにとても有効です。

#【Apple公式】
## Apple Documentation

**Combine**
https://developer.apple.com/documentation/combine

**Receiving and Handling Events with Combine**
https://developer.apple.com/documentation/combine/receiving_and_handling_events_with_combine

## WWDC2109
**Introducing Combine**
https://developer.apple.com/videos/play/wwdc2019/722
>Combine is a unified declarative framework for processing values over time. Lear

元記事を表示

OTHERカテゴリの最新記事