24/7 twenty-four seven

iOS/OS X application programing topics.

iOSDC 2023 Mastering SwiftSyntax

先日のiOSDC 2023にて「Mastering SwiftSyntax」という発表をしました。 fortee.jp スライド: speakerdeck.com 台本とアニメーション付きのスライド: www.icloud.com サンプルコード: github.com マクロではなくSwiftSyntaxの解説なのでマクロの話を詳しくし…

SwiftマクロでPowerAssertを実装する

現在Swiftにマクロを導入しようという提案がSwift Evolutionのレビュー中*1です。 SwiftによってSwiftの構文を拡張できる、いわゆるメタプログラミングと呼ばれる機能です。 実はマクロの他にもSwiftでメタプログラミングを実現する機能の提案が複数提案*2*3…

DeepLの非公式Safari機能拡張(Mac・iPhone・iPad)

公式に提供されているChrome機能拡張とだいたい同じような使い勝手になっています。 ソースコードはこちら github.com 機能概要 ページ全体の翻訳(Proユーザーのみ) 選択したテキストを翻訳(誰でも) その他のスクリーンショット 📱 iOS app  iPad app 💻 Mac…

iOSDC 2022「アニメーションAPIのすべて」補足など

先日のiOSDC 2022にて「アニメーションAPIのすべて」という発表をしました。 fortee.jp きっかけはDroidKaigi 2021で荒木佑一さんの「動かす」という発表です。 www.youtube.com Androidのさまざまなアニメーション APIについてコードや具体的な例を用いて解…

macOS MontereyでXcode 14を起動する、またはmacOS VenturaでXcode 13以下を起動する。

未サポートのOSでバージョンが古すぎたり新しすぎで起動できないXcodeを起動するには、Terminal.appで $ /Applications/Xcode-beta.app/Contents/MacOS/Xcode のようにパッケージの中の実行ファイルを直接実行すると起動できる。 または、アプリケーションア…

賃貸マンションでGoogle Nest Doorbellを使ってみた

スマートドアベル「Google Nest Doorbell (Battery Type)」を買って4か月ほど使ったので感想を書きます。 store.google.com 要約 簡単に試したり現状回復を優先するなら設置は両面テープで 既存のドアホンがカメラ付きならドアホンとしての性能を超えること…

CIによるXcodeのテスト実行結果をGitHub Checksにわかりやすく表示する

Xcodeによるユニットテストの実行結果をCIサービスの画面で確認するのはなかなか大変です。 GitHubにはCIのステータスをそこそこリッチな画面表示として返せて、Pull Requestの画面から1クリックでアクセスできるGitHub Checksがあるのでそこで確認できれば…

Automate solving two-factor authentication for Apple ID on CI systems

Apple enforcing 2FA for all accounts. 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 person…

Apple IDの2ファクタ認証をCI環境で突破する

【注意】この記事で紹介しているSMS APIサービスのVonageは利用規約により認証にVonageの電話番号を利用することを禁止しているという記述があるので、末尾の別解として載せたAndroidデバイスを使ってSMSを転送する方法が良さそうです。 help.nexmo.com 2021…

CIのシークレット変数に1Password CLIを利用する

CIでいろいろなタスクを自動化していると、CIで必要とするAPIのトークンやアカウント情報など設定しているシークレット変数が増えてきます。 たいていの場合はCIサービスのシークレット変数を利用すればよいですが、サービスによっては一度設定したシークレ…

iOSDC 2019で「ライブラリのインポートとリンクの仕組み完全解説」という話をします

スケジュール 2019/9/6(金) 10:50〜 Track Aレギュラートーク(60分) Proposal: ライブラリのインポートとリンクの仕組み完全解説 概要(リンクにまつわる問題) インポート・リンクの仕組みがよくわかっていない状態だと、エラーと自分の加えた変更が結…

FolioのiOSチームで利用しているFastfileとBitriseワークフロー

FolioのiOSチームではさまざまなタスクをそこそこ高度に自動化していると思うので、(そのまま別のプロジェクトで使いまわせるほどポータブルではないけど)参考にしてもらえる部分はけっこうありそうと思うので公開リポジトリに置いてみました。 github.com…

iOS 13にしかないフレームワークを使用したアプリをiOS 12以下でも動くようにするには

SwiftUI、Combile、RealityKitなどiOS 13以上の環境にしか存在しないフレームワークを使用するアプリをiOS 12以下の環境で実行すると、その機能を実際に呼び出さないようにしていたとしても、起動時にダイナミックリンクに失敗してクラッシュしてしまいます…

CocoaPodsをWorkspaceに自動統合せずに利用する

背景 現在のiOSアプリ開発におけるパッケージマネージャのデファクトスタンダード(事実上の標準)としてCocoaPodsとCarthageがあります。Xcode 11からはSwift Pacakge ManagerがXcodeに統合されて利用できますが、ライブラリ側の対応が必要ということや、ベ…

OpenAPI (Swagger) のコード生成から通信処理を分離してスキーマ定義だけを利用する

背景 今関わっているプロジェクトではOpenAPIを利用して、APIのスキーマを定義しています。 OpenAPIではスキーマ定義からクライアントコードを生成できます。 しかし、デフォルトのコード生成はスキーマ定義とネットワーク通信のコードが強く結びついており…

SceneKitとCALayerで作る3Dのスライドショー

大型ディスプレイに投影するデジタルサイネージを作る仕事をしました。 できあがったのがこれです。 github.com まず、アートディレクターと相談して、下記の映像を参考にして3D空間を飛び回るようなスライドショーでいこうと決めました。 www.youtube.com w…

CのライブラリをiOS向けにビルドする

ほとんどのUNIX系OSにおけるCライブラリはAutotoolsを使って開発されています(./configure && make installの手順でビルドする)。 普通に./configure && make installすると実行している環境(MacやLinux)用のバイナリが生成されますので、そのままではiO…

Auto Layoutの静的な制約で実現するカラム幅が可変のテーブル

次に示すような見出しと各カラムが右寄せ、ラベルの文字数によってカラムの幅が伸縮し、広くなった場合は隣の列を押し出し、短くなった場合は少なくとも見出しの幅に収まり、各列の間には一定のマージンを置くというテーブルレイアウトを、静的なAuto Layout…

Auto Layoutの静的な制約で実現するテキストの量によって折りたたみ可能なテキストビュー

長いテキストが初期表示では折りたたまれて表示されていて、「つづきを読む」ボタンを押すことで表示エリアが拡大して全文が表示されるという挙動を、できるだけ動的な要素を排除して実現してみます。 サンプルコードは下記のリポジトリで公開しています。 g…

Auto Layoutの静的な制約で実現する伸び縮みするヘッダービュー

TL;DR, 優先度の異なる複数の制約を同時に定義することで、静的な定義だけで動的な振る舞いを実現できる 動的な要素の少ない構造のビューはより堅牢である はじめに 読みやすくメンテナンスしやすいソフトウェアを作るために重要なことの一つは構造をシンプ…

iOSDC 2018で「堅牢なレイアウトを作るためのグッドプラクティス」というテーマで話します。

デバイス・OSバージョンの依存が少なく、メンテナンスしやすいビューを作る by Kishikawa Katsumi | プロポーザル | iOSDC Japan 2018 - fortee.jp iOSのビューをメンテナンスし続けるのはとても大変です。 アプリケーションが提供する機能や扱う情報が複雑…

iOSDCでテストしづらいコードをテストしやすくするための方法について話しました

speakerdeck.com 日本で開催されるもっとも大きなiOSに関するカンファレンスの1つであるTop | iOSDC Japan 2017に参加し、表題の内容で発表しました。 聴いてくださった方々からは好評のようでよかったです。発表資料は本題と関係のない話がちょこちょこ挟…

try! Swift Tokyo 2017をもっと楽しむために

いよいよ明日はtry! Swift Tokyo 2017が開催されます。 try! Swift Tokyo 2017を最大限楽しんでいただくために、ちょっとしたコツをお話しします。 公式アプリ try! Swift公式アプリがAppStoreから配信されています。タイムテーブルやセッション概要などが掲…

try! Swift Tokyo 2017を開催します

try! Swiftは世界中のSwiftデベロッパーが一堂に会し、Swiftに関する知見を共有するカンファレンスです。国内外からSwiftデベロッパーが参加する、世界最大級のコミュニティでもあります。 会期は2017年3月2日〜4日の3日間、うち2日、3日は招待講演とライト…

懇親会における英会話のプロトコル

前回の記事では、カンファレンスをより楽しむために積極的に人と(特に海外の人と)話そうと書きました。しかしそうはいっても、言葉に自信がなかったりしてなかなか積極的に話しかける勇気が持てないかもしれません。 でも心配いりません。懇親会(ミートア…

try! Swift 2016を200%楽しむために

いよいよ今週はtry! Swift 2016が開催されます。 せっかくの機会ですので貴重なチケットを手に入れられた方にtry! Swift 2016を最大限楽しんでいただくために、ちょっとしたコツをお話しします。 公式アプリ try! Swift公式アプリがAppStoreから配信されてい…

2016年3月2日〜4日、try! Swiftカンファレンスを開催します。

try! Swiftはエンジニアが主役のSwiftに関するカンファレンスです。今回は会期を3日間(!)、著名エンジニア(海外・国内)による招待講演を予定しています。 http://www.tryswiftconf.com/ 講演とプログラムについて 現在Webサイトには12人の講演者が掲載…

接続先がATS (App Transport Security)に対応しているか、または例外の設定をnscurlコマンドで簡単に調べる

TL;DR, $ nscurl --ats-diagnostics --verbose https://kishikawakatsumi.com/のようにnscurlコマンドに--ats-diagnostics --verboseオプションをつけて実行すると、指定したドメインがATSの要件を満たしているかどうかをチェックし、デフォルトの設定でエラ…

StoryBoardまたはXIBについて、ファイルごとにDeployment Targetを設定する

昨日はじめて知ったのですが、StoryBoardやXIBファイルはプロジェクトやターゲットのDeployment Targetとは別に、各ファイルごとに個別にDeployment Targetを設定することができます。 例えば、iOS 8以上にしか存在しないUIVisualEffectViewや、iOS 9以降で…

WebとiOSアプリでパスワードを共有する

iOS 8からWebサービスとアプリ間でiCloudキーチェーンを通じてパスワードなどアカウント情報を共有できるようになりました。 (ただし、現状ではiCloudキーチェーンを使えるのはSafariのみのため、MacのSafariとiOSアプリの間に限る) 昨今ではそれぞれ別の…