Project Ganymede
- The Paradoxical Moon Philosophy
- Send Separately
- Callisto is the code name for MessagesExtension
- Europa is the code name for Encryption Key Exchange Server
2023-11-22โ
- There was a property in
MSMessage
of shouldExpire. The problem is, the recipient can override to keep the message, what we don't want. - Implemented Message Reading Functionality
- Implemented Proper Loading View features, with fade in and fade out.
- Refactored a lot of files
Callisto
โโโ Assets.xcassets
โ โโโ Contents.json
โ โโโ iMessage App Icon.stickersiconset
โ โโโ Contents.json
โโโ Base.lproj
โ โโโ MainInterface.storyboard
โโโ Callisto.entitlements
โโโ CallistoLoadingView.swift
โโโ CallistoMessageReadingView.swift
โโโ CallistoMessageWritingView.swift
โโโ CallistoService.swift
โโโ CallistoView.swift
โโโ Info.plist
โโโ MessagesViewController.swift
2023-11-18โ
- Linked the client side to
- make request to server
- pack it as
MSMessage
- send the message
- dismiss keyboard & request compact presentation style
- Pink Bubble?
2023-11-13โ
- Implemented Vitest on Prisma and Cloudflare Workers
- It would be boring to name tests like "A texts B, then C tries to read it" or so, right?
- Implemented CI on GitHub Actions, so that
- If the Vitest passes, deploy it to Cloudflare Workers
When Test Failsโ
- Refuses to Deploy
When Test Passesโ
- Deploys
2023-11-11โ
Used Prisma, Prisma Accelerate, PlanetScale, and Cloudflare Workers to create a simple server for the Ganymede Table Structure. Prisma layer makes 3 requests to the DB per 1 request to the server, albeit it probably would hit the Prisma Accelerate Layer, we can later optimize it with this document.
Composing Messages with 3 People Group Chat (Writer, Reader 1, Reader 2)โ
When the Writer Tries to Read (Invalid)โ
When the Reader Tries to Read (Valid)โ
When the Reader Re-requests to Read (Invalid)โ
When Another Reader Requests to Read (Valid)โ
When an Unauthorized User Requests to Read (Invalid)โ
Alsoโ
- PhotoPicker
- Finished reading the Apple Sign-In UUID from the iMessage App side: had to use App Groups and UserDefaults
2023-11-10โ
2023-11-08โ
- It is possible to limit iMessage forwarding for iMessage Extensions
- It is possible to mark the iMessage with
LocalParticipantIdentifier
LocalParticipantIdentifier
is different on all devices- The simplest way would be marking:
- Set
LocalParticipantIdentifier
totrue
on reading (on the server) - Reject if
LocalParticipantIdentifier
is alreadytrue
- Set
- Problem: If the user deletes and reinstalls the app,
LocalParticipantIdentifier
changes. So the user can read unlimited times if the uninstall & reinstall - Mitigation: Assign UUID for each message. Each message will have
LocalParticipantIdentifier + RemoteParticipantIdentifiers
count as themaxRead
. This will at least 'limit' the max read count. - Problem: on a Group Chat setting, a user can read unlimited times instead of another participant.
- Solution: Sign in with Apple?!
2023-10-20โ
Can attach many images
2023-10-19โ
- SwiftUI Metal Shader Effects - iOS 17 - WWDC 2023
- Embed the Photos Picker in your app - WWDC23 - Videos - Apple Developer
- Burn Paper with a Single Shader | Blender Tutorial
2023-10-16โ
2023-10-13โ
I figured out that in iOS 17, Shortcuts can send messages without confirmation. Can we use this for Send Separately or Ganymede?
2023-10-12โ
- Read notifications
- Screenshot notifications
- Broadcast
- App Clip + Apple Login?
- Therefore, we name it Project Ganymede. You can NEVER win Apple. It is the most massive system, just like Jupiter. Therefore, we choose to become a moon. The moon of Jupiter. And a moon can be bigger than planets. Ganymede is bigger than Mercury.
2023-10-09โ
I finished some working prototypes. Some concerns: It seems like the transcript MSMessage
is an immutable object. We might consider server approaches, such as KV storage.
I don't want to store any encrypted or decrypted messages on the server. So we can consider something as:
Considerationsโ
- How do you store different strategies (After 5 seconds? 10 seconds? 15 seconds?)
- Group chats
- Photo / Video Payload
- Screenshot detections and notifications