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

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

WidgetKitで天気予報アプリ作ってみた〜Widget Extension追加編〜

## 投稿の経緯
前回投稿した[WidgetKitで天気予報アプリ作ってみた〜位置情報取得&保存編〜](https://qiita.com/nkekisasa222/items/249240ad36128de05557)の続編です。
今回は**Widget Extension**を追加して**Widget Bundle**を設定するとこまでを書こうと思います。

前回の記事を見てない方は先に↓こちら↓を確認してください。

https://qiita.com/nkekisasa222/items/249240ad36128de05557
## 開発環境
Swift 5.5
Xcode 13.2.1

## サンプルプロジェクト
GitHubにPushしています。気になる方はご覧ください。
https://github.com/ken-sasaki-222/WeatherWidget
![QR_615642.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643372/8c43013f-9757-f7dd-

元記事を表示

[Swift] Doubleを少数第x位まで表示させる方法

##はじめに

今回解決したい問題は、
Double型の**3.5 → 3.50** という表示にする方法です。
これだけではイメージが湧きにくいので具体例を用いていきましょう。

##前提

Double型は少数を扱えるのですが、例えば下記のようなDoubleをStringに変換するコードの場合、
不要な0(この場合、少数第二位)が勝手に切り捨てられてしまいます。

“`swift
let hoge: Double = 3.50
let string = String(hoge)

print(string)
//3.5  ←0が切り捨てられてしまいます。
“`
これでは何かの平均をだして少数第x位まで省略せずにlabelに表示させたいなどのユースケースの場合にとても不便です。

そのような場合に下記の処理を書くことで解決できます。

“`swift
let hoge: Double = 3.50
let string: String = String(format: “%.2f”, hoge)

print(string)
// 3.50   ←0が切り捨てられない。
“`

元記事を表示

【Swift】ActiveLabelの実装

#はじめに
リンク、ハッシュタグ、メンションを埋め込みたい時にとても簡単に実装することができます。
とても使用する機会が多いライブラリの一つなので、自分の為の備忘録です。
SNSアプリを制作する際にはほぼ必須な気がしています。

https://github.com/optonaut/ActiveLabel.swift

#実装

“`swift
import UIKit
import ActiveLabel
import SnapKit

final class ViewController: UIViewController {

// リンクの実装
private let urlLabel = ActiveLabel()
@IBOutlet weak private var urlView: UIView! {
didSet {
urlView.addSubview(urlLabel)
urlLabel.snp.makeConstraints { $0.edges.equalToSu

元記事を表示

Androidアプリエンジニアへ〜〜【Xcode】でUIScrollViewを動かしてみる。

【この記事は、iOSアプリを作成しようとしているandroidアプリエンジニアを想定しています】

特定のフレームワークで開発をしていると、そこでの考え方が期せずして定着してしまい、他のフレームワークで開発するときに妨げになることがあります。
私はもともとAndroidでアプリを開発しており、同じアプリのiOS版を作ろうとして “Xcode” という魔に足を踏み込みました。
iOSアプリを作ろうとして困ったことは多々ありますが、中でもUIScrollViewの挙動が最も理解不可能でした。
そんな理解の甘さが災いして、UIScrollViewの仕様を変更しなければならないことがあり、一念発起して勉強した結果、完全に理解した←のでまとめてみたいと思います。
手短に実装を知りたい人は3.から読み始めてください

#1. Androidの場合

まず、androidのScrollViewをおさらいしておきましょう。
androidではScrollViewタグの中に、適当なLayout(ConstraintLayoutなりLinearLayoutなり)を入れて、その中にスクロールさせたいもの

元記事を表示

【Flutter × Codemagic】WindowsでiOSアプリを実機テストした手順

初めての投稿なので間違い等ありましたら、ご指摘いただけますと幸いです。

# はじめに
FlutterとCodemagicを組み合わせて、Macを使わずにiOSアプリを実機テストする手順を紹介します。

主に下記ページを参考にしました。

https://qiita.com/kami_teru/items/c7ed113d0ecdf7e48ff0

この記事は、
・Flutterのサンプルプログラムを作成し、GitHub(GitLabまたは、Bitbucket)にpushしてある。
・Apple Developer’s Programに登録するため、「**カードで約12,000円支払える**」かつ「**支払い後、最大48時間(2営業日?)待てる余裕がある**」が、「**~~Macが買えない!!or~~Macを持っていない**」
という人向けです。

サンプルプログラムの作成、リモートリポジトリへのpushがまだの方は下記を参考にするとできると思います。

[【超初心者向け】Visual Studio Code(VSCode)超入門 – 2020年版](https://qiita.com

元記事を表示

アプリでよくみる円形のProgressView

#進行状況を円形で表示する方法です
![Feb-02-2022 11-35-07.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/68fde8d8-dd36-e40a-3554-caf4aac22c0c.gif)

#円形のプログレス・ビューを表示したい
棒状のProgressBarならUIKitにありますが、アプリなどでよくみる円形のProgressを表示したい。

#KDCircularProgressでかんたんに表示
便利なライブラリを使ってかんたんに表示します。

https://github.com/kaandedeoglu/KDCircularProgress

リポジトリからKDCircularProgress.swiftファイルをプロジェクトにドラッグ&ドロップします。

CircularProgressをセットアップします。

“`swift
var progress = KDCircularProgress(frame: CGRect(x: 0, y: 0, width

元記事を表示

iOSのWebViewで任意のCookieを送信するには

iOSのWebViewで任意のCookieを送信する場合、WKHTTPCookieStoreにCookieをセットすることで実現できます。
実装パターンとしてはアプリの自動ログインなど、API経由などで取得したセッションCookieを送信するなどがあります。

結構前の話になりますが、WKHTTPCookieStoreが使えなかった時代(iOS11未満)は、WKWebViewの`evaluateJavaScript`なんかを使ってJavaScriptで`document.cookie = “foo=bar”;`のようにセットしたりしていました。
この場合、初回ロード時にはタイミング的には当然このJavaScriptが実行前の状態になるので未ログイン状態の画面になってしまうため、NSMutableURLRequestでヘッダにCookieヘッダを詰め込む必要があったり、いろいろ苦労した思い出があります。

以下は、WebViewにCookieをセットする簡単な例です。

“`
import WebKit

class PrivateWebViewController: UIViewCo

元記事を表示

【Swift】Combine入門レベルのまとめ

## この記事でわかること
Combineを利用する上で理解が必須になってくる

– Publisher
– Subscriber
– Subject
– Operator

の関係性をシンプルなサンプルコードを使って説明していきます。

## Combineとは
iOS13から追加されたApple純正のFrameworkです。
Swiftのみで利用可能で、Objective-Cでは利用できないようです。

Combineの特徴を簡単に言葉にしてみると、
`イベントを発行する側と受け取る側に分かれて、あるイベントが発行されたら、それを受け取った側の処理が走ることを容易にしたフレームワーク`
という感じで捉えています。

公式ドキュメントを呼んでみるとこんな説明が、

By adopting Combine, you’ll make your code easier to read and maintain, by centralizing your event-processing code and eliminating troublesome techni

元記事を表示

スマホからSSH

# はじめに
~ SSH connection from your Smart phone ~
スマホからサーバーコンソール、またはラズパイのようなデバイスへのSSH、思ってるより使えるよ!しかもremote.itでインターネット越しにつないじゃおうという記事です。

# やりたいこと
AndroidまたはiPhoneを小さいながらもSSHコンソールとして使ってみたいと思います。remote.itを経由すれば携帯電波網でも、しかもポートフォワーディング無しでリモートホストに接続できます。
キーボード/マウスをつなぐとなお一層使いやすいですね。Androidならテキトーなキーボード・マウスでも認識するのでハードルは低くかなり使える環境になります。

![SSHfromSmartPhone.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309124/405bda8e-7ee1-8b54-2c63-90b600fb8966.png)

# おすすめSSHクライアント
まずはスマホにSSHクライアントをイン

元記事を表示

カメラロールの写真をUIImageで上書き保存するミニマムなサンプル

ライブラリの写真をPHAssetで取得して、UIImageで更新保存するサンプルです。
ググっても意外と出てこない模様なので。

## ちゃんと読もう
https://developer.apple.com/documentation/photokit/phasset/1624061-requestcontenteditinginput

## Apple 公式のサンプル
https://developer.apple.com/documentation/photokit/browsing_and_modifying_photo_albums/

## 環境
Xcode 13.0

## ミニマムなサンプルコード
“`swift
import UIKit
import Photos

private lazy var formatIdentifier = Bundle.main.bundleIdentifier!
private let formatVersion = “1.0”

private func update(asset: PHAsset, toPhoto: UIImag

元記事を表示

CoreML Modelに柔軟な入力形状を設定する

#色々な入力形状に対応できるCoreMLモデルに変換する方法です

#固定ではなくさまざまなサイズの入力を使いたい

デフォルト変換では、CoreMLモデルは入力サイズを固定します。
しかし、実際のユースケースでは、色々なサイズの入力を使いたい場合があります。

#柔軟な入力を使う方法

CoreMLToolsは、柔軟な入力の設定が可能です。

###変換時に設定する方法

“`python
import coremltools as ct

input_shape = ct.Shape(shape=(1,3, ct.RangeDim(512, 1024), ct.RangeDim(512, 1024)))
model_input = ct.ImageType(shape=input_shape)

mlmodel = ct.convert(model, inputs=[model_input])
“`

これで、入力画像の縦と横で512~1024の範囲を受け入れられるようになりました。
ct.RangeDim()とすると、無制限の入力形状を受け入れるようになります。

範囲指定で

元記事を表示

WidgetKitで天気予報アプリ作ってみた〜位置情報取得&保存編〜

## 投稿の経緯
前回投稿した[WidgetKitで天気予報アプリ作ってみた〜天気情報取得編〜](https://qiita.com/nkekisasa222/items/359192455b65fb60705d)の続編です。
今回は位置情報を取得して保存するところまでを記事にしようと思います。

前回の記事を見てない方は先に↓こちら↓を確認してください。

https://qiita.com/nkekisasa222/items/359192455b65fb60705d

## 開発環境
Swift 5.5
Xcode 13.2.1

## サンプルプロジェクト
GitHubにPushしています。気になる方はご覧ください。
https://github.com/ken-sasaki-222/WeatherWidget
![QR_615642.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643372/8c43013f-9757-f7dd-5946-2684f30f63b7.png)

## 位置情報取

元記事を表示

50行で目線トラッキング(iPhone)

![Xcode-13.1](https://img.shields.io/badge/Xcode-13.1-brightgreen) ![Swift-5.5.1](https://img.shields.io/badge/Swift-5.5.1-brightgreen) ![iOS-15.1](https://img.shields.io/badge/iOS-15.1-brightgreen)

## はじめに
こちらの記事を見て目線トラッキングが面白そうだなと思いました。
[目線でブラウザをスクロールするアプリを作ってみた](https://dev.classmethod.jp/articles/eye-scrollable-web-view/)

調べてみると 50 行くらいで下記ができました(動作確認は iOS 15.1 の iPhone 12 mini)。

UITextViewに入力されている文字数をカウントする

TextViewに入力されている文字数のリアルタイムカウントを実装します。
文字列中の全ての空白や改行はカウントしません。

環境

* Xcode 13.2.1
* Swift 5.5.2

手順

StringProtocolを拡張します。

“`Swift:Extension.swift
extension StringProtocol where Self: RangeReplaceableCollection {
var removeWhitespacesAndNewlines: Self {
filter { !$0.isNewline && !$0.isWhitespace}
}
}
“`

使用例

“`Swift:ViewController.swift
extension ViewController: UITextViewDelegate {
func textViewDidChange(_ textView: UITextView) {
let textLength = textView.te

元記事を表示

WidgetKitで天気予報アプリ作ってみた〜天気情報取得編〜

## 投稿の経緯
最近仕事でウィジェットをよく触っており、復習とアウトプットを兼ねて天気予報アプリを開発しているので記事にしました。
今回使う天気情報は**OpenWeatherMap**の**OneCallAPI**から取得します。

https://openweathermap.org/

## 開発環境
Swift 5.5
Xcode 13.2.1

## サンプルプロジェクト
GitHubにPushしています。気になる方はご覧ください。
https://github.com/ken-sasaki-222/WeatherWidget
![QR_615642.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643372/8c43013f-9757-f7dd-5946-2684f30f63b7.png)

## APIを叩いてみる
“`
{
“lat”: 33.44,
“lon”: -94.04,
“timezone”: “America/Chicago”,
“timezone_of

元記事を表示

Xcode 13.3 – アプリ内課金でApp Store にコンテンツをホストする機能が廃止された

# おさらい
アプリ内課金コンテンツのホスト機能とは、非消費型プロダクトがコンテンツを持つ場合、それをアプリ内にバンドルするのではなく、App Storeサーバに置かせてもらう機能です。
アプリ本体のサイズを小さくし、購入したコンテンツだけを必要に応じてダウンロードさせる仕組みです。StoreKitフレームワークに属します。
アプリのバイナリとは別に、アプリ内課金コンテンツもバイナリとして生成する必要があり、生成したバイナリは Xcode Organizer経由でアップロードする必要がありました。

# 廃止になった
[Xcode 13.3 beta リリースノート](https://developer.apple.com/documentation/xcode-release-notes/xcode-13_3-release-notes)を見ていたらさらっとサポート終了と書かれてました。
> Building and uploading nonconsumable in-app purchase content for Apple to host is no longer supp

元記事を表示

【Swift×AWS】iOSアプリにAPI Gatewayを導入してCognitoから指定のユーザーデータを消去する

## 前提
ユーザーの退会機能を作るべく、今までAmplifyを使用していたアプリにAPI Gatewayを追加したサーバレスアプリです。
Amplifyからユーザーの削除APIがあればよかったのですが見つからずで、Lambdaから実現することに。(もしAmplifyからのやり方を知っている人がいたら教えてください笑)
元々はLambdaが使えれば良く、どうやらLambdaを直叩きする方法もあるっぽいんですが、API Gatewayを触ったことがなかったのでそちらを使って実装してみることにしました。
また、今回初めてAPI Gatewayを触るので、とりあえずリクエストだけ実装してレスポンスはデフォルトです。
実装が甘いところ等もあると思いますがご容赦ください。

## 構成
構成はこんな感じ。これをAlamofireを使って叩いていきます。

![Untitled Diagram.drawio (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653537/f13f392c-f203-42da-4

元記事を表示

画像をコラージュする

#画像を組み合わせて一枚の画像を作る方法です

スクリーンショット 2022-01-31 11 38 13

#複数の画像から新しい画像を作りたい
複数の画像を組み合わせて一枚の画像にするとなると、はて、どうすればいいのか、、、と改めて思いました。

#Contextに描画すればいい

“`swift
UIGraphicsBeginImageContextWithOptions(CGSize(width: outputWidth, height: outputHeight), false, 0.0)

imageA.draw(in: drawRectA)
imageB.draw(in: drawRectB)
imageC.draw(in: drawRectC)

let assembledImage = UIGraphics

元記事を表示

スマホアプリ クロスプラットフォーム開発 in Flutter

# Index
1.Flutterフレームワーク
2.AndroidStudioで開発できる
3.UIの記載はネストを多用する
4.UIとビジネスロジックを分けて書く
5.KotlinとSwiftによる書き分けが必要な場合がある
6.Dartプログラムのエントリーポイント
7.使用パッケージの宣言
8.ホットリロードで一回一回ビルドしなくてもいい
9.動作確認
10.アプリ公開

## 1.Flutterフレームワーク
2018年12月にGoogleからリリースされた、モバイルアプリ開発用のフレームワーク。

#### Dart言語
従来ならば、AndroidならKotlin
iOSであればSwift
という、それぞれの言語を覚えなければいけないが

Flutterの場合は、DartというJavaライクな言語を覚えるだけで
両方の開発ができ、学習コストを抑えることができる。

## 2.AndroidStudioで開発できる

##### AndroidStudioのインストール
![スクリーンショット 2022-01-20 20.56.23.png](https://qiita-im

元記事を表示

OTHERカテゴリの最新記事