Bluesky/ATProtocol用の勉強会の資料です。
現在Bluesky用のAndroidクライアント「青雲」の開発を行っているので、開発に至った経緯やBluesky/ATP向けアプリをAndroidで開発するときのポイントなどを簡単に話しています。
Android ͱ BlueskyBluesky/ATProtocol ษڧձ#0ח / @akiomik
View Slide
ࣗݾհח (@akiomik)࠷ۙ Bluesky Nostr ʹೖΓਁͬͯΔௗʹձ͍͍ͨࣸਅઌ݄ࡱͬͨΦφΨ͔Θ͍͍Ͷ
੨Ӣ (seiun)Android ༻ͷࣗ࡞ Bluesky ΫϥΠΞϯτ࡞Δ·ͰʹࢸͬͨܦҢ Androidʹؔ͢Δ Bluesky ΛऔΓר͘ঢ়گʹ͍͓ͭͯ͠·͢
ΞδΣϯμ• Nostr ͱ Bluesky• Android Ϣʔβͱ Bluesky• ੨Ӣ• Android ΞϓϦ։ൃͱ Bluesky• Android ϢʔβΛऔΓר͘ঢ়گͷ·ͱΊ
Nostr ͱ Bluesky
NostrWebsocket ্Ͱಈ͘ࢄ SNS ༻ϓϩτίϧʮૄ݁߹ͳࢄγεςϜʯ + ʮރΕٕͨज़ͷਫฏࢥߟ ʯͱ͍͏งғؾͰΤϯδχΞతʹ༡ͼ͕͍͕͋ΔBluesky Nostr ϊεഇͷ δϟοΫɾυʔγʔ͕ग़ࢿʮBluesky ϦϦʔε·Ͱͷػॴʯͱᎏ᎐ʁ͞ΕΔ (ͨ) ͜ͱ
2023/03/03
ޕલ2࣌টίʔυΛೖखͯ͠ Bluesky ʹࢀՃ͢Δ Nostr ίϛϡχςΟͷॅຽ͕ݱΕΔ(࣌·ͩຊίϛϡχςΟͰݶΒΕͨগͷΈ͕ࢀՃ͍ͯͨ͠)
ޕલ9࣌Nostr ίϛϡχςΟͷॅਓ͕Bluesky ෦ͰγΣΞ͞Ε͍ͯΔটίʔυΛ Nostr ʹ֦ࢄBluesky ೖΓ͢Δॅਓ͕ग़࢝ΊΔ
ன12࣌ͦΕͰটίʔυΛ֫ಘͰ͖ͳ͍ॅਓBlueskyͷ։ൃαʔόΛࣗલͰݐͯͯ༡ͼ࢝ΊΔ
16࣌Nostr ίϛϡχςΟͷਓʑ͕ଓʑͱBluesky ʹࢀՃͯ͠য͍ͬͯΔ
16࣌ແࣄʹࢀՃͰ͖·ͨ͠🥰(kaorit ͞Μ͋Γ͕ͱ͏🙏)
Ұํͦͷࠒ
ΩϨΔAndroidϢʔβ͜ͷஈ֊Ͱ Bluesky ʹࢀՃͰ͖Δͷ• ެࣜ iOS ΞϓϦ• ྑΫϥΠΞϯτ (͔֬͜ͷஈ֊ͰϏϡʔϫ)• curl ެࣜϥΠϒϥϦͰ API Λୟ͘
18࣌ຊ Android ͷձͰཧࣄ (͑Β͍)Λ͍ͯ͠Δ kojira ͞Μ͕ΞΧϯτ࡞πʔϧͷ࡞Λґཔ
19࣌ఔͳͯࣗ͘͠ͱ rain ͞Μ͕΄΅ಉ࣌ʹΞΧϯτ࡞ϑΥʔϜΛϦϦʔε͜ΕͰ Android Ϣʔβটίʔυ͑͋͞ΕΞΧϯτ࡞͕Մೳʹ
Bluesky AccountCreatorhttps://bluesky-account-creator.vercel.app/
ΫϥΠΞϯτ։ൃ RTA ͕ҰؾʹՃ
ཌޕલ1࣮࣌༻తͳ web ΫϥΠΞϯτ͕͍ͰϦϦʔε͞Εͯ͠·͏
ޕલ0࣌͝ΖࣗAndroidͷΞϓϦͷ։ൃΛ࢝Ίͯ…
23࣌ଞͷ web ΫϥΠΞϯτʹΕΛͱΓͭͭॳظ൛ͷ apk ΛϦϦʔε࣌ϩάΠϯͯ͠ TL ද͕ࣔͰ͖Δ͚ͩ
48࣌ؒ[Ad] Nostr ଜ໘ന͍͜ͱ͕ຖͨ͘͞Μى͖͍ͯΔΑɻࠓ͙͢νΣοΫʂɹ
੨Ӣ
੨Ӣ(͓ͦΒ͘) ੈքͰ།ҰϦϦʔε͞Ε͍ͯΔ Bluesky ༻ͷ Android ΫϥΠΞϯτࡢ Google Play Store ͰΦʔϓϯςετΛ։࢝https://play.google.com/store/apps/details?id=io.github.akiomik.seiun
ػೳ• ϑΥϩʔ• ϓϩϑΟʔϧӾཡɾมߋ• Ҿ༻ϦϙετҎ֎େମͰ͖Δ😇(͏ͪΐͬͱͬͯͯͶ…)
༻ٕज़Lang: KotlinAPI: Retrofit2 + Moshi + EithernetUI: Jetpack compose + Material 3Android ॳֶऀͳΓʹؤுͬͯ࡞͍ͬͯ·͢🥺
Bluesky/ATPʹ͓͚ΔAndroid ։ൃࣄ
ΫϥΠΞϯτϥΠϒϥϦ͕ͳ͍
ΫϥΠΞϯτϥΠϒϥϦ͕ͳ͍• ެ͔ࣜΒఏڙ͞Ε͍ͯΔͷ node ͱ golangͷΈ• ATP ༻ͷ SDK ΛࣗͰ։ൃ͢Δඞཁ͕͋ΔNOTE: Dart༻ͷͷͳΒՃ౻͞Μ࡞ͷϥΠϒϥϦ͕͋Δ• https://pub.dev/documentation/atproto/latest/
SDK։ൃXRPC ༻ͷΫϥΠΞϯτΛ࣮͢ΔެࣜυΩϡϝϯτ ΛಡΊOK…ͱݴ͍͍ͨͱ͜Ζ͕ͩɺ͋·ΓࢀߟʹͳΒͳ͍😇Lexicon ͷ֓؍Λ௫ΜͩΒ @atproto/api ͷ API ·ͨίʔυ͔ΒͰ͖Δ͜ͱΛ୳ͨ͠ํ͕ૣ͍
ΏΔ;Θ XRPC• JWT Λͬͨೝূ (Authorization: Bearer $accessJwt)• `type: query` GET ͰΫΤϦύϥϝʔλʹͤͯϦΫΤετ• `type: procedure` POST Ͱbodyjson (blobΛআ͘)• `type: record` ͱ `schemaϓϩύςΟ` ͕ΓͱΓ͢Δσʔλܕ
Retrofit2 +Moshi +EitherNet͍͔ͭ͘ϋϚΓͲ͜Ζ͕͋Δ͕ɺXRPC Ͱ៉ྷʹॻ͚Δ
͍͔ͭ͘ͷϋϚΓͲ͜Ζ͍ͨΔͱ͜ΖͰૺ۰͢Δ`type: unknown` `type: union`ͷѻ͍͕Ή͔ͣ͗͢͠Δ㱺 ͍͍ײ͡ͷରࡦํ๏ืूதͰ͢😢
͍͔ͭ͘ͷϋϚΓͲ͜Ζ• Moshi ͷ࣌ܕ RFC 3339 ͔͠ѻ͑ͳ͍͕ɺXRPC ISO 8601• 㱺 Retrofit ͷ Converter Adapter Λ࣮ (ਖ਼͘͠Δʹ)• EitherNet ͰۭͷϨεϙϯεΛѻ͏͜ͱ͕Ͱ͖ͳ͍• 㱺 EitherNet Λϥοϓͨ͠ Retrofit ͷ Converter Adapter Λ࣮• Blob ͷ͛ํ͕ௐͯΘ͔Βͳ͔ͬͨ (ࠓ RequestBody ΛͬͯΔ)
Google Play StoreͰͷ৹ࠪ
Google Play StoreͰͷ৹ࠪ• SNSΞϓϦͱͯ͠ఏग़͢Δ߹ɺ࠷ݶʮ௨ใʯͱʮϛϡʔτ (ϒϩοΫ)ʯͷ࣮͕ඞཁ• ςετ༻ͷΞΧϯτͷఏڙඞཁ• 㱺 ௨ใͱςετ༻ʹ2ΞΧϯτཉ͍͠• boobee.blue ͷΑ͏ͳ֎෦ͷ PDS ΛΘͤͯΒ͏ͷख
Android ϢʔβΛऔΓר͘ঢ়گ
ެࣜΫϥΠΞϯτiOS ͱ Web (PC) ͷΈ (3/17 ݱࡏ)Android ͚ʹ PWA ԽΛਐΊΔͱͷ͜ͱ (3/16 ࣌ͷใ)
ΞΧϯτ࡞ެࣜ Web ΫϥΠΞϯτͰOKPC͕ͳ͚ΕҎԼͷ͍ͣΕ͔• ੨Ӣ• Bluesky Account Creator• syui ͞Μ࡞ͷ bsky
BlueskyΛָ͠Ή͖ͳΫϥΠΞϯτͰOKʂެࣜΫϥΠΞϯτ҆৺ײ͕͋ΔྑΫϥΠΞϯτεϐʔυײ֤ʑͷ࡞ऀ͞Μͷ৭͕ग़ָ͍͍ͯͯ͠ωΠςΟϒΞϓϦͳΒ੨Ӣ🙏
Have a nice sky 🤙͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠