From a8101ce76c705fc65a479093b58bf2ed32e63475 Mon Sep 17 00:00:00 2001 From: M_Viper Date: Wed, 21 Oct 2026 16:49:50 +0000 Subject: [PATCH] Upload via GUI (8346 Dateien) --- mobile/.gradle/8.7/checksums/checksums.lock | Bin 17 -> 17 bytes .../.gradle/8.7/checksums/md5-checksums.bin | Bin 105624 -> 122133 bytes .../.gradle/8.7/checksums/sha1-checksums.bin | Bin 247487 -> 260987 bytes mobile/README.md | 2 + mobile/STORE-EINTRAG.md | 63 ++++++++++++++++++ mobile/VEROEFFENTLICHEN.md | 35 ++++++++++ mobile/new-keystore.ps1 | 28 ++++++++ mobile/settings.gradle.kts | 6 ++ 8 files changed, 134 insertions(+) create mode 100644 mobile/STORE-EINTRAG.md create mode 100644 mobile/VEROEFFENTLICHEN.md create mode 100644 mobile/new-keystore.ps1 diff --git a/mobile/.gradle/8.7/checksums/checksums.lock b/mobile/.gradle/8.7/checksums/checksums.lock index 65f6599883430852f2b03da483001620a612401d..401f2b1b209b5bad46c159f19386211fdc23dcee 100644 GIT binary patch literal 17 VcmZQxKFRA=YSN3l3}C?b5CA67t literal 17 VcmZQxKFRA=YSN3l3}C?93jjRM1&06t diff --git a/mobile/.gradle/8.7/checksums/md5-checksums.bin b/mobile/.gradle/8.7/checksums/md5-checksums.bin index 52912c50e279ce3e75104b3582a6bb22f8cb0664..b50fd68b5d6299efc0f6b251110c182054464e89 100644 GIT binary patch delta 6150 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 lNH&27&ul%-b}d_CxJ{W|6D;agRc8W&;$ delta 422 zcmY*UO-NL69NhUo)m#EG!aqzsM%PuaQ6dh6Dxg z3{#puOz(A@Cj8ZO;ZLyFcp`-Amfu5Yfcf+l7R`b-sN8wi*#kknb4I4)AJ&FaRAFf+ z9?P&j>0J)T-vmEsWGzAC>(%7m_`o1bsjIeF=4O2uL?xoIx|vVM*5 zi+w|(NZh8`#AC`x&d_r55&3?vQqJLlS~b~T{5sNaT#r6;U){jeW?=KcQ7c#+2O!Vp zPy-I1*20X=!{E^QqQaF|Q$n5rsv>VY@j%Ey7wUwWOouJEG7yH)!x!Lme83+)=&ncr diff --git a/mobile/.gradle/8.7/checksums/sha1-checksums.bin b/mobile/.gradle/8.7/checksums/sha1-checksums.bin index 5811f033df79f5e9922a857cbdc35190f3a450ed..f237467e60c4eca5ef550e7abe6ea47a65c0222b 100644 GIT binary patch delta 18164 zcmbVS3pi9;|F&mb3wzuWNd_eWQES4DZ|(p{ViUjof6;h?Mh0%hoHbm@+>MV(9=;fO?`pi$hh2YZ^hB>til|Xx# zDVZA~Rui5rpe%u)O_si0j*Y1htd?bnsd%EvO<{p6Eh-__vXbGgqK~#E+!@LZz#!JU zj1j9sMJE|t`*B+0D#R)q896Ft=-=kM7tP&Q53w#GhM%fFIyfmG5r%Zw&He${Qn4O81xo_ZqKyiau9W8sN zdIEwjR*vdB?dA``9(zWC#vRJV&s##C%yP+v;G1RH+vb4zda{x4{KKP%AlQsCyyxnp zwl4MC6!p3x)>zAkom(a@H-;I{mY)Z);cUlw4hSl?vdtiO$5V(69LUbl>_8|npEVaI z-aR`4(bkQOkOkIir)9zvR&^vmtb+QBXjfwCEArY4r*F5|G@@WQ=O>Au0N1CoCGsKsGTVTWZm{+db(ErWZiQ*C58W)=V@~&M|!L=0J$G z&R~eOQPF#>_;gWEWr+1zWY25^Q@NMCK_h$J5Cn%#Gv>8tqB>h*R8N*@KQ zixRWEHv!QzAo%V;_QuXUel+Q;;MT{>h<#MQlOgcg8b#wGZzV+>fW&&;Y>UtSBs4VX z)LtE$2m~vN83ldTsMt?LN-5F;VlCMWfqrY$KYQzblu68aZ9l`JzYHZChgcu|MI==( zD_iVK8VL>P?Khga<~bBMoMvQvwMJ`l#lBwoU<|R=?~K8(N))jXyOGbIP$FXKoNTc{ zFqkRL+ZVf|Um)}CRYu6SJIm1@AOb)(a0`V^k|G_P%Q*LKj zEP?pIM~3cqDjHNVbGgI4Zx9%ySDi(#9nKS8%g$<*vO4#xI+BveTMmPH0p9m=;#bB;t+Z@l3hLAFQDc% zw&r|#@fk?$EFKRa&v5GYJ+jFW;vK6Q1;6wt@|nG(6{K&(aEG5~_x!R)P~{b$c5MnE zm@fpdB?uCT>M4~aEIe=$%0KSHauCFXq@>R*<424RAl{hZ5kw0$m?AB%S@95(-d1Cp zN02h~_1!d$BHI%XEGfi3A3<1Zv3CPAWFHYH+t>c_UM{=(Xm4hY2_2H3?qZe%ARs|2 z;}x2xPoE0Wcg9%7QN&t}l0s!V`<{Z}fbn<;W1|@q&0uW`#G4LdQ|N%qc&?oC{Bt+kvj{B{Z_Y*VB4kXt7vlga# z2C+u%!Zz;-*>oO~zwN~KpFup)oOm6_m@Qcl{Fs8(oI&&`YrlQo=vOA4Pq?{Zf@hH? z%DTSxfkn4nbRpUq!u)U+5h0^p)Ek{Wa~mOAZGn9_59U(8WuMyVz9|rVy`3o@f_RWA zww3$cXdajYgd3BXK4FL!3B6HMQfkA05Tf0I%u5jnxNe_Kq0D#`xf!BmE3tbF&|MLu zHwJ&rAwzJe0Go0VH*;UGc43@41nYibD{ydyK=bSclg<(HY;6BUu$sFctl7}?H*s#& zjE>LO=96l&TW20~hU6c$%nKJ0Nkm*`exiN}kx)Q@YJ)ZAS%?Ix zF~1GCd+EDDu%>j}t+b@s_^)jbiLLgc0b><{(F%*t*cR#-0LkT2nEE4dSTUwuUZfO9 z9641?Ea4H7iEbXVs~^0x3^Ko5Wv(tlI>FuNP^+3&KpaG0JelgnV2hxqCvEmp^?Lxh z6(P*pCtw;-D~lccy7&KrXcLNsmx6(%9;a*%ZCM1tu11Xd6fD zuZB~<^cUBt95INOuf{GWl31wVa)mG7_Qyf6LkjasA_bxsUa4rNpNA%z5Xs#)wL4H;sq*DHHbbXV}db=Co?vkR7paGBv))!Zn*)!>h8g6V!_ey zw0VB5>6b?k?C8Q4#etk^E6g~uVHHuceK%!_-X?+aMJGU3gL#LzZELn*M>0vns8Nt; zv`ijx+g2{YKF5Qgc0;yy`e%tec|H%bOhELR0@fdI&{lmB{vW% z)9)evRoRjT#j(Xb@T-BzSVcNsdt_!(ol)l0SEQT#h#mHK4QVx6CdvFfx;GON2Wd=! zx1jSB#Ww53cVq8ZK=|8RZ00+Vs`k#N+7i?fGN;G0>|9X zcFPU7ecd6-n$8^kK(gmYOA>zaDf@na=&(B0AP82bHu%u1w7i!P{HBWy3W9{3x%=3! zQxVS~*lx(o_(%f#Ub^e$RG%7RW#6!{d99=<%DiS-seA!}B*?7_#0pwTnW%|(Akw-d zm57>v1&AP2>{J`+9ctL?eNI-3m|NB$wqz2xgBJ8hxNS2Vvx59L=~!$#SXRkB;W~rU zh^ppuEHkH_1g__WZ&SiLF25#n>BDnui5MvQPAv3y?tMj62&EWvR192$YPrFu)vp8v z!m!Uaj%Sf>#l4lWyWLeG{=*w<=qBl-!exDL4hok;uyQXZ)=}+q!Aq%N!@={&5I5VQIE*WH`ETl54)yPqZ z_{x*h&WG+HzInxTQzx4s=*Ldrq1^UzpjUe%B(u&k8Vt&?o(1Fu z=*}f)+*gekdd=mG97BD~LW|so?%6p+-oAv37P46i}JId!?P&GMx2XGs0t z%4F>!*OE|OSxc3&Q(6#xBZ6i6ff1;oIn87RIs|KGVhQ^}RPQlKjp^hP2-XH+3H8V@ z8q>H%HBO9}mgjC*_p(D_V%q!#$1{c@SXYL*v?4>4;a^7N$~)=A?*i{{ zW7ch;_E0`SmH^q#%A_ukWFL^&Y)|r3=DBFH&OAEqh;QDR_m>tMInQmb1@FT6o6AqjMO;W1cq z@Lj`;ISw;kGGGRea;~badYX3bl_ygBuId`l4D~kbQ`VA%1M7iT9G{>c;YIsx@_ET< zu8MQu$o`T2rjir5|6KX*v|3qb^RuOE--*m^-8h9Xi^4LuBl0$Lr~aTEzoB5F(cN*} z?9s`GR;74Fh+Iki+HnQO6=@{8^9ON3Zyeci={({l;0)ezmw$;I-8a%XL+0!%g-eH} z`}fzht|od@3RU8dC-#PmijK>0Gq_XvxXJc>*!;6_pT%S$`R-YB5~um_37dm=NIai= zEHB?#Y0)?cHQZo zmoR6I^6IGP-p69}`1s7gG>Y(DV0-bU;&nHN8Fv}pMJ0F*02RhsLy}S%c;u_E(Cg`0 z7wBtIyZ^pN{$-E~c=(IGFud$cHj&PQNOLtH`XP&-V;udk@s=hRG9KtGU3y%Vkzlpu zacB5)7~UN}UqBN9+w)IU;P$|~Z@7r9;wp>H%6TiN)ImRBQ#?0VIq}FX6%Y1u%8R&P zg{px_~r?s|q*3~x>tt9HAT3Atpst}s-gLUCl zY413kJGkq8(Wm;Fd3mi&1wR+E2UY}CBH(VqR9}-QbS@oZ_X`XM7QFwje*LEU zvwl(79RspvqGK5KHAzaf^}T7!w%pyz+GzRGT@ z?oHQPc^dn%LFUuoRw5!S&H2dj7!?rdJcuA7zF|Ql$Ab@!mA^k`m&Y&vt6%NBrqHza z_8uQPbXLIdQPQ}EkB=YUQ-7cW3xRK3Blx#IuCn|Ur}x+2Hb^=6%H9VJkH0n~X}%Iw@7J(XO!Uwgx9El7POt0`4cg z37r8Sf2aaxuy6z_Mt`D|N~VpK(M44~OmXoUU&bzb__eb7(u+oCenEjK}6;_abiE_#K$fO zOA}VE=>No$q^11 zM%0nM{Ph{+qYFFdtj#F^^z=}=){8xcPa5+_mrl}K~70);x>0FixDZWWq0u-3z7B;kS5?60*9r@I4gM8s-H zq#R%qt$7eZMEng8G|B<+!I2lKA3T(g4twn{jms9Em`Bm6==fX^5N_v7c(wi6Vm&C zGu!FybjjwB{{xnIT-^DU{NG%%%Aeu`LtkAz%kCkcK<&gX0u`0349o{!af2pM%f8H) zl8<}&jNWXYez7N(zmPBVTE-F>K0yldL>1VVIS(F)_iLO7o*avL;`~AV7vA5hciCIK zSF$Qt^u4cWfJlM;P&EnP8h@Z7N-P`vi~^0D%y|}hUz1GwhVvtp^&?^Nh2OM1k3+K` zFQAG)7(6-5c&TWvHu1ly=p3@CvIj;};{}f}<{D-BVvCz>5yHehe_h+agu)!C}Tj21d34yrANZo9a2zBr45)TPm5>B@0!C3IyMvx==7r*+~)^i?X65<=xL{_o*=sX(tj620Q0 zS}Q%({qn+y+wHr}hqk2d?kkoKrEe$9ilI#S>O?axGPVksb?{c5&y(C3o6NYlOQ0&} zhHUa(k)$^E!37qHxV;2df%i{;Su#a|7nkO`Q3Km0OO~hikts;o2DO2K8#!P_qU#W5p>V*0 zc*V|9g@zJqDO2NpX8swB^IDMWb5fElqS zxQw%lPej(4G#nZD$0d zh#{rYeYox5u5F#2fwfLo7E3FR-v0?sn*SP0FV3U$;DLC={*~+nK{>jSh1x#XJYkR) zr@pG`uzieL@v{Qf-{Ak#3%ymZmgmwb?CAk8iSn#gS~&^@-~$ z78H?qliCSB{y@b}L7J;QvBkN`vB$m5Mt$+RN?CL>I6m0h;w{^YPj6_V z87~#^!jE>)*ecFj|KOXOk<*r`+^*65aDNBtx;!yA47{%6X=eWg%A}uwC&$SCH`StN z`y=VY>wLQYrkXuW+p>HPDRwfr-EcDpd1$t!Y@!)1`~Rz!4fgH~c~}{^^e@vLuGc=? zlMQtC0A8l}N%<3+NzR;T#zTg8k;qQTnOL|C*vaC8^R2Yb+P2lUj=iubZa;dj+?H6S zVHjQ_?q7)@BC(MHu}U07Y`Gbvm$+Z0{^KO?yvP%ZpGnoHV8pl?Frv2tn@HzD1QG9z z6DN+$)OPZXtCbF8`I8EMeku~pi7&rKy!FL_cXYgYW`GZlmFA`*a@gTLTg6rO<5+%B z_QM}@W?#<~)Vwb@lz(Jc502$3D3|dj&gF*yUMiaFmi51>ICI!$dbF#nc=qcBS)+$P z?mU`i(H>C(&En;tY;GTTa*T|Z3YZZ`HaAu24;6Jg51(UpddttxIiwu$k>63onlM`i z%_Q;t#$krbxT$EajvK~R4C7N$Dt=D3y;qmNH4Hj0Xl0f<^J-|}E+RU}1-$75{2LF% zBMxkx08DE>A~kJlX>xng_C%>`SK7zUXrI#bo-{r;8QAi>;I(%)4+aR;%x2K@oJ}0C zm9jr&6uQve7w5gobM{pxI`tBEYQ7hEatxW5isni?$Xk^<^@q~HM-%aY)n}XJbDeWn zr9Y*E5*0uF5{S!QZ0|%fE;6=Sr{m?CtpQjL@BVgtxwxMW1sd_-{PV9w?I7hSl+?-f@|4CYaT=p zkyuW_wG#)OmRk~Q!Vn4m`EsAhFRLPFiS0>?VfaKUB=!E%TJTFn0GE^KzrfGi=si z$;YE3pTGr;CvYNe0{;1q%gM@11-y#>O9d{H-~I=Rn8@AyRGGR{>egXlja|Ntes%WX zqQ=dV#(x_W1_F+e@lpY^dbSxKg^Nlr^d?0#jJ_{BbbG=gN6Kiy+`DsB2s6AY0RN0M z1)m&dP&QEo%$j+tf`{%^JgN(NEL6Ev=A^ig^7B$f@LK?QXQ#iqpURf;9Z#8P#!Cjw zz;DlZ2}A32~2m@`=0rBuRLdP>7y^K(6hw=efkvEClyk;NXwtNeI2 zjju`s=h1oafWO5!4?H<0cER8;XTK`RAt9f=hN{Nm9x|9NC}r@qKhOkKfi-`oB8n3i zumkbNO=g<;*mbGCOs#@o&y2`BCfQ-#Z=#@Ck{eX%Cx9nM7kR0`z`}l0aTX_8t7JP$ z&n=%DVs^9d(5G_WKE6+&yujDP70ff<5LNKOVfIpXMag`Tlj1K{RoJ|(U9rNF83tZ7 z*n5F^2M7)4uA+030W)G`++^z{pU~wVL@I8Y*KlyuU)F8%Ej3WWvdxJ5eS7FcGaf2B zKC&Z#4jMO^=;18`8O@r3B%?gB<{v@3r!*$B^9}6solrHS4LmvKgO>_;MgO;48(G9^q8Tq0FpFoK0TmYR0siROF?M-U`4hvN zb}nZ;*Ijk0-}3+@4twHSV6Tif{wong%>0L#X$bz8gOl?9Cwr?*axVnAr3{B_eX&$# z!HCHMY$9?<8v8dQ&D9P54ulgW_JclpU$q?(8ScB6^;*_J@7<}Uoj;!w5#jwQs4<;Q zr1Kzxi2K;qfC!!(3*!{`)6cWb+Soy4b4_-evd@>}jv$@!^xg^!TT*c4M3vlp?^oWU zGQqVj$SrZz+*OLJnta$BS6(D}jBUo3b?47ygqc5Y6>EWL(~WaKQ(~&R`h=z&Qj05Y z)+c5F+%I^WQUpF0a*T|Z42-ORtpYOk-`}6bcvxF&2bEiilFQZz?|-SR0ZI%!2~ywz zN-B7O^XNQyARagnKm$DR$%_b!xJ7fZnB^0oj)SnwHFp|@z#Il<8|uviwN!iHmjNsq#Rx3rJ}iR+rqZuW2-n1 z#{6520?Zl-=_f5-^@*20H1}zp1qsQXHzO#cQYM=5QUSAzyjAWLQ*(Nm=)1?G4zFI{ zsENor#u6n)ma-qp=5YCe3zuvB@vd9XXCl?;7-7K@%m-3fi+zMTg7wlQYUz0#v zat(ZdB?Id}5Bv+SZe~jJk^wVtI^b}x zMRTPe0l)u%##NR)&*`1vrCW#hrn&^Em#rkT&PRihu&2?Gt>TL^15XY!UMiaFksA|K zVE&28pEWq|@6}Ic`ekk$Dpl%OZvWYNQqX^AzBzNE87~zu!!JzGxT!|@uiY%i#L<^A zR<~7E)0-oF_$ooE${txdl!@WT8OO-}Bl~X^%{4%3T!r=Pg6qZbQE`rA&Xk)GHSr8q zp8k}br@;FJJN#KloZ0iQM4G2NxRUV(h!Vo!XRtNY8avU9O5Ku}q}v8nx4X-1z!lGq zcoY(+ZT?pxh-foT#D6QWsJ-R z?05%`mZD+8qBydC#Z?Q~bqcl88YU5jc;x7+e}rO*nvdyx&eZhHd}r?czH`q#zu)ljE!*0=7=t>E;15iUzAU4jvfuNbB0~!#+YSw zj8V47_+-sYvkc5MYe})CAlu{Ia$~$tS`(bIGl3lwJ=*wL`#`qNuGdQDi~(7b#O_Hx zt<{tdT5NJZ$ncbR+yj5xr1h~;Ry=lV zX-{sAq+A4(szP`T=$QZ~RTv-x!wbpZiyLT3ABIw0AG&FMKju(xKX1nmpoanj=u@2r zFl~iw3fczAl(!9h6juUW%Jd;HxV(?RM(5e6%u+}Ps&qjctuJHGlVxC356WO4sJ88J z0o0*#cn4_u4hU6wJD>^3w3E+P?gTrH+65-c-NjKYy8#5Pt^~6>R0#z_g-A$1wYmx- zIe4}1OJJrv-4O8&{RCs6c|VK-74aFA0;$g-he8fOvMM+L`9S9n@-1;S5EV3i?FgLm z1*INGF9kQEo%S@MTP;6<13+(_fC3aSq{7dmXG1y0%f|P}U}4r!$*`Uv>Nn8J8fF zUZ~}2{ZxzH)N%x!YWbJQz6Xyoh~PRjswH(e5tYM(ZlM^eS^N*+ye8a?ly?}6bmbIw z(SyT`%kdREsRu`N#+IK!GZh>Kry6%w=Vntq(_Zo|>%ruKdb-|%PTJkd8kyg~Kf>GC zn;IBpRU7i@pO0}>g8lmP>Tz9UkGxUF$;#M)jRu%Y-*@6t6?+vUnDZ{|R=M5S1QgPP zJ{s)da#a6@qd_(I;zLmF{g`i{KoHnf>viPXt_ol!Jq=(3m5<@{J8yFO*0KD1)oo<0 zEE%WQ>GeCO>JJjHhQkas zJ4SpUo;R@K2IfM3ouJp?-7@(UnXN z_{?fkZ!Z>EfYa7`qfSp%=_^HK@TBQI8F%i^Sk_xS;`#Gw54j43mzEXrXxUpN+_d05 zo-c_TgpF!-gAU=;RYdTgfQIPYW?|M1uvrb`C$9kAERaPuYL4|D- z`wa9$sW4N~HKsbz#Q}G^c&MFqi8V-x+l5CJ-QccN(dA+itM+$qlsWi0ofKcle!KRI H)H(kEdZ9bq diff --git a/mobile/README.md b/mobile/README.md index 870d5027..aab201dc 100644 --- a/mobile/README.md +++ b/mobile/README.md @@ -57,3 +57,5 @@ $env:DESKHUB_RELEASE_KEY_PASSWORD = '' Das Skript erzeugt eine minifizierte, produktiv signierte APK unter `artifacts\deskhub-employee-release.apk`. Schlüssel und Passwörter werden nicht eingecheckt. + +**Play Store:** Schritt-für-Schritt-Anleitung (Keystore mit `new-keystore.ps1`, AAB mit `build-release.ps1`, Play Console) in `VEROEFFENTLICHEN.md`. diff --git a/mobile/STORE-EINTRAG.md b/mobile/STORE-EINTRAG.md new file mode 100644 index 00000000..e77d0d3f --- /dev/null +++ b/mobile/STORE-EINTRAG.md @@ -0,0 +1,63 @@ +# Texte für den Play-Store-Eintrag (Entwurf) + +Alles hier sind Entwürfe. Bitte Platzhalter in `<…>` ersetzen und die Datenschutzerklärung von einer fachkundigen Person prüfen lassen. + +## Titel und Beschreibungen + +**Titel (max. 30 Zeichen):** DeskHub Mitarbeiter + +**Kurzbeschreibung (max. 80 Zeichen):** Tickets Ihres DeskHub-Helpdesks unterwegs bearbeiten, mit Push-Popups. + +**Langbeschreibung:** +DeskHub Mitarbeiter ist die mobile Ergänzung zu eurem selbst gehosteten DeskHub-Helpdesk. Ihr bearbeitet Tickets, antwortet Kunden, weist Tickets zu und chattet mit Kollegen, auch unterwegs. + +• Tickets ansehen, filtern, beantworten, Status und Bearbeiter ändern +• Push-Benachrichtigungen bei neuen Tickets, Kundenantworten und Zuweisungen +• Interne Notizen, Zeiterfassung, Live-Chat und Team-Chat +• Datenschutzfreundlich: Im Popup steht standardmäßig nur die Ticketnummer +• Eure Daten bleiben auf eurem eigenen Server + +Wichtig: Die App benötigt einen DeskHub-Server (Adresse und Mitarbeiter-Zugang vom Administrator). Ohne eigenen Server ist keine Anmeldung möglich. + +## Datenschutzerklärung (Vorlage, unter einer öffentlichen URL veröffentlichen) + +**Verantwortlicher:** + +**Wofür die App Daten verarbeitet.** Die App ist ein Werkzeug für Mitarbeiter eines Unternehmens, das DeskHub auf einem eigenen Server betreibt. Die Ticket- und Kundendaten werden ausschließlich zwischen der App und dem Server dieses Unternehmens übertragen (verschlüsselt per HTTPS). Der Herausgeber der App erhält diese Inhalte nicht. Für sie ist das jeweilige Unternehmen verantwortlich. + +**Anmeldedaten.** Das Anmelde-Token wird verschlüsselt (Android Keystore) auf dem Gerät gespeichert und beim Abmelden gelöscht. + +**Push-Benachrichtigungen.** Für Popups wird ein Geräte-Token von Google Firebase Cloud Messaging vergeben. Dieses Token und die Ticketnummer (nur bei ausdrücklicher Aktivierung durch den Administrator zusätzlich Betreff und Kundenname) werden vom DeskHub-Server über den Push-Dienst des Herausgebers () an Google übermittelt, um die Benachrichtigung zuzustellen. Der Push-Dienst speichert pro DeskHub-Server eine Installations-ID und die Anzahl der gesendeten Nachrichten, nicht die Nachrichteninhalte. Anbieter: Google Ireland Limited, Gordon House, Barrow Street, Dublin 4, Irland. Rechtsgrundlage: Art. 6 Abs. 1 lit. b/f DSGVO. Push kann in Android-Einstellungen oder durch Abmelden beendet werden. + +**Keine Werbung, kein Tracking.** Die App enthält keine Werbung und keine Analyse-Dienste Dritter. + +**Berechtigungen.** Internet (Verbindung zum Server), Benachrichtigungen (Popups). + +**Löschung und Rechte.** Beim Abmelden wird das Gerät beim Server abgemeldet und das Token gelöscht. Auskunft, Berichtigung und Löschung: . + +## Formular „Datensicherheit“ (Play Console) + +| Frage | Antwort | +|---|---| +| Werden Daten erhoben/geteilt? | Ja, erhoben; Weitergabe nur an Dienstleister (Firebase) | +| Gerätekennungen (Geräte-Token) | Erhoben, App-Funktionalität, nicht für Werbung, im Zusammenhang mit der Zustellung an Dienstleister | +| App-Aktivität / Nachrichten (Ticketinhalte) | Erhoben, App-Funktionalität; liegen auf dem Server der Organisation | +| Personenbezogene Daten (Name, E-Mail der Mitarbeiter) | Erhoben, Kontoverwaltung | +| Verschlüsselt bei der Übertragung | Ja | +| Löschung beantragen möglich | Ja (über den Administrator des Servers bzw. ) | + +## Weitere Angaben + +- **Kategorie:** Unternehmensorganisation / Produktivität +- **Zielgruppe:** Erwachsene (nicht für Kinder) +- **Inhaltseinstufung:** Fragebogen ehrlich beantworten (keine nutzergenerierten öffentlichen Inhalte) +- **Grafiken:** App-Symbol 512×512, Feature-Grafik 1024×500, mindestens 2 Handy-Screenshots + +## Zugang für die Play-Prüfer („App-Zugriff“) + +Google lehnt Apps mit Anmeldung ohne Zugangsdaten oft ab. Richte dafür einen **Demo-Server** ein: + +1. Eigene DeskHub-Installation unter einer Demo-Adresse (z. B. `https://demo-deskhub.`), ohne echte Kundendaten. +2. Darin einen Mitarbeiter „Prüfer“ (Rolle Mitarbeiter, nicht Admin) und ein paar Beispieltickets anlegen. +3. In der Play Console unter „App-Zugriff“ eintragen: Serveradresse, E-Mail und Passwort des Prüfer-Kontos, mit dem Hinweis, dass die Serveradresse beim Start eingegeben wird. +4. Das Konto nach der Prüfung deaktivieren oder das Passwort ändern. diff --git a/mobile/VEROEFFENTLICHEN.md b/mobile/VEROEFFENTLICHEN.md new file mode 100644 index 00000000..622f52ac --- /dev/null +++ b/mobile/VEROEFFENTLICHEN.md @@ -0,0 +1,35 @@ +# DeskHub-App im Google Play Store veröffentlichen + +## 1. Einmalig: Upload-Schlüssel erzeugen + +```powershell +cd mobile +.\new-keystore.ps1 +``` + +Legt `%USERPROFILE%\deskhub-keys\deskhub-release.jks` an (Passwort wird abgefragt, nie angezeigt). **Datei und Passwort an mindestens zwei Orten sichern und nie weitergeben.** Beim Play-Upload nutzt ihr „Play App Signing“ (Standard): Google verwaltet den eigentlichen App-Schlüssel, euer Keystore ist nur der Upload-Schlüssel und ließe sich bei Verlust über den Play-Support zurücksetzen. + +## 2. Jede Version bauen + +1. In `build.gradle.kts` `versionCode` um 1 erhöhen (Play lehnt gleiche oder kleinere Nummern ab) und `versionName` anpassen. +2. `.\build-release.ps1` (fragt das Keystore-Passwort ab). Ergebnis in `artifacts\`: + - `deskhub-release.aab` → **das lädt ihr in den Play Store hoch** + - `deskhub-employee-release.apk` → zum direkten Installieren/Testen + +Voraussetzung: `google-services.json` (Firebase, Paketname `de.deskhub.staff`) liegt in `mobile\`, Internet für Gradle. + +## 3. Play Console (einmalig) + +- Entwicklerkonto (einmalig 25 US-$, Identitätsprüfung). +- App anlegen → Produktionsfreigabe bzw. zuerst **geschlossener Test** (für neue private Entwicklerkonten verlangt Google meist 12 Tester über 14 Tage, bevor die Produktion freigeschaltet wird; Anforderung in der Console prüfen). +- Store-Eintrag: Name, Kurz- und Langbeschreibung, Symbol 512×512, Feature-Grafik 1024×500, mindestens 2 Screenshots. +- **Datenschutzerklärung (URL, Pflicht):** nennt, dass der Server der jeweiligen Firma die Daten verarbeitet; bei Push: Geräte-Token und Ticketnummern laufen über den DeskHub-Push-Dienst und Google (Firebase Cloud Messaging). +- **Data-Safety-Formular:** Geräte-ID/Token (Push), Kontoinformationen (Anmeldung am Firmenserver), Ticketinhalte (App-Funktion); Übertragung verschlüsselt. +- Inhaltseinstufung, Zielgruppe (nicht für Kinder), Berechtigung `POST_NOTIFICATIONS` (Android 13+, wird zur Laufzeit erfragt). +- **Zielversion prüfen:** Play verlangt für neue Apps ein aktuelles `targetSdk`. Die App steht auf 34. Die aktuelle Mindestvorgabe steht in der Play Console unter „Richtlinien → API-Level“; falls höher, `targetSdk`/`compileSdk` anheben und neu testen. + +## 4. Vor dem Upload prüfen + +- Push-Dienst (Plugin-Webseite) mit `schluessel\firebase-dienstkonto.json` gebaut und erreichbar, `access_key` in `includes/catalog_defaults.php` gesetzt, Release neu gebaut. +- Release-AAB auf einem echten Handy: anmelden, Benachrichtigungen erlauben, **Testnachricht** im Adminportal, neues Ticket anlegen, auf Popup tippen. +- Die App fragt beim Start die Adresse des Servers ab; im Store-Eintrag erwähnen, dass ein eigener DeskHub-Server nötig ist (sonst Ablehnung wegen nicht nutzbarer App möglich; Play-Prüfer brauchen Demo-Zugangsdaten unter „App-Zugriff“). diff --git a/mobile/new-keystore.ps1 b/mobile/new-keystore.ps1 new file mode 100644 index 00000000..1c1354e9 --- /dev/null +++ b/mobile/new-keystore.ps1 @@ -0,0 +1,28 @@ +<# +.SYNOPSIS + Erzeugt den Upload-Schlüssel (Keystore) für die Veröffentlichung im Play Store. + +.DESCRIPTION + Der Keystore wird außerhalb des Projekts abgelegt (Standard: %USERPROFILE%\deskhub-keys\deskhub-release.jks). + Passwort wird abgefragt und nie angezeigt oder gespeichert. DIESE DATEI UND DAS PASSWORT SICHERN (mindestens zwei Orte): + Ohne sie kann die App später nicht mehr aktualisiert werden. Niemals einchecken oder weitergeben. +#> +param([string]$StoreFile = (Join-Path $env:USERPROFILE 'deskhub-keys\deskhub-release.jks'), [string]$Alias = 'deskhub') +$ErrorActionPreference = 'Stop' +if (Test-Path -LiteralPath $StoreFile) { throw "Keystore existiert bereits: $StoreFile (nicht überschrieben)." } +New-Item -ItemType Directory -Force (Split-Path $StoreFile) | Out-Null +$s1 = Read-Host 'Neues Keystore-Passwort (mindestens 12 Zeichen)' -AsSecureString +$s2 = Read-Host 'Passwort wiederholen' -AsSecureString +$p1 = [Runtime.InteropServices.Marshal]::PtrToStringAuto([Runtime.InteropServices.Marshal]::SecureStringToBSTR($s1)) +$p2 = [Runtime.InteropServices.Marshal]::PtrToStringAuto([Runtime.InteropServices.Marshal]::SecureStringToBSTR($s2)) +if ($p1 -ne $p2) { throw 'Die Passwörter stimmen nicht überein.' } +if ($p1.Length -lt 12) { throw 'Das Passwort ist zu kurz (mindestens 12 Zeichen).' } +$dname = Read-Host 'Name für das Zertifikat (z. B. CN=M_Viper, O=DeskHub, C=DE)' +if ([string]::IsNullOrWhiteSpace($dname)) { $dname = 'CN=DeskHub, O=DeskHub, C=DE' } +$env:DH_KS_PW = $p1 +try { + keytool -genkeypair -v -keystore $StoreFile -alias $Alias -keyalg RSA -keysize 4096 -validity 10000 ` + -storepass:env DH_KS_PW -keypass:env DH_KS_PW -dname $dname + if ($LASTEXITCODE -ne 0) { throw 'keytool ist fehlgeschlagen.' } +} finally { Remove-Item Env:\DH_KS_PW -ErrorAction SilentlyContinue } +Write-Host "`nFertig: $StoreFile (Alias $Alias). SICHERN: Datei + Passwort. Danach: .\build-release.ps1" diff --git a/mobile/settings.gradle.kts b/mobile/settings.gradle.kts index be9c85a8..6af31b05 100644 --- a/mobile/settings.gradle.kts +++ b/mobile/settings.gradle.kts @@ -4,6 +4,12 @@ pluginManagement { mavenCentral() gradlePluginPortal() } + resolutionStrategy { + eachPlugin { + // Google-Services-Plugin (liest google-services.json für Firebase) direkt aus dem Google-Repository + if (requested.id.id == "com.google.gms.google-services") useModule("com.google.gms:google-services:4.4.4") + } + } } dependencyResolutionManagement {