LockMemo

ロック画面で、
瞬時にメモを確認

アプリを開かず、ロック画面のウィジェットからメモを直接確認。 タップひとつで即座に編集。Markdownでチェックリストも。

Instant Access to Your Notes
Widget Preview

ロック画面ウィジェット

iPhone・Android どちらのロック画面にも対応。明るい/暗いテーマを切り替えて見た目を確認できます。

wallpaper
15:27
15:27
3月1日(日)

メモ一覧

ドラッグで並び替え
Google Sheets未接続
3件
最終同期: 未同期
エクスポート

3件のメモをバックアップ

インポート

Markdown記法が使えます: - [ ] チェックリスト、**太字**[リンク](url)

Theme Editor

ウィジェットテーマ

ウィジェットの色やサイズを自分好みに変更できます。用意されたスタイルからワンタップで適用も可能。

プレビュー

15:00 会議 - 204号室

プレゼン資料を忘れずに

プリセット
#000000
60%
16px
#FFFFFF
16px
12px
Widget Animation

ウィジェットアニメーション

メモが切り替わるときの動きを選べます。ふわっと表示、横からスライドなど、9種類のアニメーションから好みを選択。

0.5s
速い遅い
0.10s
アニメーションを繰り返す
15:00 会議 - 204号室
牛乳・卵・パン
Wi-Fi: Guest_Office

カスタムプリセットはまだありません

アニメーションを設定して「現在の設定を保存」をタップ

Templates

テンプレート

よく使うメモの型をワンタップで呼び出せます。買い物リスト・会議メモなど9種類を用意。自分だけのテンプレートも作成OK。

Real-time Collaboration

みんなで一緒に編集

家族やチームとメモを共有。同じパソコンの別タブや、スマホとパソコンなど異なる端末同士でも、メモの変更がすぐに反映されます。

未接続

メモを選択してから共同編集を開始してください

Notification Pinning

通知センターに常駐

ピン留めしたメモが通知として常に表示されます。ロック画面を引き下げるだけですぐに確認。

通知プレビュー

ピン留めされたメモが通知として表示されます:

Multi Widget Layout

複数ウィジェット同時配置

複数のウィジェットを同時に並べた状態をプレビュー。実際のロック画面での見え方を確認できます。

レイアウト:
9:41
3月1日 土曜日
9:41
大 + 中 + 小
Key Features

主要機能

必須要件 1

視認性最大化

ロック画面ウィジェット(大・中・小)にメモテキストを直接表示。フォントサイズを最大化し、アプリを開かずに内容を読める。

必須要件 2

即時編集

ウィジェットをタップした瞬間、キーボードが立ち上がった状態でメモ入力画面が開く。0.1秒以内のフォーカス。

必須要件 3

屋外対応デザイン

装飾を排除し、背景と文字のコントラストを最大化。テキストシャドウ・太字フォントで直射日光下でも読みやすい。

必須要件 4

通知センター常駐

ピン留めメモを通知センターに常駐表示。ロック画面を引き下げるだけでメモ内容を確認可能。

クロスプラットフォーム

iOS / Android 両対応

WidgetKit (iOS) と Glance API (Android) で、両プラットフォームのロック画面ウィジェットに対応。

整理機能

カテゴリ・カラー・タグ

メモに色分け・カテゴリ・タグを設定。ウィジェットのアクセントカラーが連動し、視覚的に識別可能。

記法対応

Markdown対応

チェックリスト(- [ ])、太字、コード、リンクをメモ内で使用可能。ウィジェット上でもリッチに表示。

同期機能

GASクラウド同期

Google Apps Script + スプレッドシートでメモをクラウドに保存。デバイス間の同期とバックアップに対応。

Native Implementation

ネイティブ実装コード

iOSとAndroidの実装コードを確認できます。 コピーして開発ツールに貼り付ければ、すぐにアプリ開発を始められます。

iOS (Swift)
Android (Kotlin)
LockMemoWidget.swift
import WidgetKit
import SwiftUI

struct MemoEntry: TimelineEntry {
    let date: Date
    let memoText: String
    let isPinned: Bool
}

struct MemoProvider: TimelineProvider {
    func placeholder(in context: Context) -> MemoEntry {
        MemoEntry(date: .now, memoText: "メモを入力...", isPinned: false)
    }
    
    func getSnapshot(in context: Context, completion: @escaping (MemoEntry) -> Void) {
        let entry = MemoEntry(
            date: .now,
            memoText: loadMemo()?.text ?? "メモなし",
            isPinned: loadMemo()?.isPinned ?? false
        )
        completion(entry)
    }
    
    func getTimeline(in context: Context, completion: @escaping (Timeline<MemoEntry>) -> Void) {
        let memo = loadMemo()
        let entry = MemoEntry(
            date: .now,
            memoText: memo?.text ?? "メモなし",
            isPinned: memo?.isPinned ?? false
        )
        let timeline = Timeline(entries: [entry], policy: .never)
        completion(timeline)
    }
    
    private func loadMemo() -> StoredMemo? {
        guard let data = UserDefaults(suiteName: "group.com.lockmemo.app")?
            .data(forKey: "activeMemo") else { return nil }
        return try? JSONDecoder().decode(StoredMemo.self, from: data)
    }
}

// ===== ロック画面ウィジェット (accessoryRectangular) =====
struct LockScreenRectangularView: View {
    let entry: MemoEntry
    
    var body: some View {
        VStack(alignment: .leading, spacing: 2) {
            HStack(spacing: 4) {
                Image(systemName: "note.text")
                    .font(.system(size: 10))
                    .foregroundStyle(.secondary)
                Text("LockMemo")
                    .font(.system(size: 10, weight: .medium))
                    .foregroundStyle(.secondary)
                Spacer()
                if entry.isPinned {
                    Image(systemName: "pin.fill")
                        .font(.system(size: 8))
                        .foregroundStyle(.cyan)
                }
            }
            
            Text(entry.memoText)
                .font(.system(size: 14, weight: .semibold, design: .monospaced))
                .lineLimit(2)
                .minimumScaleFactor(0.8)
        }
        .containerBackground(.fill.tertiary, for: .widget)
        .widgetURL(URL(string: "lockmemo://edit"))
    }
}

// ===== ロック画面ウィジェット (accessoryInline) =====
struct LockScreenInlineView: View {
    let entry: MemoEntry
    
    var body: some View {
        HStack(spacing: 4) {
            Image(systemName: "note.text")
            Text(entry.memoText.components(separatedBy: "\n").first ?? "")
                .font(.system(.body, design: .monospaced))
        }
    }
}

// ===== ウィジェット定義 =====
@main
struct LockMemoWidget: Widget {
    let kind = "LockMemoWidget"
    
    var body: some WidgetConfiguration {
        StaticConfiguration(kind: kind, provider: MemoProvider()) { entry in
            LockScreenRectangularView(entry: entry)
        }
        .configurationDisplayName("LockMemo")
        .description("ロック画面にメモを表示")
        .supportedFamilies([
            .accessoryRectangular,
            .accessoryInline,
            .accessoryCircular,
            .systemSmall,
            .systemMedium
        ])
    }
}
Project Export

ネイティブプロジェクト

アプリ開発に必要なプロジェクトファイル一式をダウンロード。 ソースコードを確認して、すぐにアプリの開発を始められます。

LockMemo.xcodeproj10 files

Xcodeでの使い方

  1. 1.ダウンロードしたファイルの各ソースコードをXcodeプロジェクトにコピー
  2. 2.App Group を設定:Signing & Capabilities → App Groups → group.com.lockmemo.app
  3. 3.Widget Extension ターゲットを追加(File → New → Target → Widget Extension)
  4. 4.ビルド&実行し、設定 → ウィジェットからLockMemoを追加
Tech Stack

技術スタック提案

iOS(推奨)推奨
Phase 1 — 最優先
Swift + WidgetKit
  • accessoryRectangular / accessoryInline / accessoryCircular — 3サイズ対応要件1
  • WidgetURL + Deep Link でタップ即編集を実現要件2
  • SF Mono フォント + 高コントラスト配色要件3
  • Live Activity (ActivityKit) で通知センター常駐要件4
  • App Group でアプリ⇔ウィジェット間データ共有
Android推奨
Phase 2
Kotlin + Glance API (Jetpack Compose)
  • AppWidgetProvider + RemoteViews — ホーム画面ウィジェット要件1
  • PendingIntent で即座にメモ編集画面を起動要件2
  • JetBrains Mono + Material You 高コントラストテーマ要件3
  • Foreground Service + 固定通知でロック画面に常駐要件4
  • Android 15+ ロック画面ウィジェット API 対応
クロスプラットフォーム代替案
Phase 3 — 代替
React Native + Expo
  • expo-widgets で iOS WidgetKit 対応
  • react-native-android-widget で Android 対応
  • 共通コードベースで開発効率向上
  • ネイティブ比でウィジェットのカスタマイズ性に制約あり注意

GASバックエンド設定

Googleスプレッドシートでメモをクラウド同期

Step 1: スプレッドシートを作成

Google Driveで新しいスプレッドシートを作成し、IDをコピーします。

  1. 1.Google Driveを開き「新規」→「Googleスプレッドシート」を作成
  2. 2.スプレッドシート名を「LockMemo」に変更
  3. 3.URLからスプレッドシートIDをコピー

URLの例:

https://docs.google.com/spreadsheets/d/ここがID/edit
新しいスプレッドシートを作成
LockMemo

ロック画面メモアプリ — iOS / Android / PWA

Designed with precision

ホーム画面に追加

LockMemoをアプリとしてインストールし、オフラインでも利用できます

Safari: 共有 → ホーム画面に追加