• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

bleedingdeacons / link / 33908032385
92%

Build:
DEFAULT BRANCH: main
Ran 04 Sep 2026 06:50PM UTC
Jobs 1
Files 11
Run time 1min
Badge
Embed ▾
README BADGES
x

If you need to use a raster PNG badge, change the '.svg' to '.png' in the link

Markdown

Textile

RDoc

HTML

Rst

04 Sep 2026 06:50PM UTC coverage: 84.573% (-0.1%) from 84.69%
33908032385

push

github

web-flow
feat: sign in with Apple on iOS (#9)

Fellowship's half already existed. Link had the two ends -- StartAppleAsync
for the nonce, SignInWithAppleAsync for the enrolment -- and nothing in
between to raise the sheet.

Written against ASAuthorization directly rather than MAUI's
AppleSignInAuthenticator, and the nonce is why. That helper's
AuthenticateAsync takes no options of any kind, so there is nowhere to
put one; Fellowship stores a nonce against the state and compares the
token's claim to it, so every token the helper produced would have been
rejected. It would have read as a server bug from the app and an app bug
from the server. The nonce is passed through unhashed -- Apple copies it
into the claim verbatim, and hashing first (which Firebase's flow wants)
would break the comparison.

IAppleSignIn is shaped like IPushRegistrar: a shared half that decides
what an unanswered sheet means, and one platform file each. Android has
no implementation, because Sign in with Apple there means the web flow --
a browser leg and a client secret, the very things the client-side path
avoids.

The entitlement is gated behind -p:LinkAppleSignIn=true and off by
default. com.apple.developer.applesignin is only grantable to a paid
Apple Developer Program team, and a free personal team cannot sign an app
that asks for it -- the install fails outright. Since a sideloaded build
is signed by exactly such a team, and that is currently the only way Link
reaches an iPhone, requesting it unconditionally would trade a working
sideload for a feature that still would not work. The same property
decides whether the button appears, so a build that cannot honour it does
not offer it.

EnrolmentResult.Cancelled names a convention that already existed: an
empty error has always meant the member changed their mind, documented
only in a comment in one view model. Cancelling a system sheet is the
ordinary way out, not the rare one, so it earned a name.

614 of 726 relevant lines covered (84.57%)

6.19 hits per line

Coverage Regressions

Lines Coverage ∆ File
1
91.43
-2.69% Services/Interfaces/IFellowshipClient.cs
Jobs
ID Job ID Ran Files Coverage
1 33908032385.1 04 Sep 2026 06:50PM UTC 11
84.57
GitHub Action Run
Source Files on build 33908032385
  • Tree
  • List 11
  • Changed 1
  • Source Changed 0
  • Coverage Changed 1
Coverage ∆ File Lines Relevant Covered Missed Hits/Line
  • Back to Repo
  • Github Actions Build #33908032385
  • c2a16538 on github
  • Prev Build on main (#33808912153)
  • Next Build on main (#33908985476)
  • Delete
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE TRIAL · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc