- 1. iOS連写カメラをつくる【最小実装】
- 2. AVCaptureVideoDataOutputSampleBufferDelegateのcaptureOutputでフレームを配列で保持するとサンプルを取得できなくなる問題【対処法】
- 3. [Swift] imagePickerControllerとimagePickerControllerDidCancel
- 4. ノンエンジニア向けにiOS14のAppClipsでのユーザー体験と機能を伝えるために考慮したい事まとめ
- 5. APIKitなどのライブラリを使わずに標準のURLSessionで通信処理を実装をする
- 6. 【Flutter】画面サイズに応じて文字サイズを自動で適用する方法
- 7. Xcode11でObjective-CをMRCで動かす
- 8. Unable to process Runner.app.dSYM at path /Users/…省略…/Runner.app.dSYMが発生した場合の対処
- 9. Swift Package Manager とは
- 10. web側がユニバーサルリンクの対応するときの備忘録
- 11. MarketingCloudSDK In-App Messaging概要
- 12. UITableView.tableHeaderViewにNibファイルから設定する場合
- 13. [iOS]Push通知を実装するにあたり、つまずいた点
- 14. iOS ReplayKitを調べてみた
- 15. [Multiple commands produce ‘/Users/ユーザ名/…省略…/Info.plist’]が発生した場合
- 16. UIFeedbackGenerator を使おう
- 17. ask me! appのログイン画面の実装
- 18. 【Flutter, Dart】ミュータブルの代償ととイミュータブルの代償、そしてfreezed
- 19. 【iOSアプリ内課金のテスト】サブスクリプション自動更新時間の進み方
- 20. iOS Keyboard Extensionでキーボードを介さない操作を検知する
iOS連写カメラをつくる【最小実装】
指定した間隔で連写するカメラをつくります。
AVCaptureSessionの構成。
PhotoOutputではなく、VideoOutputのフレームを取得します。“`swift
var captureSession = AVCaptureSession()
var previewView = UIView()
var previewLayer:AVCaptureVideoPreviewLayer?
let videoDataOutput = AVCaptureVideoDataOutput()let videoDevice = AVCaptureDevice.default(for: AVMediaType.video)
let videoInput = try! AVCaptureDeviceInput.init(device: videoDevice!)captureSession.beginConfiguration()
captureSession.addInput(videoInput)
videoDataOutput.setSampleBu
AVCaptureVideoDataOutputSampleBufferDelegateのcaptureOutputでフレームを配列で保持するとサンプルを取得できなくなる問題【対処法】
#13フレームで止まる問題
ビデオフレームを取得して処理できるデリゲートメソッド “captureOutput” の **CMSampleBuffer を配列として保持すると、新しいフレームを取得できなくなります。**
13フレーム取得すると、それより後のフレームは取れなくなります。
**CVPixelBufferやUIImageに変換して配列に保持しても、同様に取得できなくなります。**“`swift
func captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection) {
buffers.append(sampleBuffer)
//このように配列(buffers)に保持してしまうと、新しいフレームが取れなくなる
}
“`ドキュメントによると、
>最適なパフォーマンスを維持するために、一部のサンプルバッファーは、デバイスシステムや他のキャプチャ入力で再
[Swift] imagePickerControllerとimagePickerControllerDidCancel
UIKitでカメラを実装する際に用いるであろう`imagePickerController`と`imagePickerControllerDidCancel`について
## カメラの実装
“`swift
let picker = UIImagePickerController()
picker.sourceType = .camera
picker.delegate = selfpresent(picker, animated: true)
“`記事のメインテーマではないので最低限の実装です。このままだとエミュレータなどカメラがない環境で実行するとクラッシュします。アプリに組み込むならば`isSourceTypeAvailable`でカメラが利用できるか確認すると良いでしょう。
参考
[Apple公式ドキュメント](https://developer.apple.com/documentation/uikit/uiimagepickercontroller/1619144-issourcetypeavailable)## imagePicker
ノンエンジニア向けにiOS14のAppClipsでのユーザー体験と機能を伝えるために考慮したい事まとめ
![スクリーンショット 2020-08-18 18.58.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6691/91a3a8c0-ab91-b841-3a41-416b9b151a8e.png)
## はじめに
※ 本記事はWWDC2020で発表された内容を元に作成しております
※ 記事中の画像はWWDC2020で発表された内容を引用させて頂きました
※ 記事中の内容は変更される可能性があります社内向けにAppClipsの概要・ユースケースや
注意点を説明するためにまとめました。個人的には罠が多いな…という印象でしたので
ネガティブっぽい要素を理解した上でどんなユーザー体験が提供できそうか
あーでもないこーでもない、をする際などにお役に立てれば幸いです。## AppClipsで何ができるのか?
アプリが提供している機能の一部を
**本体アプリのインストール不要で**利用できます。WWDC20ではAppClipsを起動してスムージーを注文したり
[「Spin」](https:/
APIKitなどのライブラリを使わずに標準のURLSessionで通信処理を実装をする
# ✔️実装パターン①
**RequestとResponseの関係を一対一にする。**
## Protocolでリクエストを作成
“`swift
import Foundationprotocol APIRequest {
associatedtype Responses: Decodable
associatedtype Parameters: Encodablevar path: String { get }
var method: String { get }
var headers: String? { get }
var queries: [URLQueryItem]? { get set }
var body: Parameters? { get set }
}struct Request {
struct Login: APIRequest {
typealias Responses = UserResponse
typealias Parameters =
【Flutter】画面サイズに応じて文字サイズを自動で適用する方法
#この記事を読んで習得できること
画面サイズに応じて文字サイズを自動で変えることができるようになる。
結構使うことになるので備忘録として。#結論
`Text`を`FittedBox`配下に置く。“`sample.dart
FittedBox(
fit: BoxFit.fitWidth,
child: Text(
“あああああああああああああああああああああああテトラポット”,
style: TextStyle(fontSize: 32),
),
),
“`![スクリーンショット 2020-08-18 23.42.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/389553/51168828-0ce2-6c2d-63e2-9c3da2b14e74.png)
#FittedBoxがなかったら
折り返したり、画面からはみ出たりして、画面がぶっ壊れてしまう。“`sample.dart
Text(
“あああああああああああああああああああああああテトラ
Xcode11でObjective-CをMRCで動かす
# 環境
– macOS Big Sur 11.0 Beta
– Xcode 11.6# Objective-C言語でMRC有効方法
– Xcode11ではARCがデフォルト有効なため、`PROJECT` -> `Build Settings` から `Objective-C Automatic Reference Counting` の値を `NO` に変更する
![スクリーンショット 2020-08-18 23.02.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237942/52fa4f11-e3ca-e19b-6617-14b7552a7e96.png)– 上記だけだとXcode11では、main.mのmain()でEXC_BAD_ACCESSが発生してしまう。
![スクリーンショット 2020-08-18 23.03.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237942/2611
Unable to process Runner.app.dSYM at path /Users/…省略…/Runner.app.dSYMが発生した場合の対処
Firebase Crashlyticsを導入してみたけど、うまく取得できないなーと思っていたら、エラーはいていた。
対応
[この手順](https://firebase.google.com/docs/crashlytics/find-missing-dsym?hl=ja)を実施したらエラー無くなりました。>
1. Xcode でプロジェクトを開きます。
2. Xcode ナビゲータでプロジェクトを選択します。
3. [Build Settings] タブを開きます。
4. タブの上部にある [All] をクリックします。
5. 「debug information format」を検索します。
6. [Debug Information Format] を [DWARF with dSYM File] に設定します。>
上記の手順が完了したら、アプリを再度ビルドして、Crashlytics が dSYM を検出できることを Firebase コンソールで確認します。以上
Swift Package Manager とは
### 概要
Swift Package Manager(以降: SwiftPM) は、Swift コードの配布を管理するためのツールです。また、Swift のビルドシステムと統合されていることにより、依存関係のダウンロード・コンパイルなどが最適化されバイナリ、リソースがプロジェクトで使いやすい形になります。 SwiftPM は既存で存在する依存管理ツールの CocoaPods や Carthage とは違い Apple が OSS とし提供しているツールで、Xcode 9以降(Swift 3.0以降)に含まれています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/292456/9b7756ad-eaa0-b5ec-afaf-4847e097815a.png)
### ライブラリを導入してみる
SwiftPM はXcode10 以前は `Package.swift` などに依存先を記述して、コマンドラインからのみビルド・実行しかできませんでした。そのため、サーバサイドや CU
web側がユニバーサルリンクの対応するときの備忘録
# ユニバーサルリンクの対応【web】
## ユニバーサルリンクの設定についての備忘録
とあるプロジェクトで苦労したユニバーサルリンクについての備忘録を書いていきます。順を追って困った時何をしたか、仕様について書いていこうと思います。
### ユニバーサルリンク(Universal Links)とは
ios9からこの仕組みが利用できるようになりました。
webサイトをクリックしたときにiOSアプリを起動するための手法のことです。ディープリンクの一種です。### もともとのお客様の求めている仕様はというと
**「アプリを持っているときはアプリへ、持ってないときはAppStoreに飛んでほしい」** というものでした。
URLスキームであれば昔対応したことがあったのですが、ユニバーサルリンクは初めてでした。URLスキームと大して仕様かわらないっしょ!なんて軽い気持ちでいたがそんなことはなく、かなり大変でした。### 実装するにあたって必要な作業
ここからはios、web、サーバーで協力が必要だった必要作業です#### apple-app-site-association
MarketingCloudSDK In-App Messaging概要
# In-App Messagingとは
ユーザがアプリのプッシュ通知を許可していなくてもユーザにメッセージを配信できるアプリ内メッセージのことです。
アプリがフォアグラウンドの状態になる度にアプリ内メッセージが読み込まれ、SMCで作成したメッセージが、アプリのビュースタックの最上部に表示されます。(閉じたメッセージは再度表示されません)メッセージのテンプレートは以下3つがあります
・***フルページ***
レイアウトが画面全体に表示される
・***バナー***
画面最下部または最上部に表示される
・***モーダル***
画面の一部に全面表示される上記3つともSMCのContent Builderで設定可能です。
また色や、画像の配置、フォントサイズなどカスタマイズ可能になっています。
※文字のフォントに関してはデバイスのシステムフォントを使用しているため、アプリ側のフォント上書きの実装が必要です。通知するには***JourneyBuilder***からアプリ内メッセージの送信が必要です。
#実装
以下、公式ドキュメントから参照となります。1.アプリ内メッセ
UITableView.tableHeaderViewにNibファイルから設定する場合
UITableView.tableHeaderViewにNibから生成されたViewを設定した時に、高さが0になってしまう現象に遭遇しました。
(何度かはまっている)## 探してみた
`UITableView tableHeaderView auto layout`でググってみても解決策が出てきませんでした。
以下は試してみましたができなかったものです。
– https://qiita.com/AkkeyLab/items/9864c741b9adb633b321
– https://bugsdb.com/_en/debug/094735585326ee5e720638561d7e4ea6## 解決方法
– Nib側のautoresizingで上下矢印の`Flexible Height`に印がついているので、外します。(上下矢印が消える)
– 中身について上下左右にAutoLayoutで制限をつけます
– UITableView.tableHeaderViewにNibから生成したViewを入れます
– AutoLayoutエラーが起きていないことを確認します![スク
[iOS]Push通知を実装するにあたり、つまずいた点
##前書き
iOSでPush通知を実装しようと奮闘していましたが、
プログラミング初心者の私がつまずいた点をいくつか紹介しますサーバーはニフクラを使用しました
以下の記事を参考に作成しました
[Swiftでプッシュ通知を送ろう!](https://qiita.com/natsumo/items/8ffafee05cb7eb69d815)
[NIFCLOUDのgithub](https://github.com/NIFCLOUD-mbaas/SwiftPushApp)##つまずいた点
###1,証明書を何度も作り直してしまった
証明書を何度も作り直すことにより、PCが混乱してしまうことがあるので
キーチェーンアクセスから必要のない証明書を削除しましょう###2,APNs用証明書(.p12)の作り方がわからなかった
以下参照
[iosでプッシュ通知の証明書を.p12形式でexportしようとしたら.p12形式が選択できない問題について](https://qiita.com/akidon0000/items/a2fe1c8880980058b4f8)###3,AppleDe
iOS ReplayKitを調べてみた
iOS ReplayKitを調べた内容を纏めてみました。
# 環境
– macOS Big Sur 11.0 Beta
– Xcode 11.6
– 実機 iOS 13.6# 機能概要
ReplayKitの主な流れ
– ReplayKitはiOS9から追加
– iOS11からアーキテクチャが変更され、RepalyKit2に
– iOS11からコントロールセンターの画面収録機能が追加ReplayKitには、主に2つの機能がある
## 1. 画面録画
### 1.1. Screen Recording(iOS9〜)
– 実行中のアプリを録画し、プレビューコントローラーから写真や共有で保存
![スクリーンショット 2020-08-17 22.45.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237942/15807d06-96f2-d84e-0e44-0844998cdb28.png)### 1.2. In-App Screen Capture(iOS11〜)
– 実
[Multiple commands produce ‘/Users/ユーザ名/…省略…/Info.plist’]が発生した場合
#### 問題
Info.plistを誤って削除してしまい、手動で追加し直した。
その後、エミュレータでアプリを実行すると下記のようなエラーが出るようになった。“`
Multiple commands produce ‘/Users/ユーザ名/Library/Developer/Xcode/DerivedData/Runner-hogehoge/Build/Products/Debug-iphonesimulator/Runner.app/Info.plist’:
1) Target ‘Runner’ (project ‘Runner’) has copy command from ‘/Users/…省略…/Info.plist’
2) Target ‘Runner’ (project ‘Runner’) has process command with output ‘/Users/…省略…/Info.plist’
“`
#### 対応Xcodeで下記の場所まで移動。
Runner → Build Phases → Copy Bundle Resources
Copy
UIFeedbackGenerator を使おう
## 概要
UIFeedbackGenerator は UI にフィードバックを追加するための、フィードバックジェネレーターの抽象クラスで、フィードバックの種類別に下記の3つの具象クラスが存在し、それぞれ iOS10 以降で使用することが可能です。
– [UIImpactFeedbackGenerator](https://developer.apple.com/documentation/uikit/uiimpactfeedbackgenerator)
– [UISelectionFeedbackGenerator](https://developer.apple.com/documentation/uikit/uiselectionfeedbackgenerator)
– [UINotificationFeedbackGenerator](https://developer.apple.com/documentation/uikit/uinotificationfeedbackgenerator)基本的には、UIFeedbackGenerator を自身でインスタンス化す
ask me! appのログイン画面の実装
#1 この記事の内容
ask me! appでのログイン画面の実装方法について記載します。画面レイアウトは下記のとおりです。
![quitta①+.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/681104/a12634d1-d61e-627d-f6a0-1a79eb294dd6.jpeg)
#2 ソースコード概要
ソースコードの概要は下記の通りです。
“`dart:login.dart
@override
Widget build(BuildContext context) {
return
new GestureDetector(
onTap:()
{
_focusNodePwd.unfocus();
},
child:new Scaffold(
appBar: new AppBar(
centerTitle: true,tit
【Flutter, Dart】ミュータブルの代償ととイミュータブルの代償、そしてfreezed
# はじめに
本記事は [The Mutability Tax](https://medium.com/@davidmorgan_14314/the-mutability-tax-6403d84f21c0) をベースにしています。
意訳・抜粋しまくったので翻訳記事と呼ぶには忍びないですが、記述の足らない箇所があれば元の記事を参照してください。
筆者の David Morgan 氏はGoogleのソフトウェアエンジニアです。
元記事の公開は2019年7月15日です。
本文中に登場するコードは `Dart` で記述されています。[The Mutability Tax](https://medium.com/@davidmo
【iOSアプリ内課金のテスト】サブスクリプション自動更新時間の進み方
サブスクリプションの課金テスト時に、毎回調べてしまうのでメモ&Tipsです。
## 定期購読更新の時間は早回しで進む
Sandbox環境下では、サブスクリプション更新期間の時間は早回しで進みます。
表でまとめると以下になります。
### 更新期間の比較
|本番|Sandbox|
|:–|:–|
|7日|3分|
|1ヶ月|5分|
|2ヶ月|10分|
|3ヶ月|15分|
|6ヶ月|30分|
|1年|60分|## 自動更新は6回まで
– **Sandbox環境では6回しか自動更新されない**
例えば、1ヶ月更新のプランだと、半年で自動更新が終了します。
テスト環境での時間を計算すると
**“`5分(1ヶ月)×6回更新=30分“`**
で自動更新が切れるので
プラン購入から30分後に、**ユーザが更新継続しなかったパターンをテスト**する事が出来ます。
なお、本番環境では設定アプリから「購読の停止」がいつでも行えますが
Sandbox環境ではその設定が無く、手動で停止する事が出来ません。(自動更新切れを待つしかない)
## 無料トライアルを設定してい
iOS Keyboard Extensionでキーボードを介さない操作を検知する
iOSの純正キーボードは超絶多機能です。ちょっと考えただけでもこんな機能がついています。
* 入力中の文字を薄い青色(ダークモードでは黄色)でハイライトする。
* 点滅するカーソルをドラッグすることによるカーソルの移動を検知し、変換候補を変更する。
* 点滅するカーソルをドラッグすることによるカーソルの移動を検知し、入力中の範囲から外に出られないようにする。
* 入力範囲外をタップした場合入力中の文字を確定する。
* 選択されているテキストを取得し、再変換する。
* ペースト操作が行われた場合検知し、入力中の文字を確定する。
これは高度な機能です。実際私が日本語対応のkeyboard extensionを漁った限り、純正キーボードと同じ挙動を再現できているものはほとんどありませんでした。
![iOS keyboard extension functions.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638786/3312b906-27f9-75fc-aa93-1234e97547f2.png)