From 210b1dea0aa7974cf53f683dcf8f868f3cbe7c17 Mon Sep 17 00:00:00 2001 From: syui Date: Sun, 15 Mar 2026 19:22:34 +0900 Subject: [PATCH] fix social-app ios proxy registerpushtoken err --- ios/patching/002-social-app-ios-lib.patch | 99 ++++++++++++------- ios/patching/004-social-app-ios-core.patch | 99 ++++++++++--------- .../047-social-app-ios-dynamic-service.patch | 53 ++++++++++ ios/setup.zsh | 1 + 4 files changed, 174 insertions(+), 78 deletions(-) create mode 100644 ios/patching/047-social-app-ios-dynamic-service.patch diff --git a/ios/patching/002-social-app-ios-lib.patch b/ios/patching/002-social-app-ios-lib.patch index 00f522b..36cc321 100644 --- a/ios/patching/002-social-app-ios-lib.patch +++ b/ios/patching/002-social-app-ios-lib.patch @@ -1,30 +1,6 @@ -diff --git a/src/lib/api/feed/home.ts b/src/lib/api/feed/home.ts -index 7a0d72d91..93554dc3e 100644 ---- a/src/lib/api/feed/home.ts -+++ b/src/lib/api/feed/home.ts -@@ -45,7 +45,7 @@ export class HomeFeedAPI implements FeedAPI { - this.following = new FollowingFeedAPI({agent}) - this.discover = new CustomFeedAPI({ - agent, -- feedParams: {feed: PROD_DEFAULT_FEED('whats-hot')}, -+ feedParams: {feed: PROD_DEFAULT_FEED('app')}, - }) - this.userInterests = userInterests - } -@@ -54,7 +54,7 @@ export class HomeFeedAPI implements FeedAPI { - this.following = new FollowingFeedAPI({agent: this.agent}) - this.discover = new CustomFeedAPI({ - agent: this.agent, -- feedParams: {feed: PROD_DEFAULT_FEED('whats-hot')}, -+ feedParams: {feed: PROD_DEFAULT_FEED('app')}, - userInterests: this.userInterests, - }) - this.usingDiscover = false -diff --git a/src/lib/constants.ts b/src/lib/constants.ts -index 231447b4f..a44b3da05 100644 ---- a/src/lib/constants.ts -+++ b/src/lib/constants.ts -@@ -7,12 +7,12 @@ import {BLUESKY_PROXY_DID, CHAT_PROXY_DID} from '#/env' +--- a/src/lib/constants.ts 2026-03-15 19:17:45 ++++ b/src/lib/constants.ts 2026-03-15 19:16:32 +@@ -7,12 +7,12 @@ export const LOCAL_DEV_SERVICE = Platform.OS === 'android' ? 'http://10.0.2.2:2583' : 'http://localhost:2583' export const STAGING_SERVICE = 'https://staging.bsky.dev' @@ -42,7 +18,7 @@ index 231447b4f..a44b3da05 100644 export const EMBED_SERVICE = 'https://embed.bsky.app' export const EMBED_SCRIPT = `${EMBED_SERVICE}/static/embed.js` export const BSKY_DOWNLOAD_URL = 'https://bsky.app/download' -@@ -79,19 +79,17 @@ export function IS_PROD_SERVICE(url?: string) { +@@ -81,19 +81,17 @@ } export const PROD_DEFAULT_FEED = (rkey: string) => @@ -65,7 +41,7 @@ index 231447b4f..a44b3da05 100644 ] export const POST_IMG_MAX = { -@@ -129,7 +127,7 @@ export const LANG_DROPDOWN_HITSLOP = {top: 10, bottom: 10, left: 4, right: 4} +@@ -131,7 +129,7 @@ export const BACK_HITSLOP = HITSLOP_30 export const MAX_POST_LINES = 25 @@ -74,7 +50,7 @@ index 231447b4f..a44b3da05 100644 export const BSKY_FEED_OWNER_DIDS = [ BSKY_APP_ACCOUNT_DID, -@@ -138,9 +136,9 @@ export const BSKY_FEED_OWNER_DIDS = [ +@@ -140,7 +138,7 @@ ] export const DISCOVER_FEED_URI = @@ -83,9 +59,7 @@ index 231447b4f..a44b3da05 100644 export const VIDEO_FEED_URI = 'at://did:plc:z72i7hdynmk6r22z27h6tvur/app.bsky.feed.generator/thevids' export const STAGING_VIDEO_FEED_URI = - 'at://did:plc:yofh3kx63drvfljkibw5zuxo/app.bsky.feed.generator/thevids' - export const VIDEO_FEED_URIS = [VIDEO_FEED_URI, STAGING_VIDEO_FEED_URI] -@@ -209,8 +207,8 @@ export const urls = { +@@ -217,10 +215,43 @@ }, } @@ -95,8 +69,43 @@ index 231447b4f..a44b3da05 100644 +export const PUBLIC_APPVIEW_DID = 'did:web:bsky.syu.is' export const PUBLIC_STAGING_APPVIEW_DID = 'did:web:api.staging.bsky.dev' ++// Official Bluesky appview DID (for non-self-hosted accounts) ++export const OFFICIAL_APPVIEW_DID = 'did:web:api.bsky.app' ++export const OFFICIAL_CHAT_DID = 'did:web:api.bsky.chat' ++ ++export function isSelfHostedService(url?: string) { ++ return !!url?.includes('syu.is') ++} ++ ++export function getAppviewDid(serviceUrl?: string) { ++ return isSelfHostedService(serviceUrl) ++ ? PUBLIC_APPVIEW_DID ++ : OFFICIAL_APPVIEW_DID ++} ++ ++export function getProxyHeader(serviceUrl?: string): ProxyHeaderValue { ++ return `${getAppviewDid(serviceUrl)}#bsky_appview` as ProxyHeaderValue ++} ++ ++export function getNotifServiceHeaders(serviceUrl?: string) { ++ return { ++ 'atproto-proxy': `${getAppviewDid(serviceUrl)}#bsky_notif`, ++ } ++} ++ ++export function getDmServiceHeaders(serviceUrl?: string) { ++ const chatDid = isSelfHostedService(serviceUrl) ++ ? CHAT_PROXY_DID ++ : OFFICIAL_CHAT_DID ++ return { ++ 'atproto-proxy': `${chatDid}#bsky_chat`, ++ } ++} ++ export const DEV_ENV_APPVIEW = `http://localhost:2584` // always the same -@@ -236,8 +234,8 @@ export const BLUESKY_MOD_SERVICE_HEADERS = { + export const DEV_ENV_APPVIEW_DID = `did:plc:dw4kbjf5mn7nhenabiqpkyh3` // always the same + +@@ -248,8 +279,8 @@ } export const webLinks = { @@ -107,6 +116,28 @@ index 231447b4f..a44b3da05 100644 community: `https://bsky.social/about/support/community-guidelines`, communityDeprecated: `https://bsky.social/about/support/community-guidelines-deprecated`, } +diff --git a/src/lib/api/feed/home.ts b/src/lib/api/feed/home.ts +index 7a0d72d91..93554dc3e 100644 +--- a/src/lib/api/feed/home.ts ++++ b/src/lib/api/feed/home.ts +@@ -45,7 +45,7 @@ export class HomeFeedAPI implements FeedAPI { + this.following = new FollowingFeedAPI({agent}) + this.discover = new CustomFeedAPI({ + agent, +- feedParams: {feed: PROD_DEFAULT_FEED('whats-hot')}, ++ feedParams: {feed: PROD_DEFAULT_FEED('app')}, + }) + this.userInterests = userInterests + } +@@ -54,7 +54,7 @@ export class HomeFeedAPI implements FeedAPI { + this.following = new FollowingFeedAPI({agent: this.agent}) + this.discover = new CustomFeedAPI({ + agent: this.agent, +- feedParams: {feed: PROD_DEFAULT_FEED('whats-hot')}, ++ feedParams: {feed: PROD_DEFAULT_FEED('app')}, + userInterests: this.userInterests, + }) + this.usingDiscover = false diff --git a/src/lib/demo.ts b/src/lib/demo.ts index 5ead62c9d..7c80dfe15 100644 --- a/src/lib/demo.ts diff --git a/ios/patching/004-social-app-ios-core.patch b/ios/patching/004-social-app-ios-core.patch index 73513c9..cd35f73 100644 --- a/ios/patching/004-social-app-ios-core.patch +++ b/ios/patching/004-social-app-ios-core.patch @@ -1,3 +1,58 @@ +--- a/src/state/session/agent.ts 2026-03-15 19:17:45 ++++ b/src/state/session/agent.ts 2026-03-15 19:17:18 +@@ -18,6 +18,8 @@ + BLUESKY_PROXY_HEADER, + BSKY_SERVICE, + DISCOVER_SAVED_FEED, ++ getProxyHeader, ++ isSelfHostedService, + IS_PROD_SERVICE, + PUBLIC_BSKY_SERVICE, + TIMELINE_SAVED_FEED, +@@ -47,7 +49,9 @@ + configureModerationForGuest() // Side effect but only relevant for tests + + const agent = new BskyAppAgent({service: PUBLIC_BSKY_SERVICE}) +- agent.configureProxy(BLUESKY_PROXY_HEADER.get()) ++ if (!isSelfHostedService(PUBLIC_BSKY_SERVICE)) { ++ agent.configureProxy(BLUESKY_PROXY_HEADER.get()) ++ } + return agent + } + +@@ -77,7 +81,9 @@ + // after session is attached + const aa = prefetchAgeAssuranceData({agent}) + +- agent.configureProxy(BLUESKY_PROXY_HEADER.get()) ++ if (!isSelfHostedService(storedAccount.service)) { ++ agent.configureProxy(getProxyHeader(storedAccount.service)) ++ } + + return agent.prepare({ + resolvers: [gates, moderation, aa], +@@ -116,7 +122,9 @@ + const moderation = configureModerationForAccount(agent, account) + const aa = prefetchAgeAssuranceData({agent}) + +- agent.configureProxy(BLUESKY_PROXY_HEADER.get()) ++ if (!isSelfHostedService(service)) { ++ agent.configureProxy(getProxyHeader(service)) ++ } + + return agent.prepare({ + resolvers: [gates, moderation, aa], +@@ -288,7 +296,9 @@ + logger.error(e, {message: `session: failed snoozeEmailConfirmationPrompt`}) + } + +- agent.configureProxy(BLUESKY_PROXY_HEADER.get()) ++ if (!isSelfHostedService(service)) { ++ agent.configureProxy(getProxyHeader(service)) ++ } + + return agent.prepare({ + resolvers: [gates, moderation, aa], diff --git a/src/App.native.tsx b/src/App.native.tsx index 2c4d6fa41..b69e2b18d 100644 --- a/src/App.native.tsx @@ -29,47 +84,3 @@ index f325539c7..3e2c7b3eb 100644 CopyrightPolicy: '/support/copyright', // hashtags Hashtag: '/hashtag/:tag', -diff --git a/src/state/session/agent.ts b/src/state/session/agent.ts -index 5c8ce3b97..ee85beb08 100644 ---- a/src/state/session/agent.ts -+++ b/src/state/session/agent.ts -@@ -47,7 +47,8 @@ export function createPublicAgent() { - configureModerationForGuest() // Side effect but only relevant for tests - - const agent = new BskyAppAgent({service: PUBLIC_BSKY_SERVICE}) -- agent.configureProxy(BLUESKY_PROXY_HEADER.get()) -+ // Disable proxy for self-hosted environments -+ // agent.configureProxy(BLUESKY_PROXY_HEADER.get()) - return agent - } - -@@ -88,7 +89,8 @@ export async function createAgentAndResume( - // after session is attached - const aa = prefetchAgeAssuranceData({agent}) - -- agent.configureProxy(BLUESKY_PROXY_HEADER.get()) -+ // Disable proxy for self-hosted environments -+ // agent.configureProxy(BLUESKY_PROXY_HEADER.get()) - - return agent.prepare({ - resolvers: [gates, moderation, aa], -@@ -127,7 +129,8 @@ export async function createAgentAndLogin( - const moderation = configureModerationForAccount(agent, account) - const aa = prefetchAgeAssuranceData({agent}) - -- agent.configureProxy(BLUESKY_PROXY_HEADER.get()) -+ // Disable proxy for self-hosted environments -+ // agent.configureProxy(BLUESKY_PROXY_HEADER.get()) - - return agent.prepare({ - resolvers: [gates, moderation, aa], -@@ -299,7 +302,8 @@ export async function createAgentAndCreateAccount( - logger.error(e, {message: `session: failed snoozeEmailConfirmationPrompt`}) - } - -- agent.configureProxy(BLUESKY_PROXY_HEADER.get()) -+ // Disable proxy for self-hosted environments -+ // agent.configureProxy(BLUESKY_PROXY_HEADER.get()) - - return agent.prepare({ - resolvers: [gates, moderation, aa], diff --git a/ios/patching/047-social-app-ios-dynamic-service.patch b/ios/patching/047-social-app-ios-dynamic-service.patch new file mode 100644 index 0000000..e7de4a4 --- /dev/null +++ b/ios/patching/047-social-app-ios-dynamic-service.patch @@ -0,0 +1,53 @@ +--- a/src/lib/notifications/notifications.ts 2026-03-15 19:17:45 ++++ b/src/lib/notifications/notifications.ts 2026-03-15 19:17:38 +@@ -6,8 +6,8 @@ + import debounce from 'lodash.debounce' + + import { +- BLUESKY_NOTIF_SERVICE_HEADERS, +- PUBLIC_APPVIEW_DID, ++ getAppviewDid, ++ getNotifServiceHeaders, + PUBLIC_STAGING_APPVIEW_DID, + } from '#/lib/constants' + import {logger as notyLogger} from '#/lib/notifications/util' +@@ -39,7 +39,7 @@ + const payload: AppBskyNotificationRegisterPush.InputSchema = { + serviceDid: currentAccount.service?.includes('staging') + ? PUBLIC_STAGING_APPVIEW_DID +- : PUBLIC_APPVIEW_DID, ++ : getAppviewDid(currentAccount.service), + platform: Platform.OS, + token: token.data, + appId: 'xyz.blueskyweb.app', +@@ -49,7 +49,7 @@ + notyLogger.debug(`registerPushToken: registering`, {...payload}) + + await agent.app.bsky.notification.registerPush(payload, { +- headers: BLUESKY_NOTIF_SERVICE_HEADERS, ++ headers: getNotifServiceHeaders(currentAccount.service), + }) + + notyLogger.debug(`registerPushToken: success`) +@@ -301,17 +301,18 @@ + const token = await getPushToken() + if (token) { + for (const agent of agents) { ++ const serviceUrl = agent.serviceUrl.toString() + await agent.app.bsky.notification.unregisterPush( + { +- serviceDid: agent.serviceUrl.hostname.includes('staging') ++ serviceDid: serviceUrl.includes('staging') + ? PUBLIC_STAGING_APPVIEW_DID +- : PUBLIC_APPVIEW_DID, ++ : getAppviewDid(serviceUrl), + platform: Platform.OS, + token: token.data, + appId: 'xyz.blueskyweb.app', + }, + { +- headers: BLUESKY_NOTIF_SERVICE_HEADERS, ++ headers: getNotifServiceHeaders(serviceUrl), + }, + ) + notyLogger.debug(`Push token unregistered for ${agent.session?.handle}`) diff --git a/ios/setup.zsh b/ios/setup.zsh index 508dcda..74458d9 100755 --- a/ios/setup.zsh +++ b/ios/setup.zsh @@ -48,6 +48,7 @@ PATCH_FILES_IOS=( "041-social-app-ios-splash-custom.patch" # signin-button + splash-video (merged 044) "045-social-app-ios-composer-cancel.patch" "046-social-app-ios-null-url-guards.patch" + "047-social-app-ios-dynamic-service.patch" # Dynamic proxy/notif per account (syu.is vs bsky.social) ) function ios-env() {