サクサク読めて、アプリ限定の機能も多数!
トップへ戻る
今年の「#文学」
blog.kishikawakatsumi.com
先日のtry! Swift 2024にて「Accessibility APIを使ってアプリケーションを拡張する」という発表をしました。 tryswift.jp スライド: speakerdeck.com 台本とアニメーション付きのスライド: github.com サンプルコード: github.com Accessibility APIとはUIテストや自動化システムなどで使われている、別のプロセスからアプリケーションの情報を読み取ったりボタンを押したりなど操作することができるAPIです。 スクリーンリーダーやボイスオーバーなどで自身のアプリケーションを操作可能にすることもAccessibility APIの役割ですが、今回は自身をアクセシブルにすることではなく他のアプリケーションを操作することで機能を付け足したりできる、ということを題材にお話ししました。 VS Codeや一部のIDEではA
現在Swiftにマクロを導入しようという提案がSwift Evolutionのレビュー中*1です。 SwiftによってSwiftの構文を拡張できる、いわゆるメタプログラミングと呼ばれる機能です。 実はマクロの他にもSwiftでメタプログラミングを実現する機能の提案が複数提案*2*3されています。 Swift 6はメタプログラミングの時代になるかもしれません。 現代的なプログラミング言語のマクロ みなさんはマクロと聞いて、どのような機能を想像しますか? C言語のマクロは、プリプロセッサと呼ばれるコンパイル前のプログラムによってプログラムのソースコードに置換や文字列連結を行う機能でした。 原理的には単なる文字列操作なので、プログラムの構造や型を破壊する可能性がありました。 最初のマクロに関する投稿に対しての否定的なコメントは、C言語のマクロのような機能をSwiftに導入することは危険だという意
公式に提供されているChrome機能拡張とだいたい同じような使い勝手になっています。 ソースコードはこちら github.com 機能概要 ページ全体の翻訳(Proユーザーのみ) 選択したテキストを翻訳(誰でも) その他のスクリーンショット 📱 iOS app iPad app 💻 Mac app
先日のiOSDC 2022にて「アニメーションAPIのすべて」という発表をしました。 fortee.jp きっかけはDroidKaigi 2021で荒木佑一さんの「動かす」という発表です。 www.youtube.com Androidのさまざまなアニメーション APIについてコードや具体的な例を用いて解説する内容です。最後にスライド自体がAndroidアプリとして作られていて、サンプルのアニメーションはすべて実際に動いていたものだった、と明かされるところが非常におもしろいと思ったのです。ぜひこれのiOS版をやろうとそのとき考えたのでした。 ちなみに、荒木さんはそれ以前のDroidKaigiや別のカンファレンスでも「動かす」シリーズで話されているので資料などを探して読んでみるとどれもおもしろいです。 ということで1年間あたためていたアイデアが無事採択されたことはよかったのですが、さすがにこ
未サポートのOSでバージョンが古すぎたり新しすぎで起動できないXcodeを起動するには、Terminal.appで $ /Applications/Xcode-beta.app/Contents/MacOS/Xcode のようにパッケージの中の実行ファイルを直接実行すると起動できる。 または、アプリケーションアイコンを右クリックしてShow Package Contentsを選んで、MacOS、Contentsとフォルダを開いてそこにあるXcodeの実行ファイルをダブルクリックでもOK。GUIでやりたい場合はこっち。 この方法で起動した場合、しばらく放置していると勝手に終了してしまったりするので、いつの間にか終了していた場合はやり直す。 stackoverflow.com
スマートドアベル「Google Nest Doorbell (Battery Type)」を買って4か月ほど使ったので感想を書きます。 store.google.com 要約 簡単に試したり現状回復を優先するなら設置は両面テープで 既存のドアホンがカメラ付きならドアホンとしての性能を超えることはなく、利点はスマートフォン等で手元で応答できるという一点だけなのでそこが魅力と感じるならアリ 充電しながらの使用はできない。電源の配線をしない場合は定期的に取り外しての充電が必要。 設置 キレイに設置するなら既存のドアホンを外してマウントをネジ止めして、、、とすると良さそうですがそれなりに面倒なのと原状回復のために取り外したものを保管しておくのも大変なので、設置は両面テープでやることにしました。 ただ、単に既存のドアホンの隣に付けてしまうと間違いなく既存のドアホンの方が使われてしまうので既存のドアホ
Xcodeによるユニットテストの実行結果をCIサービスの画面で確認するのはなかなか大変です。 GitHubにはCIのステータスをそこそこリッチな画面表示として返せて、Pull Requestの画面から1クリックでアクセスできるGitHub Checksがあるのでそこで確認できればとても便利です。 ということでXcodeのテスト結果をGitHub Checksに表示するGitHub ActionとBitrise Stepを作りました。 github.com Xcodeがテストを実行した際に生成するXcode Result Bundleというテスト結果やログ、コードカバレッジ、スクリーンショットなどをすべてまとめたデータを解析して、Markdownの形式でまとめてGitHub Checks APIにPOSTする、ということで実現しています。 次のように、テストを実行する際にXcode Resu
【注意】この記事で紹介しているSMS APIサービスのVonageは利用規約により認証にVonageの電話番号を利用することを禁止しているという記述があるので、末尾の別解として載せたAndroidデバイスを使ってSMSを転送する方法が良さそうです。 help.nexmo.com 2021年2月から、App Store Connectにログインする際にすべてのApple IDで2ファクタ認証が必須になります。 Starting February 2021, additional authentication will be required for all users to sign in to App Store Connect. This extra layer of security for your Apple ID helps ensure that you’re the only
CIでいろいろなタスクを自動化していると、CIで必要とするAPIのトークンやアカウント情報など設定しているシークレット変数が増えてきます。 たいていの場合はCIサービスのシークレット変数を利用すればよいですが、サービスによっては一度設定したシークレット変数を見ることができなかったり(GitHub ActionsやCircle CIが該当)、トークンやアカウント情報の更新や追加があったときにCIの変数を更新していくのが大変だったり、シークレット変数のメンテナンスはそこそこ面倒な作業です。 性質上かなり強い権限が設定されているトークンだったりすることもあるので、誰がその値をメンテナンスできるか、という管理の問題もあります。 そこで1Passwordをアカウント情報の共有に使っている組織なら、1PasswordはCLIの操作が提供されているのでCIから1Passwordのアカウント情報を取得する
FolioのiOSチームではさまざまなタスクをそこそこ高度に自動化していると思うので、(そのまま別のプロジェクトで使いまわせるほどポータブルではないけど)参考にしてもらえる部分はけっこうありそうと思うので公開リポジトリに置いてみました。 github.com 簡単に解説します。 Fastfile lane :snapshot_test Folioアプリのユニットテストはいわゆる一般的なロジックテストに加えてスクリーンショットを用いたスナップショットテストがあります。 GitHub - uber/ios-snapshot-test-case: Snapshot view unit tests for iOS 目的は修正によって意図しない影響が起こっていないことを検証するためと、現状の画面の一覧をGitHubで変更管理したいからです(これについては詳細を後述)。 (ボタンを追加したら関係ないは
SwiftUI、Combile、RealityKitなどiOS 13以上の環境にしか存在しないフレームワークを使用するアプリをiOS 12以下の環境で実行すると、その機能を実際に呼び出さないようにしていたとしても、起動時にダイナミックリンクに失敗してクラッシュしてしまいます。 dyld: Library not loaded: /System/Library/Frameworks/RealityKit.framework/RealityKit Referenced from: /Users/katsumi/Library/Developer/CoreSimulator/Devices/7D73BD02-5C30-4723-9023-4D19BCDAE1AA/data/Containers/Bundle/Application/A9E00179-1DDD-4051-9207-7CC6C9DC
背景 現在のiOSアプリ開発におけるパッケージマネージャのデファクトスタンダード(事実上の標準)としてCocoaPodsとCarthageがあります。Xcode 11からはSwift Pacakge ManagerがXcodeに統合されて利用できますが、ライブラリ側の対応が必要ということや、ベンダーライブラリなどを考えるとCocoaPodsは少なくとも当面は使われ続けるでしょう。 Carthageと違って、CocoaPodsは.xcodeprojに依存せず独自のビルドシステムを持つことや、(デフォルトでは)Workspaceにライブラリのプロジェクトを自動的に統合するので、リンクに関する設定をやらなくて済むという特徴があります。 しかし、これは長所でもあり短所でもあります。 リンクの設定を自動で追加するために、プロジェクトのビルド設定がCocoaPodsが自動で追加する記述によって非常に複
背景 今関わっているプロジェクトではOpenAPIを利用して、APIのスキーマを定義しています。 OpenAPIではスキーマ定義からクライアントコードを生成できます。 しかし、デフォルトのコード生成はスキーマ定義とネットワーク通信のコードが強く結びついており、使いにくい場面があると感じていました。 認証等がなく、単純なGETだけのエンドポイントを相手にしている場合はそうなっているのは便利だと思いますが、今のプロジェクトでは リクエストヘッダに認証トークンおよびアプリの情報を示す情報を追加する (デバッグビルドでは)リクエスト前と後にログ出力をする アクセストークンの期限が切れた場合は自動的にアクセストークンをリフレッシュし、シームレスにリトライする すべてのエンドポイントで発生しうるエラー(サーバーエラーの5xxや、クライアントエラーの4xx、強制アップデートや緊急メンテナンスなど)と、個
大型ディスプレイに投影するデジタルサイネージを作る仕事をしました。 できあがったのがこれです。 github.com まず、アートディレクターと相談して、下記の映像を参考にして3D空間を飛び回るようなスライドショーでいこうと決めました。 www.youtube.com www.youtube.com 最初のプロトタイプはCALayerだけで作りました。 CALayerは3Dの変形をサポートしていて、かつmacOSのCALayerではCore Imageのフィルタがエフェクトに使えるので、各層のレイヤーに次のように書くだけで遠くなるにつれてブラーをかけてぼやかせる、ということが簡単に実現できます。 let frontLayer = CALayer() frontLayer.frame = layerFrame if let filter = CIFilter(name: "CIGaussia
ほとんどのUNIX系OSにおけるCライブラリはAutotoolsを使って開発されています(./configure && make installの手順でビルドする)。 普通に./configure && make installすると実行している環境(MacやLinux)用のバイナリが生成されますので、そのままではiOSで利用できません。 iOSで使用できるようにするにはiOS環境用にビルド、いわゆるクロスコンパイルする必要があります。 Autotools(./configure)ではクロスコンパイルのことが初めから考慮されていてそのための機能がサポートされているので、./configureの設定を正しくできれば、意外と簡単にさまざまなCのライブラリをiOS上で動くようにビルドできます。 設定について iOSではデバイスとシミュレータでCPUアーキテクチャが異なるのでそれぞれのアーキテクチ
次に示すような見出しと各カラムが右寄せ、ラベルの文字数によってカラムの幅が伸縮し、広くなった場合は隣の列を押し出し、短くなった場合は少なくとも見出しの幅に収まり、各列の間には一定のマージンを置くというテーブルレイアウトを、静的なAuto Layoutの制約だけで作ることを考えます。 このような、UIコンポーネントが持つコンテンツの大きさによって隣接するコンポーネントを押し出すような場面ではAuto Layoutがとても効果的に働きます。 Auto Layoutなしで実現しようとすると、列ごとの各行の文字幅を計算し、最大の幅に合わせて再配置する、という処理をコンテンツが変わるたびに行うということになりますが、Auto Layoutの制約を使用する場合ではそもそもレイアウトの再計算を自分でやる必要はないので、コンテンツの変わったタイミングなどを気にする必要はありません。 ただデータを再代入する
TL;DR, 優先度の異なる複数の制約を同時に定義することで、静的な定義だけで動的な振る舞いを実現できる 動的な要素の少ない構造のビューはより堅牢である はじめに 読みやすくメンテナンスしやすいソフトウェアを作るために重要なことの一つは構造をシンプルに保つことです。 iOSアプリのビューは壊れやすいソフトウェアの代表ですが、できるだけシンプルに作ることで変化に強い、堅牢で壊れにくいソフトウェアにできます。 動的な要素が少ないということは、ビューがシンプルであるということの指標の1つと言えます。 この記事では下記に示すような、スクロールに合わせて伸び縮みするヘッダーを、動的な要素を無くし、Auto Layoutの静的な制約のみで実現する方法を解説します。 動的な要素とは、実行時におけるビューおよび制約の追加・削除、Frameや制約を更新することと、機種やスクリーンサイズ、標準UIコンポーネン
長いテキストが初期表示では折りたたまれて表示されていて、「つづきを読む」ボタンを押すことで表示エリアが拡大して全文が表示されるという挙動を、できるだけ動的な要素を排除して実現してみます。 サンプルコードは下記のリポジトリで公開しています。 github.com 今回の例ではUIStackViewを活用します。UIStackViewは内部のビューのisHiddenプロパティによってビューのサイズをゼロにできるので、うまく活用すればあたかも複数のレイアウトを切り替えているような挙動を実現できます。 テキストビュー(またはラベル)の左右両端と上端が一致するようにStack Viewに制約を付けます。 さらにテキストビューとStack Viewの高さが一致する制約を付けます。 Stack Viewの中のビューに高さの制約として折りたたんだときのサイズを指定します。例では200ptです。 テキストの
デバイス・OSバージョンの依存が少なく、メンテナンスしやすいビューを作る by Kishikawa Katsumi | プロポーザル | iOSDC Japan 2018 - fortee.jp iOSのビューをメンテナンスし続けるのはとても大変です。 アプリケーションが提供する機能や扱う情報が複雑化するに伴って、UIも複雑になっています。 10年前とは異なり、さまざまなサイズのデバイスが使われるようになり、インタラクションの手段も増えました。 一つのアプリケーションをチームで開発することが主流になり、分担して開発する必要が出てきました。 そのような状況で、既存のコードを壊さないようにソフトウェアを継続的に改善していくということは簡単ではありません。 特に、ビューはもっとも壊れやすく、かつ壊れていることに気づくことが難しい種類のコードです。 現在私が所属しているFOLIOという会社で携わっ
speakerdeck.com 日本で開催されるもっとも大きなiOSに関するカンファレンスの1つであるTop | iOSDC Japan 2017に参加し、表題の内容で発表しました。 聴いてくださった方々からは好評のようでよかったです。発表資料は本題と関係のない話がちょこちょこ挟まったり、口頭の説明がないとわからないページがあり、スライドだけでは意図がよく伝わらない恐れがあるので、こちらで内容について補足します。 伝えたかったテーマは「依存が大きく複雑で、単体でテストしづらいコードを単体で動かしてテストできるようにするには」ということです。その題材として一般的に依存が複雑でテストしづらいコンポーネントであるビューを例として取り上げました。ですのでビューやUIをテストするということに絞った話ではなく、どのレイヤーに対しても複雑にいろいろな依存関係があってユニットテストが書けないという状況を改
いよいよ明日はtry! Swift Tokyo 2017が開催されます。 try! Swift Tokyo 2017を最大限楽しんでいただくために、ちょっとしたコツをお話しします。 公式アプリ try! Swift公式アプリがAppStoreから配信されています。タイムテーブルやセッション概要などが掲載されていますので、事前にインストールしておきましょう。Apple Watchを持っていれば時計の文字盤に情報を表示することもできます。 try! Natalya Murashevソーシャルネットワーキング無料 ソースコードはこちらです。興味のある方はPRを送ってください。 github.com github.com 公式Slackチャンネル 参加者のみなさんをtry! SwiftのSlackチャンネルにご招待しています。もし、招待メールが届いていない方は info@tryswiftconf.
try! Swiftは世界中のSwiftデベロッパーが一堂に会し、Swiftに関する知見を共有するカンファレンスです。国内外からSwiftデベロッパーが参加する、世界最大級のコミュニティでもあります。 会期は2017年3月2日〜4日の3日間、うち2日、3日は招待講演とライトニングトーク、4日はハッカソンを行います。 TOKYO - try! Swift 今回はより多くの方に来場していただけるように広い会場を確保しました。およそ前回の1.5倍(800〜900人)の方にお越しいただけます。 すべての講演とQ&Aにはプロによる同時通訳を提供いたしますので、英語に自信がなくても問題なく楽しんでいただけます。 現在(Webサイト)https://www.tryswift.co/tokyo/jpには18名の講演者が掲載されていますが、さらに4名、合わせて22名の講演を予定しています。 たとえば、Fas
前回の記事では、カンファレンスをより楽しむために積極的に人と(特に海外の人と)話そうと書きました。しかしそうはいっても、言葉に自信がなかったりしてなかなか積極的に話しかける勇気が持てないかもしれません。 でも心配いりません。懇親会(ミートアップ)の会話はほとんど決まった形で始まるので、それを覚えておけばとりあえずなんとかなります。 挨拶と自己紹介のプロトコル とりあえずこの手順だけ覚えておきましょう。以下の流れから外れることは90%ありません。 (相手を見て)声をかける「Hi」 名前を言う。「I'm Katsumi」/「My name is〜」 「どこで働いてる/何をしている」か聞かれるので答える。「I'm iOS developer, work at Realm」/「I'm working at Realm. I develop〜」 要するに、1. 声をかけて、2. 名乗って、3. 自己
いよいよ今週はtry! Swift 2016が開催されます。 せっかくの機会ですので貴重なチケットを手に入れられた方にtry! Swift 2016を最大限楽しんでいただくために、ちょっとしたコツをお話しします。 公式アプリ try! Swift公式アプリがAppStoreから配信されています。タイムテーブルやセッション概要などが掲載されていますので、事前にインストールしておきましょう。Apple Watchを持っていれば時計の文字盤に情報を表示することもできます。 try! Natalya Murashevソーシャルネットワーキング無料 公式Slackチャンネル 参加者のみなさんをtry! SwiftのSlackチャンネルにご招待しています。もし、招待メールが届いていない方は [email protected] にご連絡ください。Slackでは自己紹介や、質問など、自由に参加者お
try! Swiftはエンジニアが主役のSwiftに関するカンファレンスです。今回は会期を3日間(!)、著名エンジニア(海外・国内)による招待講演を予定しています。 http://www.tryswiftconf.com/ 講演とプログラムについて 現在Webサイトには12人の講演者が掲載されていますが、さらに21人、合わせて33人の講演を予定しています。 会期中は、セッション以外にもオフィスアワー、アフターパーティ(懇親会)なども検討しています。 特に海外から来られる講演者の方々は皆、日本のデベロッパーとコミュニティのことを知りたいと強く考えています。 そのため、オフィスアワーや懇親会の時間以外でも、ランチタイムや朝食の時間などに講演者の方と直接話すことのできる機会を多く設ける予定です。 日本にいながら、世界のトップレベルのエンジニアの方々と直接コミュニケーションをとれる機会は非常に貴重
TL;DR, $ nscurl --ats-diagnostics --verbose https://kishikawakatsumi.com/のようにnscurlコマンドに--ats-diagnostics --verboseオプションをつけて実行すると、指定したドメインがATSの要件を満たしているかどうかをチェックし、デフォルトの設定でエラーが起こる場合はエラー回避するための設定まで教えてくれます。 developer.apple.com iOS 9からATS (App Transport Security)の仕組みが導入され、HTTP(HTTPSでない)通信はブロックされ、HTTPSでも接続先がATSの要件を満たしてない通信についてはデフォルトで失敗するように変更されました。 HTTPの通信はブロックされます。 App Transport Security has blocked
昨日はじめて知ったのですが、StoryBoardやXIBファイルはプロジェクトやターゲットのDeployment Targetとは別に、各ファイルごとに個別にDeployment Targetを設定することができます。 例えば、iOS 8以上にしか存在しないUIVisualEffectViewや、iOS 9以降でしか使えないUIStackViewをStoryBoardで配置して、プロジェクトのDeployment Targetを7.0(や8.0)にすると、下記のエラーでビルドに失敗します。 Main.storyboard: error: Class Unavailable: UIVisualEffectView prior to iOS 8.0 これを避けるためにはStoryBoardを使うことをあきらめ、コードでOSバージョンを分岐して、コードでUIコンポーネントを配置する必要があると思
iOS 8からWebサービスとアプリ間でiCloudキーチェーンを通じてパスワードなどアカウント情報を共有できるようになりました。 (ただし、現状ではiCloudキーチェーンを使えるのはSafariのみのため、MacのSafariとiOSアプリの間に限る) 昨今ではそれぞれ別のサービスで同じパスワードを再利用せず、サービスごとに固有のできればランダムなパスワードを登録して、パスワードマネージャで管理することが推奨されています。 Webサービスを使うだけならブラウザのパスワード管理などを利用すればいいのですが、そのサービスのiOSアプリを利用しようとするとパスワードを調べるのが大変でした。 iOS 8では(Safari限定ではありますが)Webサービスで入力してキーチェーンに保存したアカウント情報を、iOSアプリでも利用することができます。 パスワードなど機密性の高い情報を共有するため、どの
TL;DR ●バーコードリーダーは外部キーボードとして扱える ●UITextFieldなどの入力コンポーネントを使って入力を受け取れる ●UITextFieldなどを使いたくない場合がある ●UIKeyCommandを使うと入力コンポーネントを使わずに入力を受け取れる ユビレジでは商品の入力に市販のバーコードリーダーを利用することができます。 一般的なBluetoothのバーコードリーダーはHID(Human Interface Device)とSPP(Serial Port Profile)の両方のプロファイルに対応しています。 HIDとして接続する場合は外部キーボードと同じ扱いになります。 外部キーボードが繋がっているのと同じなので、UITextFieldやUITextViewを使って特別なSDKを必要とせずに入力を受け取ることができます。 ただし、このやり方は簡単なのですが、入力を受
次のページ
このページを最初にブックマークしてみませんか?
『24/7 twenty-four seven』の新着エントリーを見る
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く