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

iOS関連のことを調べてみた2021年08月29日
目次

SwiftUIのボタンで少し凝ったハイライト表現をするには?

### ButtonStyleによるハイライト表現

SwiftUI においてボタンのタップ中のハイライト表現をしたい場合、`ButtonStyle` を作り、`configuration.isPressed` によってハイライト時の見た目に変更します。以下の例ですと、タップ中はボタンの背景色が変わるようになっています。

![Aug-29-2021 07-52-00.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16508/c45d6d21-738d-1891-20bb-d9fce373a542.gif)

“`swift
struct CustomButtonStyle: ButtonStyle {
func makeBody(configuration: Configuration) -> some View {
configuration.label
.padding()
.foregroundColor(Color.wh

元記事を表示

【iOS】Metal Best Practicesの解説(7) 画面スケール

[Metal Best Practices](https://developer.apple.com/library/archive/documentation/3DDrawing/Conceptual/MTLBestPracticesGuide/index.html#//apple_ref/doc/uid/TP40016642-CH27-SW1)は、iOS/MacOS/tvOSのAPIであるMetalを用いた設計のベストプラクティスガイドです。

本稿では、何回かに分けてこのガイドを読み解き、コード上での実験を交えて解説していきます。
読んでそのまま理解できそうなところは飛ばしますので、原文を読みながら原文のガイドとしてご利用下さい。
また、iOSの記事なので他のOS(MacOS, tvOS)についての記載は割愛します。

他の記事の一覧は、初回記事よりご覧下さい。

https://qiita.com/TokyoYoshida/items/521619d6d8dd8d8ef9e4

### [Native Screen Scale (iOS and tvOS) (画面スケール)](

元記事を表示

イニシャライザとは? -init()

##イニシャライザとは、
型(クラス、構造)のインスタンスを初期化(僕のイメージでは再設定)するメソッドのこと

“`swift
class User {
let name: String

// funcが不要(initキーワードのみ)
init(name: String) {
// 全てのプロパティを初期化する前にインスタンスメソッドを実行することはできない
// printName() → コンパイルエラー
self.name = name
printName() // OK
}

// インスタンスメソッド
func printName() {
print(name)
}
}
let user1 = User.init(name: “hoge”)
// 呼び出し時のメソッド名が省略可能
let user2 = User(name: “hoge”)
“`
####イニシャライザの順序
イニジャライザは、プロパティの初期化をしてからインスタン

元記事を表示

【Swift】UITextViewでHTMLを表示してアンカータグをタップ可能にする

# やりたいこと
UITextViewでhtmlを表示してアンカータグをタップ可能にかっただけなのですが、巷の記事を参考にしても実装が出来なかったので成功体験を共有できればと思います。

# 環境
* Xcode:12.5.1
* Swift:5.4.2

# 実装
NSAttributedString型に変換する際にオプションを指定してあげるだけです。
これでHTMLとして表示することが可能です。

“` swift
textView.attributedText = convertToAttributeString(contents: information.infoContents)

private func convertToAttributeString(text: String) -> NSAttributedString? {
guard let data = text.data(using: .utf8) else { return nil }
do {
return try NSAttrib

元記事を表示

【Swift】半角/全角/URL/改行を区別して文字数をカウントする

## はじめに

iPhone向けに、投稿を予約することで好きな時間にTwitterに呟いてくれるアプリをリリースしています。

https://apps.apple.com/jp/app/twi%E3%82%B9%E3%82%B1/id1491291009

興味がある方はぜひ使ってみてください。

この記事は、上記アプリに入力文字数に応じた残入力可能文字数の表示機能を設置する際に調べたことをまとめるための記事です。

### Twitterの文字数カウントの法則
全角文字 → 1文字カウント
半角文字 → 0.5文字カウント
改行 → 0.5文字カウント
URL → どんな長さでも、11.5文字カウント

出典:
> https://afila0.com/twitter-character-count/
> https://pc-chain.com/sns/twitter-character-limit/

古い記事なんかだと改行1文字URLが23文字、みたいになってることもあるが、2017年ごろに更新されたらしい。
> https://www.localfolio.co.jp/b

元記事を表示

Flutter Appを実機で動かす (M1 Mac, iOS)

# 環境

– MacBook Air (M1, 2020)
– MacOS 11.4
– Flutter (stable, 2.2.3)

# Homebrew Cask

次のコマンドをターミナルで実行し、Flutterをダウンロード、インストールする。

“`
brew install –cask flutter
flutter doctor
“`

出力される指示に従って環境構築を進める。

## Rosetta 2

FlutterとDartはM1チップのMacに適応している最中であるため、
M1 MacではFlutter SDKのインストール後に下記のエラーが出ることがある。

“`
Bad CPU Type in executable
“`

その場合、Rosetta 2をインストールし、M1が解釈できるバイナリに翻訳する必要がある。

“`
softwareupdate –install-rosetta
“`

M1 MacでFlutterを使うことについての補足は、公式がこのページにまとめている。
https://github.com/flutter/

元記事を表示

React Nativeで開発したiOSアプリを、Appleを介さずに特定少数のユーザに配布する方法

## はじめに

iOSアプリの作成時、デモをユーザに使ってもらって意見もらいたい。みたいなニーズあると思います。
ただ、iOSアプリを配布するにはいろいろと面倒な手順を踏む必要があります。
https://qiita.com/mokkos/items/85540e95404df4a9c5a4

今回は、そんな面倒な手順を避けて、「とりあえず特定少数のユーザにiOSアプリを配布する方法」を紹介します。

(「iOSアプリを配布」と言っていますが、正確には別アプリを介したエミュレータ上で実行させる方法になります。)

## 利用するサービス

iOSアプリを配布するために、Expoを利用します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502798/f7eb028f-65ba-2b90-3c5f-5a38b6b877e2.png)

>Expoは、ユニバーサルなReactアプリケーションのためのフレームワークであり、プラットフォームでもあります。React Nativeとネイティ

元記事を表示

[Flutter] ios 色々エラーが出て困った時

掃除してみる

`$ flutter clean && \
rm -Rf build && \
rm -Rf ios/Flutter/Flutter.framework && \
rm -Rf ios/Flutter/Flutter.podspec && \
rm -Rf ios/Flutter/App.framework && \
rm -Rf ios/Pods && \
rm -Rf ios/.symlinks && \
rm -Rf ios/build && \
rm -Rf ios/Runner.xcworkspace && \
rm -f ios/Podfile && \
rm -f ios/Podfile.lock && \
rm -f pubspec.lock && \
flutter build ios && \
flutter run`

元記事を表示

APNS のペイロードデータを struct にマッピングする

## TL;DR

“`swift
struct APNSPayload: Decodable {
struct APS: Decodable {
struct Alert: Decodable {
let title: String
let body: String
}

let alert: Alert
let badge: Int?
}

struct CustomField: Decodable {
let hogeList: [String]
let fuga: String?
}

let aps: APS
let customField: CustomField?

init(decoding userInfo: [AnyHashable: Any]) throws {
let json = try JSONSerialization.data(withJS

元記事を表示

[iOS] URLSchemeで起動した時のAppDelegate/SceneDelegateの呼び出し順序

※本記事の前提環境:Xcode 12.5.1

AppDelegate/SceneDelegateを両方実装している場合に、URLSchemeのトリガーによって、URLパラメータ取得系のdelegateメソッドがどのように走るのかを調査しました。

結構メンドクサイなと思いました…

なお、アプリ未起動状態でURLSchemeによってアプリが起動された場合のデバッグについては、以下の記事を参考にさせていただきました。

https://qiita.com/AlecYawata/items/79f45e85ecc573860dcb

# iOS 13以降

注:URLパラメータ取得系のdelegateメソッド以外については省略しています。

## アプリ未起動状態

1. AppDelegate – application(_ :didFinishLaunchingWithOptions)
2. SceneDelegate – scene(_ :willConnectTo :options)

※注:scene(_ :openURLContexts)は呼ばれない

## アプリ起動状態

元記事を表示

【iOS】Metal Best Practicesの解説(6) ドローアブル

[Metal Best Practices](https://developer.apple.com/library/archive/documentation/3DDrawing/Conceptual/MTLBestPracticesGuide/index.html#//apple_ref/doc/uid/TP40016642-CH27-SW1)は、iOS/MacOS/tvOSのAPIであるMetalを用いた設計のベストプラクティスガイドです。

本稿では、何回かに分けてこのガイドを読み解き、コード上での実験を交えて解説していきます。
読んでそのまま理解できそうなところは飛ばしますので、原文を読みながら原文のガイドとしてご利用下さい。
また、iOSの記事なので他のOS(MacOS, tvOS)についての記載は割愛します。

他の記事の一覧は、初回記事よりご覧下さい。

https://qiita.com/TokyoYoshida/items/521619d6d8dd8d8ef9e4

### [Drawables (ドローアブル)](https://developer.apple.c

元記事を表示

unity ios書き出しのスプラッシュを任意の色にする

#環境
Unity 2019.4.15
Xcode 12.4

この環境でデフォルトで書き出すと、黒に近い灰色のスプラッシュになります
Unityで黒のpngを設定しても、思った効果になりませんでした
仕様が変わったようでXcodeのStoryBoardから読んでるらしいです。

#解決策
一応、ビルドが通りましたが
いいのか、悪いのか、、、

1、Unityのスプラッシュ設定は、デフォルトのまま(show Splash Screen OFF)書き出し
2、Xcodeで、StoryBoardを開きRootViewの下を削除する 
3、RootViewのBackgroundとTintを任意の色にする

![スクリーンショット 2021-08-27 15.33.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/514937/e119cf5e-c660-332e-3a76-8921de926efd.png)

元記事を表示

flutter_flavorizr + flutter_flavorでFlutterの環境切り替えした後に、iOSでbuildした時の 「Unable to load contents of file list」の解決方法

# 概要
Flutterの開発環境/本番環境を「flutter_flavorizr + flutter_flavor」を使って、切り替えできるように対応しました。
下記の問題が発生しました。 こちらの記事のその解決を記載しています。

* iOSでbuildすると、「Unable to load contents of file list: ‘/Target Support Files/Pods-Runner/Pods-Runner-frameworks-Debug-development-input-files.xcfilelist’」のErrorが出て、buildが通らない

## 対応環境
(Errorが出ている。。。あとで直そう)

“`
[✓] Flutter (Channel master, 2.5.0-7.0.pre.15, on macOS 11.3.1 20E241 darwin-x64,
locale ja-JP)
[!] Android toolchain – develop for Android devices (Android SDK versio

元記事を表示

Google Firebase A/Bテストをiosで使ってみる

A/Bテストやってますか?Qiitaの“`ABテスト“`タグの量を見るかぎりあまり使われていないのかな?

GoogleのFirebaseにはA/Bテストを簡単に行える機能があります。これをiosアプリに実装する方法を書きたいと思います。以下の記事を参考にしました。

https://www.raywenderlich.com/17323848-firebase-remote-config-tutorial-for-ios

https://www.raywenderlich.com/20974552-firebase-tutorial-ios-a-b-testing

今回は画面に表示されたボタンのテキストをAとBで変えてクリックされる率をとるというものを作りたいと思います。
![21.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33704/dea100fa-548b-f3eb-a316-6c2f4393512f.jpeg)

Firebaseにはいろいろな機能があるのですが、Remote Co

元記事を表示

【個人開発】地域の魅力を発信できるデジタルパンフレットサービス「Openパンフレット」を作った

# はじめに

* デジタルパンフレット作成公開サービス **[Openパンフレット](https://open-pamphlet.com)** をリリースしました。

* 個人開発です。

* バックエンドはだいたいAWSです。

* Android未対応?​

https://open-pamphlet.com

​バックエンドの技術者がフロントやらインフラやらアプリやら色んな所に手を出して作ったシステムになっています。

記事本文はZennで書いているので[こちら](https://zenn.dev/ymasutani/articles/42fb40f4e00f1d)です。

# 宣伝
Android版の開発のためクラウドファンディング募集しています。
よかったら見て下さい。励みになります。

https://camp-fire.jp/projects/view/467291

元記事を表示

Swift for ios app のTextFieldの移動方法

# Swift for iOS APP メモ
## キーボードをあげて表示を行う
チャットなどアプリでTextFieldに文字を打ち込みたいときに、TextFieldをキーボードの上にあげる方法

`AppDelegate.swift` に以下のコードを追加する。

“`swift:AppDelegate.swift
import IQKeyboardManagerSwift

func application()

IQKeyboardManager.shared.enable = true
IQKeyboardManager.shared.enableAutoToolbar = false
IQKeyboardManager.shared.shouldResignOnTouchOutside = true

“`

これのみで完了

元記事を表示

[Swift]推定されるジェネリック型の制約

※この記事は[Swift by Sundell](https://www.swiftbysundell.com/tips/inferred-generic-type-constraints/)の内容を日本語に翻訳したものです。

ジェネリック型制約を使用して、特定のAPIが使用される具象型に一連の要件を課すことができます。これにより、ジェネリックコード内でそれらの型について特定の仮定を行うことができます。

たとえば、私たちが取り組んでいるアプリが`NetworkRequest`プロトコルを使用して、さまざまなリクエストを、それぞれ`Response`が期待する種類を宣言するさまざまなタイプとして定義できるようにしているとします。

“`.swift
protocol NetworkRequest {
associatedtype Response: Codable

func makeURLRequest() -> URLRequest
}
“`

このようなリクエストを実行するためのAPIを定義すると、次のような結果になる可能性があります。ジェネリック型制約を使

元記事を表示

WWDC2021セッション等の要約(2)

(1)はこちら: https://qiita.com/satoru_pripara/items/92bb0a37bc42c0a8d610

### Ultimate application performance survival guide
https://developer.apple.com/videos/play/wwdc2021/10181/

アプリの起動時間・バッテリー消費・メモリー消費・ファイルアクセスの時間など、パフォーマンス系の問題を解決するための対策を総合的に解説しています。

道具としてはXcode Organizer, MetricKit, Instruments, XCTest, App Store Connect APIを利用しています。

#### バッテリー消費
バッテリーは位置情報取得、ネットワークとのデータの送受信、何らかの計算処理をした時のCPUの負荷、描画を行うときのGPUの負荷、音声の再生、ブルートゥースの使用などで消耗されます。 主に最初の3つで大量にデータが消費されます。

Xcodeからプログラムを実行時に、画面左側のスプレーボトルのよ

元記事を表示

【Swift】郵便番号が存在するか確認するコード

入力した郵便番号が存在するか確認するコード。

“`swift
let geocoder = CLGeocoder()
geocoder.geocodeAddressString(“1000012”, completionHandler: {(placemarks, error) -> Void in
if((error) != nil){
print(“error”)
}
if let placemark = placemarks?.first {
print(“success!”)
}
})

“`
参考:

https://qiita.com/k-yamada-github/items/5ce29b3c30397104461e

元記事を表示

Cannot declare conformance to ‘NSObjectProtocol’ in Swiftへの対応

#はじめに
mapにピンを立てる際に、カスタムなアノテーションを用意してMKAnnotationを継承させたときに、`「Cannot declare conformance to ‘NSObjectProtocol’ in Swift」`とエラーが出ました。

“`swift
final class CustomAnnotation: MKAnnotation {}
“`

#環境
[Swift] Version 5.3.2
[iOS] Version 14.4

#エラーへの対応
`「Cannot declare conformance to ‘NSObjectProtocol’ in Swift」`
そのままですが、Swiftでは、私たちが`NSObjectProtocol`の継承を直接宣言できないらしいです。
`NSObjectProtocol`は、すべてのObjective-Cオブジェクトの基本となるメソッドのグループです。
>The group of methods that are fundamental to all Objective-C objects.
(htt

元記事を表示

OTHERカテゴリの最新記事