- 1. Stack Viewは便利ですね?
- 2. Create MLで自動車部品の不良品検知
- 3. iOSデバイスからAzure上の仮想ネットワークにP2S接続する
- 4. String.split(separator:) で Xcode Previews がコケる
- 5. Udemyのswiftコース(英語のやつ)でiOSアプリ開発を学ぶ その3
- 6. iOS のライブラリを自作して Carthage と CocoaPods で公開する。CI で自動化まで。
- 7. 複数のボタンを、1つの変数でまとめる。
- 8. ボタンの角を丸くする?
- 9. [swift5]エラーNo such module ‘ライブラリ名’
- 10. Buildしたけど真っ黒、アルアル原因まとめ
- 11. manacaでiOSアプリをカスタムビルドする流れをシーケンス図に起こした
- 12. サードパーティ製アプリをiOS標準Webブラウザとして登録するための条件
- 13. MarketingCloudSDK iOSでリッチPush通知を送信する
- 14. 【Swift】ゼロからのCombineフレームワーク – ユニットテストを書いてみる
- 15. PickerViewの実装までの流れ
- 16. UISliderの停止位置をInt値に固定する
- 17. [Xcode] Xcodeのディレクトリ構成と実際のプロジェクト構成の乖離を修正する
- 18. [翻訳] iOS 14 標準Webブラウザ対応
- 19. 日本人のための SwiftFormat【概要編】
- 20. 6行で UIView を UIImage に変換してサクッと画像を保存する
Stack Viewは便利ですね?
## Stack Viewは便利ですね。
Swiftを始めて、3日目。
Stackについて学んだので、簡単にまとめ。-[**【Swift】超便利StackViewの実践的使い方!まだAutoLayoutで消耗してるの?**]
(https://qiita.com/kinopontas/items/d08f84dbb711c5acbe28)
-[**遅ればせながら UIStackView 入門**]
(https://qiita.com/tasanobu/items/6908c956b758547ccf6c)と言っても、他サイト引用です。?
###-Stack
「レイアウトの修正が大変…」という“`Auto Layout“`の欠点を解決してくれます。
最低限の“`AutoLayout“`の設定で済む、良心的な機能です。## 補足
右下に5個並んでるボタンについて、ちょっと補足。
#Create MLで100%検知
目視できるレベルの金属部品の表面異常検知であれば、 **Create MLで十分な高精度を達成できます。**Pythonに潜って専用モデルを探したり、カスタムモデルをつくる必要はありません。
**我々が自動車部品メーカーとの技術研究で100%の検知結果を出した**Create MLでの画像分類タスクの取り組みについて紹介します。
###Create MLは表面異常検知の現場で使えるのか
自動車に用いられている4cm程度の細長い部品の表面異常検知をおこないました。
**傷の大きさは1〜4mm程度。**
![良品.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/07d51e2b-1188-a655-031b-f52433af1686.png) ![不良品.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/bc475fd4-0ec6-397f-19da-c8
iOSデバイスからAzure上の仮想ネットワークにP2S接続する
# 背景
iPhoneやiPadから、Azure上の仮想ネットワークにP2S接続(ポイント対サイト接続)したくなったのだが、Microsoftのドキュメントは要点が掴みづらくてわかりにくいし(機械翻訳の影響か?)、Google先生に聞いてもドンピシャな回答が見つけられなかったので、その手順を記す。
# 調査
## そもそも、iOSデバイスでAzureにP2S接続できるのか?
[公式ドキュメント](https://docs.microsoft.com/ja-jp/azure/vpn-gateway/point-to-site-about)には、
> ポイント対サイト VPN では、次のいずれかのプロトコルを使用できます。
>
> * SSL/TLS ベースの VPN プロトコルである OpenVPN® プロトコル。 ほとんどのファイアウォールは、TLS で使用されるアウトバウンド TCP ポート 443 を開いているため、TLS VPN ソリューションはファイアウォールを通過できます。 OpenVPN は、Android、iOS (バージョン 11.0 以上)、Windows
String.split(separator:) で Xcode Previews がコケる
SwiftUIで画面を実装中していたらXcode Previewsで表示していたプレビューが突然できなくなった。
Diagnosticsを開くとこんなエラー
“`
Compiling failed: global function ‘__designTimeString(_:fallback:)’ requires that ‘String.Element’ (aka ‘Character’) conform to ‘ExpressibleByStringLiteral’
“`エラーの行も表示されるので当該箇所を見たら大体こんな感じ
“`swift
let str = ~
let array = str.split(separator: “\n”) // ← ここでエラー発生
.map(String.init)
“`どうやら`”\n”`(String Literal)がXcode Previews上だと`Character`として認識されないらしい(なぜ?)
# 解決策
Characterであることを明示すれば良い。
“`swift
let arr
Udemyのswiftコース(英語のやつ)でiOSアプリ開発を学ぶ その3
勉強するコースはこれです:point_down:
https://www.udemy.com/course/ios-13-app-development-bootcamp/##進捗
セクション4の途中まで終了(全部で36セクション)
Xcodeの使い方など開発環境について実際の操作を学び、アプリをつくった:grinning:最初はただ表示するだけのアプリ。二つ目でタップしてサイコロの目を出すアプリを開発する(ようだ)。
##感想
前回の記事([Udemyのswiftコース(英語のやつ)でiOSアプリ開発を学ぶ その2](https://qiita.com/KitaDaro/items/197ee6f32611b5acb886))から2週間以上も間があいてしまった…
提出期限とかないしコース視聴いつでもできるし、Angela(先生)の優しさに甘えてしまった(オンラインコースあるある)
**やはり絶対にこの曜日のこの時間にやるとか決まり事をつくって習慣化していかないとオンラインコースは続かないのだ(戒め)**何はともあれアプリをつくって自分のiPhoneで表示させるのは実に気
iOS のライブラリを自作して Carthage と CocoaPods で公開する。CI で自動化まで。
こんにちは。iOS エンジニアです。
というふうに名乗っていながら、iOS 向けのライブラリを作ったことがなかったので、やばいと思って作ってみました。
作成中の一連の流れを記事に残したいと思います。
(具体的なコードの書き方とかではないです。)# 成果物
https://github.com/yuki0n0/WaveSlider/
以下解説するものは、こちらのライブラリを作成したときの情報に基づいています。中身自体は大したものではないんですが、
ライブラリ公開の経験をしたかったという動機なのでお手柔らかに、、、
よかったら GitHub で **Star ★** つけてね。# 作成
## 1. プロジェクト作成
Framework を選択して、次の画面で選択して、プロジェクト作る。
複数のボタンを、1つの変数でまとめる。※**オブジェクト**
(Label とか Buttonとか Text Field とかもオブジェクト。)
(Swiftは、オブジェクト指向言語。)
[**「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典**](https://wa3.i-3-i.info/word1119.html)##複数のオブジェクトを、1つの変数でまとめる。
こんな感じで、**複数のボタンを並べたい**とき、
“`var Button1“`, “`var Button2“`, “`var Button3“`, “`var Button4“`,でも良いのですが、
(“`@IBOutlet weak var Button1: U
ボタンの角を丸くする?
## ボタンの角を丸くする?
Buttonを、中流の河原の石にしたいと思います。
侵食作用を及ぼすコードは、以下の通りです。“`
@IBOutlet weak var startButton: UIButton!override func viewDidLoad() {
super.viewDidLoad()startButton.layer.cornerRadius = 10.0 <-------------- } ``` -```Outlet```で接続したのち、 ```startButton.layer.cornerRadius = 10.0```を記述し
[swift5]エラーNo such module ‘ライブラリ名’
## エラー状況
画像のようにXcodeでビルドを行うと`No such module ‘ライブラリ名’`というエラーが発生する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643372/bc049112-f057-ea15-74c1-0b4225ed76f7.png)## 対応したこと
①Xcodeの再起動
②Macの再起動
③podfileの確認と`pod install`を再度実行①〜③全て不発…
検索を行い色々と模索していると解決しそうな記事に遭遇!
https://qiita.com/doge_kun55/items/26ac2fa2031ddbeee879## 解決方法
Xcodeのツールバーにある`Product/Scheme/ManageSchemes/`を選択。
すると以下のようにページが開く。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6433
Buildしたけど真っ黒、アルアル原因まとめ
# Buildしたけど真っ黒、アルアル原因まとめ
2点。
### 1, NSUnknownKeyException
お笑い養成所(NSC)ではなく、NS Unknown〜(※)です。
“`ViewController“`と“`Main StoryBoard“`を繋げるとき、 やっぱ繋げるのやめようってなって コードを削除しても、**繋がりは切れません**。
**不要な接続が繋がったままだから、エラーが起きるみたい。**
[**NSUnknownKeyExceptionが出た時の回避方法**]
(http://ios.steppers-hi.net/?eid=24)![20130925_1583616.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/683795/b33ba891-285f-142a-f9f1-75d090dfeb25.png)
ユーティリティーエリアの、**Show the Connection Inspector**からも同じ操作できます。
(メニューバーの、一
manacaでiOSアプリをカスタムビルドする流れをシーケンス図に起こした
monacaを使って、iOSアプリをカスタムビルド(自分の端末でのみ動くアプリのビルド)を行ったのですが、
monaca側でやれることと、Apple developer Programでやれる事の区切りや、CSR・証明書・プロファイル・BundleIdなどのよくわからない登場ファイルたちがどこで作られどう使われるのかが、全くわからなくなるので、とりあえずシーケンス図にして流れを書き起こしました。
完全自分のためです。シーケンス図は、manacaでの開発が終わり、Appleに開発者の登録も行っている状態から始まります。
なぜなら、私がその状態でこれを作ろうと思ったからです。![iosAuth.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/98758/3225b892-ece4-e0ce-53b3-f9b850966771.png)
以上です。
自分的には役に立ったので、(一度やり直した)きっと誰かの役に立つと信じてます。
信じるって大事。一応このUMLはplantUMLを使ったのでソース載
サードパーティ製アプリをiOS標準Webブラウザとして登録するための条件
iOS14では、デフォルトで起動するWebブラウザを「Safari」以外のアプリにユーザー自身が設定できる様になります。
今回「サードパーティ製アプリが標準ブラウザになる為の要件」が公開されたので簡単にまとめてみました。## 概要
標準ブラウザになる為の各要件をクリアする
↓
Appleへメール(default-browser-requests@apple.com)で申請という流れになる様です。
承認後は、Entitlementsに「com.apple.developer.web-browser」キーを追加する形に?
## 標準ブラウザになったら出来ること
> Be an option for the user to choose as their default browser.
– 「標準で開くブラウザ」としてユーザが選択出来る様になる
> Load pages from all domains with full script access.
– フルスクリプトアクセスですべてのドメインからページをロード可能に。
> Use Service Worke
MarketingCloudSDK iOSでリッチPush通知を送信する
#環境
・xcode Version 11.3.1 (11C504)
・swift Version 5.1.3
・MarketingCloudSDK iOS (v7.2.1)
・Mac OS 10.14.6(Mojave)
#準備
[MarketingCloudSDK iOSでシンプルなpush通知を送信する](https://qiita.com/techman/items/a136c903ea74f065b92c)
の続きとなります。
#リッチPushとは
push通知を開くと遷移したいurlに飛べたり、push通知に画像、動画などを表示することができる。
#リッチPush通知の実装
1.opendirect機能(ディープリンクとも呼ばれる)“`AppDelegate.swift
MarketingCloudSDK.sharedInstance().sfmc_setURLHandlingDelegate(self)
“`
上記コードをSDKの初期設定記述の後に、AppDelegate.swift内に記述する。
その後、
`MarketingCloudSDKURLHandlin
【Swift】ゼロからのCombineフレームワーク – ユニットテストを書いてみる
# Combineを使ったユニットテストの方法
2つの方法を試してみました。
1. ライブラリなしでやる
2. [Entwine](https://github.com/tcldr/Entwine)というテスト補助用のライブラリを使う# テスト対象コード
`incrementCounter: PassthroughSubject`の`send`メソッドが呼ばれたら、自身の`counter: Int`に数値を加えて、`counterStr: CurrentValueSubject`を更新する単純なモデルです。
テストコードでは、`incrementCounter`の`send`メソッドの呼び出しにたいして、`counterStr`が正しく更新されていることをテストします。
“`swift:CounterViewModel.swift
import Combine
import Foundationprotocol CounterViewModelProtocol {
var incrementCounter: PassthroughSubject
PickerViewの実装までの流れ
# はじめに
pickerviewの実装について記事を書いていこうと思います。
駆け出しエンジニアということもあるのでご指摘などございましたらご教授よろしくお願いします。
(swift5.4.2)
まずPickerの実装をするまでの工程を紹介します。
1.UIPickerViewDelegate UIPickerViewDateSourceの定義と設定
2.UIPickerViewの列と行とデータ要素の数の設定
3.UIPickerViewの標示する配列の設定#ゴール地点!
![AnyConv.com__画面収録 2020-08-04 22.20.16.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669384/f867e2ac-e941-1296-6274-424200681af7.gif)
#1.UIPickerViewDelegate UIPickerViewDateSourceの定義と設定について
まず
Delegateとは?
移譲や任せるなどという意味らしく、他にはデザインパターン
UISliderの停止位置をInt値に固定する
# UISliderとは
UIKitで提供されている下記のようなUIパーツです。主につまみ部分(Thumb)をTrack上でドラッグすることで値を変えることができます。公式リファレンスの絵では、画面輝度の設定を想定したものになっています。
![UISliderの構成要素(公式リファレンスより)](https://docs-assets.developer.apple.com/published/e0791617a4/14f9f16e-55c0-474a-ae62-f42ebf2cab33.png)
# 使い勝手が微妙に悪い…
標準で提供されているのですが、いくつか使い勝手が悪い点があります。
– 値がFloat型になっており、Int型を扱いずらい
– 目盛りの設置が難しい今回、この辺りを試行錯誤してみました。
# 完成版
![output.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202533/9e9b8b39-7f44-a2de-bd45-a34cc7eaa0f0.gif)
サン
[Xcode] Xcodeのディレクトリ構成と実際のプロジェクト構成の乖離を修正する
# 概要
あんまりないケースですが実務上、Xcodeで指定のディレクトリ上でファイルを新規追加したつもりがFinderで確認すると、全然違う箇所に作成されていた・・・というケースがあり困りました :sob:
(新規作成時に表示されるウィンドウ内のFinder上でどこに配置されるかをちゃんと見れば、問題は回避できますが初期表示で出ているディレクトリが全然違う場所を指している現象がよくわかっていません・・・)
# 前提
* Xcode11.5
* Xcodeのディレクトリ構成が正
* Finder上の実際のディレクトリ構成が誤とします
Xcodeのディレクトリ構成自体が間違いの場合は以下の記事を書いた人のが参考になります↓
[【Xcode】開発途中に手動でディレクトリ構成を変更する](https://qiita.com/naipaka/items/b73ec1fe4c7b52bcb24d)Xcodeのディレクトリ構成は↓
![スクリーンショット 2020-08-05 0.56.46.png](https://qiita-image-store.s3.ap-north
[翻訳] iOS 14 標準Webブラウザ対応
[Preparing Your App to be the Default Browser or Email Client](https://developer.apple.com/documentation/xcode/allowing_apps_and_websites_to_link_to_your_content/preparing_your_app_to_be_the_default_browser_or_email_client) から標準Webブラウザ対応の部分を訳しました。
(2020/08/05 時点のものです)訳や解釈に問題があったら教えて下さい。
—-
## アプリを標準Webブラウザにする設定
iOS 14以降、アプリを標準Webブラウザとして機能させるには`com.apple.developer.web-browser` managed entitlementが必要になる。これはAppleにメール( _default-browser-requests@apple.com_ )を送り、許可を得ることで使えるようになる。
### 必ず満たさなけ
日本人のための SwiftFormat【概要編】
## SwiftFormatとは?
SwiftFormat は MacOS または Linux で Swift コードを再フォーマットするためにコマンドラインツールです。
## なぜ使うのか?
プロジェクトをチームで行う際にコーディングスタイルを統一することで、コードの見やすさや・追いやす
さが向上しますが、これらを認識のあっていないチームで行うとコードのフォーマットの違いを指摘・修正
を手動でオペレーションすることにコストがかかります。これらの作業を SwiftFormat で自動化するこ
とで開発者はコードの動作に集中できるようになります。## どうやって使うのか?
現在は下記の4通りの方法があるみたいです。
1. コマンドラインツールとして手動で実行するか他のツールチェインの一部として使用する
2. Source Editor Extension として Xcode の [Editor] > [SwiftFormat] メニューから呼び出す
3. Xcode プロジェクトのビルドフェーズ(Run Script?)として、`Cmd-R` or `Cmd-B`を押す
6行で UIView を UIImage に変換してサクッと画像を保存する
# はじめに
今回は特定の View を UIImage に変換してフォトライブラリーに保存できるようにします
# 実装
### プロパティを追加
UIView から image を取得するための ExtensionProperty を追加します。
“`swift
extension UIView {
var image: UIImage {
UIGraphicsBeginImageContextWithOptions(bounds.size, false, 0.0)
let context: CGContext = UIGraphicsGetCurrentContext()!
layer.render(in: context)
let capturedImage: UIImage = UIGraphicsGetImageFromCurrentImageContext()!
UIGraphicsEndImageContext()
return capturedImage