From 37e58f6087d18c6af6d6b1b1c111a50c64c28127 Mon Sep 17 00:00:00 2001 From: sravan Date: Mon, 27 Jul 2026 23:03:45 +0530 Subject: [PATCH] feat(push): bundle a custom notification sound (notif.wav) for chat + calls Notifications were silent despite the payload requesting sound:'default' and correct device settings. Ship an explicit tone: a generated PCM .wav is bundled into the app (ios-patch.sh copies it in; add-share-extension.rb adds it to the App target's Copy Bundle Resources, tolerantly) and the server now sends sound:'notif.wav'. Part of the consolidated iOS build alongside the background-audio + call-push + AppDelegate fixes. Only affects iOS-native-app tokens (currently just the one test device); web push ignores the field. Needs a fresh Codemagic build for the bundled file to exist. Co-Authored-By: Claude Opus 4.8 --- mobile/ios-assets/notif.wav | Bin 0 -> 46790 bytes mobile/scripts/add-share-extension.rb | 20 ++++++++++++++++++++ mobile/scripts/ios-patch.sh | 8 ++++++++ server/push.js | 4 +++- 4 files changed, 31 insertions(+), 1 deletion(-) create mode 100644 mobile/ios-assets/notif.wav diff --git a/mobile/ios-assets/notif.wav b/mobile/ios-assets/notif.wav new file mode 100644 index 0000000000000000000000000000000000000000..58aa9574f0516a7e1c59d99cb7799b96de5236ee GIT binary patch literal 46790 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 z%0A0Gm5@ryV=8!S!~FWbLzkjTl*8>8TO(WEp!56E8r87@U8^kpCJWcD@)Y6EQu)ki z-b>K|zheQfg1UnPL*@iO4y5{@lgt(zXZHlplfGlRobgD$v0AfLQQL`c7qm)SBrTj) zZ(C{SDn*{=jZuL7abCqNBLU!Kc8FlSBu_RkP#9bvd^31W(71r{en&)X9*udK+KFd- zN85i}F6m7wgZz2Nkha2>0WEJ^ByGz(E}?zpukU5~V%zA+#v_y^jP+bdm@lpNCj<=% zz8I_z8W&h9+bo$Uc+TDdnn~%{b*?gGlj*oNU3sSKWBZTRw=FkYcDIgc$9C;ke9;^= zmcsL#GE5zDF>s%?jDJZC$X*7l4H^&}6if{w1%&x+7lrV8G8NPjgtK0`eHk>|@L2u0 zdts-wZAEKkOI+)=wig}WdB@_mk*y)Ey4Kt68C_QuZ#46bM`4`vzHb;Y zpJrpe&>4m#{G%+}0RNV@K{gKcwK zAG9{M!5wn>MKn9P!Ys61cW2`A$YMH^vtKY-vO@MEfElzuh!k`qV4|#tWUfHNhQT{z zF>b$`X!~o1boW(0xwMnsE^mF|RMhj`RSbUuUc897>kvZQNN$CEZgYd~Ai_N-1u_Z?M> z?v}aGn&$qDO(Aav=dsKAx5Z!l$N?Jyoq^{92L|wE0?AAPffIu!njgXuJ=bh2Ew}am zQ@`o{+xfbETU$(9e%r8)hh1fgrp~1#QZ{AL&RWCJBJ`6O~14S%AIms$B_2zZI|1wx9{!D?0%st(XBV{u~xYH zVegX~fKRMIzDY#)o9o{cur@F-P~~6kXAw^pNIA37)NBLpfG5^YhejAEn)!-NT@yQ) z?a$j%+i!Gqbm`ElaK=i=VISvxhxbs3j7OY2L0^g6Pvh?jhzMK}P=V&F#*0StT9__c z5pf+x;A%rmrd7Hvs+jH@on7sec6PhB{cq>O?jNcjx}oMQ>pIt8jD*w|;Ih{9vPE;H zUu6RVGy%^7j{BeWD;AFuBydjCPg5q~eV)(uCy>SPPQz9P%B>xD+mqVww8I^Ka!~nP zqcU8B9@>?jH2ez6B07d65}XxJ@*C;DJm7HvAz+^@PRbXJ=XseufM8Mw=BjJG^^94l z4^`K859r#}ajyMH``iw0*ZJ-W)mvSV*@p04lQHLrk7#R{h1?6m4-$#&ng9HN%z#Ay zF@E>N*@AwYZ}fV~Tl{A4AjbgsqH(tNt1@4Hp)fH)Om$1{n z1K07pV`kUy?rzmHoyYVM`Q}vkSVTUpf)T>i30RV?eggj%|3Cg!GQe+}I8`u)qoT{G z9D>$ce$v1-ub8t>2|3e z=$cGBkj2hzzSD$*)HKE(&LF{ZaiesfY>NK`|4nF?@ECEZU^<7%m`z{NSh48Kkmq~W`{gNg77s*cg z9g_SMj^&MIH31y55XbOH?6V=CL9G3&jOZTJmDFkJINAw!MJTxHyJ*UJe}wO3`*;Kg zHo)LUxwtCY3NM6x~75HVM9Wgo`D@fq652``?z*NkytKGlf9SCllAf&DY+#a!CS-v!5QQ& zxc#16b_;af_(i*1mD}Ce^{I1dr@k{=K3x%~zOB1u0+Byxdj2*18VZHppN-*1itb2e z`HhyXlzsNglp-P@e+6eUqme2iCSiuV4q1s7wSJ6dtPd8Fo#!oX30VoSSbw+%!CG-&=`g<|es1X_$pujre*@<%V;Jo{(S^x$ zpR+|le#Rr(e^d#IQ}Q=mce`fFo4bW7w`Q|pwWYv1&xPKEgq74E^cU|n-mCkmQHuOtOhq2CSZY{`7lXZ}XcGsX@YhBOWP)XlShfL%-j+INqkH)K{^FZdKQaS0xs_bs~WsPi6LC|fv&sO zotBS=)!I+0CyH_1ALQ-wqVBcIeDzmdmMIcmZtrrh!y?2{v>6OMCzAg`cuia&Nt3oq z3dL^We*PLx1EYa;|E&3+SI@K%1{q9NKdEF*OscJl0mCtNPdN^-;x%k!O3&0X)3Fir4C)_Wd zFF7pHi7$&T2u$2>EDjx@{w7St7+kk(r=U9HIbEarr*fj=X7|JH6$+)2sj1clnc5)O z*5CaELnn@;4xx9kNW3e8qoQK*BuS7YMSMm$m_MK6VZ;I;`7>^!*X<}pH0BkChrXc-d%}`a9f};Qw-xQ&$G)<>YWcmSpvsqmuFgFNglwaT!))p>Z zKoE@)cZ+kxO3_qd7=IcEV2%fdl4q z#(WET>p(mMar@EC`$>$~>{Gl3!5-0O@dt4~F<;bM@Q0hj8bV)59ZRHRbKPg{7htXF zKfOg$rW&U_pjf3~DCeqXY9JlkbQ?Ni`_E>c7&>L~gx)=q8-f3NU_NFzEg zIw@@DU*!H^t)u5sD~Ru~Cp?=SXAs2v-GJBCsfVi;D^r!Pm94558nK>gS`J0nf?a)m z^YF{beSsWC6MG|XyP!jOP4qy75j_`t;iYh*nQs9tS%WY2y>Wf8*`SlAb9z5*FSS>> zLU~jkcIr>aw4M1!+r>PAhxo?@B^xvU*do!5(Vl5%PN7?as1u8Y4^ z7%v(kdM(@_xWEhHBr+=i86|-bh7r4??Hgd0S!B4S{j6TEs!__7w^VoyPIty|-AqSH z>_6RqF~x-cC}Y4Y%ypasG*$hP&|jn!l7zeYbGYwW=jj~UP||qZNbh*(UMphxV+8dL znm+2mD!X#BYNncmrhHRPeW7yeUFS9LzqsS15wu_QYSt?5PQFEuBUB3)2r~t%cpOeD zQv-}d)rYN^o$hOPJ$%}H)exjh*Qiu|RDD%yRi-9Xcf)YbY=p1cx4PG277?;2)qsd; zVh`mp1nI($Xo~hP!D#*f?sL{1dOB?n>0jJK?-wUxT?-8{ozVXeO(B1$nx=ZB`d6Kz zouLOzvCt#yV&^DtUtA!mmO79=fu-kQ_&WqsgvW#ep@%=1=VNCuao`rpYeEsG)lG3M zMCcZY@s{qDX1e-;>WV5wy+$)s_snq2TnR6=r@8$wI6@J5I&hV-mW{sM^8W}X3bTaU z1yX(}_de?deG2UzNsjY*gItSk8Ys^M8fvuhnh^CDl}pu%3IUt+ERz)4Z;f-}ymIVE z;yh|0Si@Y+Ilvfxf#4@!#?zoxiNHG)BSC`gxw4y9#}`@w3R?v;YRg8pW0ICku>d0(hE0#UpaBvOdu_(Nv@;{3PE& zSFLRxoNYd87^}OhIi>bfk5UI}PHE5R1tt)hZM8W*d5&Sn5iOMQ;8doC4e-wM_X)}c z+XVah5VxA0&Wr^MDbd75*vp<~$4Dy{;+wAO?`r#KHlictt2;Djbj5~!=36ks{?4_{ z*B=j&*3s_MH?t}^4|yv7aluJ}k^hz_=bU8yqMxOS$Sd%VdlSnu@(dE)b4`=_ftsU{Xg})O413H+V7YCJE6%6H9V20B@pKP!Dkqt@ zjUOrKA$ZK+&CB8JVHME-qYWWH!`pp>+|TU8kYvklW48X7c9EtBAJgH zPU&RYej1EshGwF+O$VV>ZG^ws`nWp1Cvf4Uv(!)EL1riW2baPB!|&wJ;}7TE;;dyA z)Bn)cp{LAX%xyQ%@d-P&?ZFU3G&#;#k3nswn}%lH9j!y7 z)U41R&_x=Cn_4WT2-&gDZS`%%%SkdCoqm&FAjo|UP6WJo>T5v5jj`SVZ z%lE@I&)yT6Ytb0H_49Qr(7JkQ3A$ZWKjwJ)_Fbi)i&O%0Y0NUObv z`$ggVq4`b_he%q6O3dx?K54#^0F6k2cR_#;jQ8VoN)9B@&SsRaEYL99mtyZ_(u+&s%xr2PLW84dUrKs65f|>|^XLPbo za^7-B^Ct6(x$ih)HjcRmyiYwy%D`9o*0>`aOlx1L(3E3H*C*;eX)Cqcb+7bGjhD=^ zu)x;WdBy`{#uAQ`&(cQGA2QFfeVi_C7SG2`=XSB#Xt##~aTGVYwW!P@2wVXoE+6!HQzU{a?VmBoZ7|Ynm3gwLB!dwdPIQJmO$wC+h z!LO)Uu@*1I< zPi6%B3g;kK!Trefa=x&gXj*&{dV9qZmDmg3QLYGk7IM`x&2-GrL%%{7tJ|iVsDEQP zfmXE>S#7`QYVpS4mJ#<+W&quE8tW_D$hpS-%pJ*{h)NR*#u2cRT0?q-pMw#4x*UyG z9(>n)#Yi-mb&GV1b+C?RxMh4|mckuYl|$m0i@Ap{A>~mwgJq0wtW-`U_bhiUH;;3c z-O2n#?+q-aOe2Qk+P(K&hwZlz0($E}Xoh^gZl~_M?ufqLaNAUGS&59cFLYh^wqn`D zKng!iW*Dpgs(YnN z(q|aH8sD4waG~|5qth+HjK{Af&7(5GMT|)-6lUf0iPPDFo;?2{HUVX5>M2FM=(0dK zz%AmK*_T*<(5mcI8JS7w#=P@faQKf*^b55D(Is5r*XDn zhhC;1tcUfX#$r>4Wdg#sQ(VE`Vc1241>`u|Gq9X-j8(=y$EoBTF1Sg+3MLZy% zYjLVPIMj=vl8ewYc{wAJwT9h`bC5HfbDTYnb(`@ID4@+GuO`gJ4)^wR{SQ4G`ax;t zbH*ix&-zn(wf?t3Y-%@y@JZ`<$6)s)-xAzX;y_9#ErlM&e9HR79?F@-X=STeTbbAB zGk{`>mq^50eQH!i2)A8@=U5J#{Ecyjulf@GT*G>!3$=jyBF(lp&X=BVm|Xlz(h6!f zKxX`5a@h)YCWpqE%8p~5K=)t>Z5#O-;X3xL_pIx+on*ZWT{gqU-v)-EK_6~_44Ebq zTGdW#l0)DY`uuTxqKdqaRu2AVjAYGW+t>`wJ@!}D4CYDt9H4^|OzMG0p;FHf=RTVY z&atRX+l>bdfPrneY`A9RnQfK~B-eJ_xy`c;vk59!5?_LQ zj^n3wK0M9x+O*mD#<1LQ+c3en!^E?&P(K8*e{_>H(RJ2PUqANu*8jM5DAQX#SvGsTIJWgK+ z?lo~5C7-4MA2F~j6*|^X_IK7-=5WS3Fq@W777(*>(|z0BZyi$GFZiQ{X)ZSsjc*NY zh6Bc%rbr7Ho@i~fpLH$sj>1L|I?--;4cw!rG5^ORvwN};RvHV-oQGD$qaGmT;dL0$ z+tYR2&at*bM9WFjAtP*PHuN!yObg5+C=xkj3v|le-+fnbbBTD$a@s%O2*xAk1s1?2 zvyZYaGLsq0z@fBOa!=w0+%;dGo8(+?lOcR)nK{xl+2}@jt#`&8Q!k4M9&Y_4|Hx>TIcTDfWe#BdV&$_Yu~so9j5*+F)Sa45 zypOB*(LGa~g|;ooS}4!F%km&O>7uH*hIfL&_`a*Hhbl_gb zf6S$FhMBpUb(j^%8p6adCV}H=B+4FQHI9p!;JNSgx0fSD zkiVrG6*-O@FQKbWGcUG;!uoYgJ`+!4YGr@f5l6jA*!FbQuZM?E5U9=3O+>jx#NtO`E_p1@we|>WD7?uMWgcv*GS(P}n-a{s zEb(x%b%)*Uyy=;MA>eNkIjHQC1y-PYr<57aqOrC!cQM51DLRm9AT1%}V41!J?kdM> z+fZaBq&HWZLQP7e%#>$pFi(IYP{rY~Bi-HNJ%LRkd?10;AV2|*W{hRZnIzVGrj=1h z?*&ewMN)pC%FY2ygQu74w|%E|2V7#=fodWW6UVf}G|7C?(gTjOF10s0*LcL3pSTIc zpJasE1#G9kVeDgeFw2-DnKKwf`Z!=Dl}J8LfUqNdPuxMyU$z@aF4W%=VqRs6GEFj> zO%C${C>rT)JLO=ypLoY$HTWf@Pn06sY0yc>Ft0K5nR}Tfj2H9-@PD)nN;7c^{xe4G zJ?P>%Dy$W7FjQvlG|e@QF+DeJH@~p-hoh`h>|dM%J?*|-I4W@s`8M?g5J8{ENN4`b zyug$(GZ{v37%+h5wg z4_~6^y>p&@kaZ=jw&a*`=4a^h8*c7lIRd31(Y85`Jl9Zf9cB)`f+(bf(3HR=`T_>X z9EwUG+ZY>BM`#jl9EDAKfDgi+_j26N92;y~kwR#lWxH8t`fK8v3(TFCX>gb|!@kF9 za&Pqcuv-b$Bo9SF+Y9Ehg0sP|Dqe+tF}bE)IVbo7*o!MyMca=GmaD;qfm&9a;`Czw;s_srWZuc3a3pDn|& z&t>o|#-ItQ#2w^))PcY|u!z2!QOJ142xDZ@4ZvvHLP|f90lx=J@m+HFb+YVI>k62K z&Tx~tzj>=!h?*9g;Bc#-eT4Ilo9#P{HKPXD9Lhji8xTgPGfp#}GG;O!)6apyzZX) z5x9q*$vDo~%y7~r^k!ffZ6#$AiA8vh?dPj^A9BvHFSUMwXF<~~pUu0?PtAQTsn9_< z(#p1{ICr@_(L3h_-bUo2M$s9d0nDS1W~^nzF%HnTp=Qql>T2>pB8)qYiSQP?PCNG6 zULsMj)e>ZRfv%L#{KL`$jYs_xo?|d-fO&oMaPJ5Tl7jMpCI-{#FgjL$Mj71&{sjim zHc*z55(y31O+JCA*!j@@!AeD*K=&*j^A~d~dWMdJF2FHXvfa-)-Tl_f$F9b|Bo>e# zQ3n7gz@6x7^d`Dq7Wc@+_hR{}VIU%W&5@N^Blv6Pyh#wiwM#<~U1-1%hTE zEE~ZQsO7W=0Gu=Xf0C+LNupxG)YlP>TPmi9XQ%GYe zAZ;&j7hF!SLbaBy^v~dJAeDwDtdmv{VsS0Llb-Re496(j9V8o0h4xvJEdwndQ5We0 zoN7hCHg!ncGrdnSFfNjqPG(b|((HfUq@w>7*J1}OFctI6Ke5Nbmts*&vVYP zpSRMHYRF<)X&G)gVu^%8;B^Syrm`c>2+s=NJFErIA(1IL)C^!c7)ifKze68QzX~1) zVrcs)|C0V8Ou#WP1)g)RosLU39dZ=j4&|a_Z9-T5F{0t93Hs2d6{NEPE{z8MDGW(mlkv%${eRiwuVkL4FVenhB9$0y5qzx4m>ccK!6Id@NiP zA(RA>k5HS?GwTG{2{wUSz%Rg4+Gy%a)VFKG|HNMLZS*W~ZE(D?#aRuo7g_*?LD|qJ z=pXno!n6Ib-$2j4A6_{I{R0xwOuC1z`ye0)ybqRxH$g7yAo-|=DCHy#p&j=dbIW@e zHJ+Z^X|{)`n)L^o4E2K!L1C~MnQra0-Eo{o)v+(WCafMWC%zyLq+X<52gZO;z^C9? z)a1EB8%ljk))1|D1-8KV%yZlI&SA5yvnC^b;oH!3Xf@OV-Gx6PB2 z1S|!xKsRcBb&Rz*hhZ8i9X+Qq*d6cD8T6XPfJlgKvLhJ%@aQGhqrG z2R}qlzJJiZ+T_S|$vgrd9}D93=-H4-IgUD7Gl5b-3%o{cqT#eq>UVM=X)<9IZX;$3 z+M~~%Zu?GKmbEu>5>A98;Po&Y@gPaId+1Fsb(2y3#DPkDZ-`ULg{X3-r0qwQqu;;+ z;4SSVbrZ!-8cJM;KY%^%yX1M}GB_sLA!{Y#gxA1X@D#WJK8jqlcH34t!d)0tQc+^+ zaBm1JNeKclNG=+E^{}B7Z z_t&F!MLW;ilWi<(8uAccj*3ef_zrT{s%QE z^Uz)hpfS)Vm`d7Bc!KWdTCW*(T(&q|wvT9MVUa8FKD5_|BO%rSwp;dOr@{5d^TKxp zy9M8y*g_gf*-c$V;{r>7<*1pohjxj&jDjUEBHqLQ#di3ds9>_tSz%vm8*N>Kw4%1v zQy4%#Bd@JG^u3ngDs(?W&CGSU0R)7&lUzpWp#DdT1JKW0KmqFa;LvXGO*%`+$Eh%Q zUzle)>X2pHtyUOSk4oT|upC~3WT0}+O?!m1!S%@Vk8e440G>d+O=3{`Q&VV7sO8iT zaL^Xg4pHY*2xK%eYB2p!pNVQY%(eMBdsG$v`ZJyfiKC z2(6i_qP!!IAiX8HQIF?;s3uzAigdoRueL2iXPANjNFs60w0c>j5+B2e@Ay6ZB_C10eoujeaC!C1hjBIln*vCZ%UZ0K&_h>EKqe5?V*T(P1y2eVyn#PXA2E}{3YrIrYdK&92 z;bW4_+KcyAYiDL;BJ8M@2?rCVC!|H~su_tm^DLiNV#CQc^F~#b2mKDnGfm<EK;&0=^tM8u+daEzZt8h2{o~N^B+jpIKiD~Zs_K+_rsD~ zDvJlc_uBo;oe{4X|2jS-F5|zu2ff#RZFyF8FpR9BrJy%{WLI*^!>Jn+Js8~??HauT zUn#H;SuMpstO8vTQqy1QV3R-DTkJlL|1VxM4tp=&&MoUT@D~JBP0>l=VbYTQi)ff{ zZ+50f3P)#0w?rpKKZ*8?jK!!jpiX?kMiZQ9^*Q-nP{7am|N2`mh;xhL>D=?~aqp#H zN&cp)nS0?dn!qQBJ60+uA@XOWL3D0(RwYU?rk6GQsbJm(3h3&Rd6_j`V1Kv3| zle;F~KRzLTGd{qr;WhSW2JhtenukkCA-02OwK~{CoR*kj7no|D5eqF~({-@3Li8<) z{TvC0YAKfn9sFj9td|hmCL-4Jxp&;N-V48!T(9!OFl&T7+E{FY|9TY?WX@>!Xs>9# z=r56{&Kvur)gRsHVEPD#-=C_TOdGuRLbs-SA-)7MT0A}(s#Y`qhu|S><^RlJVzY_- z1su|Qv^Qv>fJot*c+)v%3@lDVhE4#1U z%kUcu$$2WBSsoUkJ6J9;)cV<8>-3DopvKjRrjE{y+;E=Rr>&799mHFk3^Re6DXRoI z{36~^SI3XW&&1QZOWpQfD}PdOO;*=`m?q>lZO#t}ZKZSK&dNxtXz6H<=vlaWot?IJ zKI=04qMM{acuqG%G@Qh`|L4}iYF&uO;;r1!y@^qMAtxxQM~Cnrn9FNggY5oJnaJtL z$I;KDZz3Zi=U`0zVNDUa_$K-VS!HtRgYXp_Lm%AW=5?RNU&IT#zq-A>_RzA<$*=Sl z^A*`m3-D>;taaZ$;q;IE8%Y~w(QT0&krqxXyRdbS4`Ln}7{>Gjm0!C4OYdWEh?~)k zA@2=<4fhalFq<5t9%4T~M3?*r|HP_nS9DTDmPTGiNc2*qOXPra%RXz(7A5#`T8*4E z_0VIj3nuz=y{m2$H?5l*^E}}W^SZ#)IwG@c+`f@nl<~G=sr9Qp->D2A@I~Z)WI-e` zQpag-7q?#WsVp5`5PoX5s#fyL;4|pP>)eWNX1AC-%}v5r;$HfhWLNd4u7aIYlKsS= ziFEcy&Ml`;oy~1u+=x|fK zp8m*Sw@j^voA>C8uCXGbmo>)j;(Q#LhG!kds!OM$)7UPJn)(yEhCLy?1~o-C3+keu zx#ae6E4Yo^b?#T5=e>cg++6(z3wSw613&M8c!+gRb}B`dMfOG(MoLD0a?W9`R>8%6 zN5_&>;YwsICLj9my<*;Gw*#Iu-hJ&Z@V@tl2gy>aPUcEjjc#R@C~q~eOE^!Qj*%7k z(;@QMDely>%UVKgg$R2!>}I&$B_{?W{k7OTbKTB(e}~+v9*1R?O4e3ub*gYAc}8pS znPL~J&S+%ifsy%CSP))dtZS9oBMEC_JV6s6z01lh8R_b*H$4+!e0nt@Var zRBPo+oS626Iq76}gQu}_*b(P|Qz|knGAdFna@oo4)UqpBiQ))rPvh`O@}qw32sZl{ zy?ovQ$b56$t8OzdwIBDRvVxke-CZs@#l@O`jIt4Jg=!r5=1v9^f* zFn#xu`r%8x2sUKJpq@X&qo~pgp$TU3c6ej_VZkzaN0l&3LP|TZt^9%bVBN51If-xz z+eY$7es{9KLak_J5|`Kznx1Smjde&njJ9e;GW#WOmOmnxDUYg@rc?Mk`IxmqZdhuKwM#n( zQ7y8fMl5iMQ_`+%b$I$DRkGb?pFRZfSghpT zSXOA*!%YcosW$-$%J}QOYOoFqc!Rum-fDkLFhTwTCAJ7e%)ik2l@?X4eD*`k@Gx@C z?@lk|<2)EuNs)@5hrL%ce5$voALY~_8Id&}BP!@M^Y*}lObm38sLJWl=4|*0ZO7)q zDBfTVv2k97k$BRX<$Uf;vVVicxRDQG#psjpC(}w7fPkDY=;ELEdU_RLY5s`aycxND zj9iYsFH_hV(&|%|Mr5&wy&u(Z8Fu1Yr>S$r&W>m=Co=QW2D`u+v1R!``QcfGFurx+DgNxG?77~aH}hpX{6kmbIB z(pSM5gY{~M2<>BUu}+Eu5W?C)<-Bdy=;5lD90ltztG~;`?^eCN*f&S~sliY=Rc+VL zahuYUu4G5~8L`FcVS9FCXN1$o$>;2{6YcU=by1Yt>@4{)tY@-mu7u1J48aW7V@zwk z_ufGNbG$(*Gw90L&j(4ICh-y?zoijbnVq&yZ>PHR((YhyfS-GeuVVw@)=Q{2tJFNG z*?0Xa{&lR=3h$y<0-oNCV6YscRzn6&L%yXW*fPFKOtdP&%q-%xhVPicS!Y{z8S7h7 zmgBdxu(SG_%IIeD%Lc&;KZ}1FdgLL`@yGf35bZG;(M2FQt|Wg`%@U!F{cVk~V=ztY zL8ZI_|8F%$^#{Da$+Q9aBzyuxZJ#_JI6)6zBU9~%=vm#r>dy%V$-!!_K5XJ)e%cb| z-7wMC$^scNHN44ESoQg~f?-w{HT6q$4adTnrmL=}8p)yPXTI^Dd8fQ<-lzU-Xuw3i zLG{XR>cQ;WMXw_oZe!h>+7}V=MWIQava8!mF{+FFcNl#=NQp3No~ipX78DF-`APl* z@2VGiE&PAss1ATxH&Jgkx1oubVhwp?QPTQgO}3xgS)Hut(+upS6}=s9 zF;nzFHB7DyUP5O~>HmklT-aaXmkpSFA>XS+NOaxFeAx2G`EFF5!gjJ9*clvc@3g`cyU!cHKF8dpTe&S%du);$tUuu3iapE z>ITz!Yz3b!IzXkJYF|g3K7!qv-=1cj5I6Zh>>yo4`h+!1A)QZEl*59Xem6g-pNQv; z^rgQh=r22}o_exL4*$kUE(MQ@XUH?}n{?rh((@>xwpd)|l@r-|gL`9mL2 zC*%u=kI8;LKZlx(3I*XZIw?TYo7PV`knlN{!XaYzhMtHR5jsf_Y5bJW%Or6!$_?AWn_o(5K)Jt z3hsmJ*GvpVo#;s$lQLm$oK*{}7IH0I((V3mzd!udmws<}vUlYvbrMq4WQ6XSgt?7CRAoaxPLH)33L|m^_H&c4s;Q(Ks*!LgOF{KrgePtB zwLc{I1h&~>wND>2|AbGGM?bJTd=s?y+g54&JG+Nn&VFchu=a=-9AEKa8n)#Pb5UP~ zOj<}z3(^F?`%C;a{tfKr)5z_$R0&Z-bToEON2sF%)e89x8s|HIm%rXW=BI{Dn+>Ddr?%+r=5Y8IV)P0-z^6jLK7c5# zjg`t{|7|rx*Y}F2;u%;XWh7=^YY+BiLkP4*g4=l3KCF7J-~#GkbyYy;hD=_TRHrpr z8JIl|-c<>Qc>v#XU|5-32$c0hu zQfu^Tvnkw7_S0Q#DSYL0)>3G|h3(RI21IBbYpZz8)A1b0GMPvsYJDc?%>(6ypg|y^ zsa}HK+8kcxXjxU|f|vejn2Y46`5^zj=f8??AsMH%3)o5aGi!VYgMmtlsl{cFg3g@VOFK8$LsTBPS-KmSBl&;@K5uPWXmvTj-F(RomNw^iBN z2(vIV6zih20LhI!T2i-A^W|Geub)6$f9j`$O8RdwPF7Z*!Cp)eCX%!?HIwWz&L?@T zRn}{$t|{zm|L_0S7eDZguvPbx-4F;5z>yQG9(?M0K?=M@9()t53yL7xH>nwVJRH@D zWCBdnmi%*Z5&ioi%d;Yognzb5Tk9~Y?7TFqL@SYsh|wl`D2&~-a&}NMu+fQp5ey2R zLng1NGHPnjc%v_RM{lw1ybrYZan>ccuQBVS)yH}*>WJxl2RlK}!J0g8uImqQ?fS{v zK_8gQDS}K`|7}4jWQLzny#|@SVIR^RRkaKkkZa3WD-rQ;tZUXntDvP*091;9WKsCkje{gSsWc)q7W^o`QE7BcKQ#|=qWFg%LKj&V`Ms01%ergbv36qL zJQlUYOumm@qPNMv(9z>Mt*)YGNd=p=a_~8-YscVFPytzVjT)i5!GLW>>e2F$!XNTk zkh{mhw7q5>w zKZ0tgI4hwiw}dTRiIjjBY1j$=J-pT~cz1`9Z3bHzt+|Nyf;dm~p(C(!=0QyTM`cjo z%a_^@u18;U!k27KHN*o)n) zl-6{J%0+R*GlI?_%g}+G*6&p@ta}Ow-2H+!nBT8KI=KX+BKjY_AGYukG6@;06n_JQ zK8iOt$6AK5m9)-@3Surl4@EIG%|;4`)lCn*LcNsD<)dH$Vyh1<-v>cc`AjZTU35i= zmzjt~pQGcR!oL!SVUvGv&BFU@2HAF!c+QLClrt5|^Y-whd8pGMCvTB?WI-v`k+by z51Ywtc+U7>eefn|Ctt}Wsx2~dW_-N-id;nf>WS>PMkHc9L!dQRgC0IwJmsZe7te<( zdNRCYj4q)2sdKWLd=RXKTD&+o59@s$_MoSZ>y>6w*q1b+MGy_Ucmuevd7%>bvzl93 zti7T*MsVrC< z=fc}=34=2uqG2H~CbnaS)nQ#%L%rDw^>Z%2&C;^cv>E9i&OyeCL%iK4%Rms`gD0JV zrQJ`)wMZHx!(f4(Rmz#@fdXf!?c)9@9upr#wuPh_hiF_E7&8TAd?&_1B|M!&S+klbKz#hXjAkJhj?wVA5mHqE0w{z zAihJ_SB{Tod+1$4NsjPaGg_ZeIn^>*96mb!%UGP1YQbr(u3oET+^jVYi;_h8kZxk_ zxWuXAI(oK(RuXdPQi0zJ@kcBtYea{VrQs3t2GKBDJ%eDIMLx#GCw>=3WU>;i`(l>JCT8&`uxQ)Ssbp(-%|uNN zy#!9`bcpi?V={<^Y0!fgsj6^GFJnKCBh6_}b{F?N8DRGQgHu>)#QJV1x7T?E^dDzo zzUCrz!eM5IR#1R1%N{Zbc{zaW+yTODZS@?VPjoRQ!c^n|*+Kuua>D?xjQ93Pa7&?s zm?$!d8R%<^vK}}E91UNYB-0W7T9VoTVfbUb#Y9;V%5YRIRu#3@r_5sPoQgC73T{t0 ztvw+azZ8LZ0L!?p_#2~|%dSAUFF`s$Wgz>0a zj=GauW``F&6smC}jB1{4V6ueIaH5z1Py9Wb!Baz`-VKTRs@Ms|IE9$XU$Y8q4Bbus zg9=;U%-7FUQ`|U=fdQRYekI$;U*IDzRb})mz10j0Yr-bKLFX{sW229phFp3{92GM~ zS#cJlTFM^L9H`Gz&?ReKOK(KH@4-7PkBF!ZZTT)v6HnAkUBjdbuZQbNADW-tKrQ^h zTZrXYrxSRSo#A3n=5JV4_5)08FU*fKQ?eGwesQ^2wvrVvvR*Kpv#6g`Dg9WlHNC=; zFzAobp)4!k$UhSU#YS;RY!lY%S;D zWZ4R%`cZ#lXm}=^ix^GMj-WHT$-jYVy+!Omj%XnipTOU-Z`oXWkwnQi;Yf2rXVpKb zMC7dgcve$6OdgU+Y6ZIOdwL1FhFs(Y?w;B+4zt!0t;Ial)|FxqY~>@!46E4(TAB_d z$>>1xAsTLD-JfEH-DOM6Z#nJ;+F?|abtw}wd&4oLGBVZ%RuR%}Ze+a0c+zBaS1~>Y zqpHuA(L3Z5(m0$8t-J(e?cC~&oPyZuhQH6qFCkGE(>L@iQ$I`(#diTZ?&oX>Y~m_n zlvs$p+)ZQ``*|7M%1Bxn*81t=b+MtT+3wji?%!hD0=|wZMeK5!OBWE?l%J;#lrxaUxN&X9S zSTnku+=Ecv+Z@$j>Xk5*?_kHwkxS)qIOctjuSV(|<_gsNZ;4I!;pW}Ny5HmZMJv$* z^UI5TJP@O5&2~{rtCJrfB`2AY`i1&lrBP?)8a!!-d@9SSO{$1Kiyk>IWaO2k85MA{ z3-Ptw@N%&0+n^(2@Z^i*43LU-pqt2>utYe{T+`+CZ%~$Fh|P6)e;2Wv2Ozf(*ICRN zoa(ruOH&79Xmi%(k9qBk4y zu(zu~$1b8z>E7nE@Sku7V)PaIhKzg~e}X8jiIpk>1%5TUzRjrgJ>XpvQX^boUg;+K zF9^^naE{(1_hZ$ws-fzY8mcpx!)8F3m)ygrU&YvINa)*fA}@+@l|c?Y$9uwC@5qkP zjI zP}$WxoVi}gk5y~v-$nHS-OL!X89OIRw<0%OW;OVF{uBaz77-EG_;j8Jqsqp{(HkT` z8G#rrXcp=8dabIB{P$WuN0t9t{itF%nb>9>ZZvhci8Q7k=tO4mzWgwE@vPLi8Q9KS zp$>Luf77qfHQWpfg;UH6-Bv$TV<4Sd7?+eeRA+SwJ`^I$T%qN(&DDNUw_4@@PqMd#7`VAAJA){^ogRYlD~hddDH)Sr-LUg1Ph z5uSKI{B*ko-^3qqlwy7#)w&6KhMw#OElcNBwq#A(!V*&12?}tAiM$gh#>^iH$7xD}I6@QI+uHg02U-e>lX%)JP_+bN_ znKGEE$bOqtTa{0x$H+>nf$EGZu6N0g`z3X&^i5KY16Fb7eY%&+rj=pTOLgLzi$ z!8~jM^++S^94G8(BLJ)&Kw9`Y*BSBh_E3q~3v=dfg014|yC? zy-P>3cj#vp^Hcl=_F^(3BNN|*4sscCUpw6RWeP`_=ej%AeI;gCLgmH$I;r)F=>a;f zr5#=kIx)0nXrHJ>Ic!&E?r+?++QRnYrRL^NE zoS2fx*zlpLhfh4}>L=(wJK;H1umfkR8|bgL>5|CEolyzbkn*TsjgkFw^ZtAd-;0qg zgmsT^Rk6bCXPS-JjFna7$Q+JjG39 z0-Ma<;uE3?sM0&|yrH}VPF{W3YubVSK?>rN(3t6HZs?B4Gs$WY`jCd|JGD^VLofQP jE^3Y<%edh@Qh*+$71>Ulb=sk$`31XX8gIrEP@Vq|HvEZ{ literal 0 HcmV?d00001 diff --git a/mobile/scripts/add-share-extension.rb b/mobile/scripts/add-share-extension.rb index e6f0c70..08ce1e8 100644 --- a/mobile/scripts/add-share-extension.rb +++ b/mobile/scripts/add-share-extension.rb @@ -112,5 +112,25 @@ appex = ext.product_reference build_file = embed.add_file_reference(appex) build_file.settings = { 'ATTRIBUTES' => ['RemoveHeadersOnCopy'] } +# ── Bundle the custom notification sound (notif.wav) into the App target ───────────────────────────── +# ios-patch.sh copied it to App/App/notif.wav. Add it as a resource so it ships in the bundle root where +# APNs can find it (the server sends sound:'notif.wav'). Tolerant: never fail the build over the sound. +begin + snd_path = File.join(APP_DIR, 'App', 'notif.wav') + if File.exist?(snd_path) + grp = project.main_group.find_subpath('App', false) || project.main_group + already = app.resources_build_phase.files.any? { |bf| bf.file_ref && bf.file_ref.respond_to?(:display_name) && bf.file_ref.display_name == 'notif.wav' } + unless already + snd_ref = grp.new_reference(snd_path) + app.resources_build_phase.add_file_reference(snd_ref) + end + puts "Notification sound bundled into App resources: notif.wav" + else + puts " (notif.wav not in project — sound not bundled)" + end +rescue => e + puts " (notif.wav bundling skipped: #{e.message})" +end + project.save puts "Share Extension injected: #{EXT_NAME} (#{EXT_BUNDLE}) embedded in #{APP_TARGET}" diff --git a/mobile/scripts/ios-patch.sh b/mobile/scripts/ios-patch.sh index 8008800..e96562a 100644 --- a/mobile/scripts/ios-patch.sh +++ b/mobile/scripts/ios-patch.sh @@ -101,6 +101,14 @@ echo "Entitlements: aps-environment=production ensured in $ENT" # the speaker (headphones/Bluetooth still win when connected). The helper is tolerant and exits 0 even if # the template differs, so it NEVER fails the build. First-pass fix — if WebRTC re-grabs the session # mid-call on device, we follow up with a plugin that re-asserts .overrideOutputAudioPort(.speaker). +# ── Bundle the custom notification sound so chat/call pushes have an explicit tone ────────────────── +# APNs plays the sound named in the push payload (the server sends sound:'notif.wav'). The file must be a +# resource in the app bundle ROOT; copy it in here — add-share-extension.rb then adds it to the App +# target's "Copy Bundle Resources". iOS accepts a PCM .wav (<30s) for a notification sound. +SND_SRC="mobile/ios-assets/notif.wav" +SND_DST="mobile/ios/App/App/notif.wav" +if [ -f "$SND_SRC" ]; then cp "$SND_SRC" "$SND_DST" && echo "Copied notification sound -> $SND_DST"; else echo " (notif.wav source missing — sound not bundled)"; fi + AD="mobile/ios/App/App/AppDelegate.swift" if [ -f "$AD" ]; then echo "Patching AppDelegate audio session" diff --git a/server/push.js b/server/push.js index 48d3e45..4a65c10 100644 --- a/server/push.js +++ b/server/push.js @@ -88,7 +88,9 @@ function sendApns(token, payload) { let client; try { client = http2.connect(apnsCfg.host); } catch (_) { return resolve({}); } client.on('error', () => { try { client.close(); } catch (_) {} resolve({}); }); - const body = JSON.stringify({ aps: { alert: { title: payload.title || 'Biz Connect', body: payload.body || '' }, sound: 'default' }, ...(payload.data || {}) }); + // Custom bundled sound (notif.wav, shipped in the app via ios-patch.sh + add-share-extension.rb) gives + // chat/call notifications an explicit, distinctive tone. A call site may override via payload.sound. + const body = JSON.stringify({ aps: { alert: { title: payload.title || 'Biz Connect', body: payload.body || '' }, sound: payload.sound || 'notif.wav' }, ...(payload.data || {}) }); const req = client.request({ ':method': 'POST', ':path': '/3/device/' + token, authorization: 'bearer ' + apnsToken(), 'apns-topic': apnsCfg.bundle, 'apns-push-type': 'alert' }); let status = 0; req.on('response', (h) => { status = h[':status']; });