From 16b75932275007208859855d5e42f2aa5a8f64cb Mon Sep 17 00:00:00 2001 From: Douglas Lovell Date: Sun, 4 Sep 2022 20:23:50 -0500 Subject: [PATCH 01/17] Assets for WatchClock extension --- .../AccentColor.colorset/Contents.json | 11 ++ .../AppIcon.appiconset/AppIcon100.png | Bin 0 -> 4689 bytes .../AppIcon.appiconset/AppIcon102.png | Bin 0 -> 4759 bytes .../AppIcon.appiconset/AppIcon172.png | Bin 0 -> 8084 bytes .../AppIcon.appiconset/AppIcon196.png | Bin 0 -> 9287 bytes .../AppIcon.appiconset/AppIcon216.png | Bin 0 -> 10201 bytes .../AppIcon.appiconset/AppIcon234.png | Bin 0 -> 11005 bytes .../AppIcon.appiconset/AppIcon24x24@2x.png | Bin 0 -> 2161 bytes .../AppIcon27.5x27.5@2x.png | Bin 0 -> 2466 bytes .../AppIcon.appiconset/AppIcon29x29@2x.png | Bin 0 -> 2611 bytes .../AppIcon.appiconset/AppIcon29x29@3x.png | Bin 0 -> 4011 bytes .../AppIcon.appiconset/AppIcon66.png | Bin 0 -> 2984 bytes .../AppIcon.appiconset/AppIcon88.png | Bin 0 -> 4065 bytes .../AppIcon.appiconset/AppIcon92.png | Bin 0 -> 4249 bytes .../AppIcon.appiconset/Contents.json | 124 ++++++++++++++++++ .../ShipsClock_Icon_AppStore_1024x1024.png | Bin 0 -> 19483 bytes .../ShipsClock_Icon_Iphone_80x80.png | Bin 0 -> 3984 bytes WatchClock/Assets.xcassets/Contents.json | 6 + 18 files changed, 141 insertions(+) create mode 100644 WatchClock/Assets.xcassets/AccentColor.colorset/Contents.json create mode 100644 WatchClock/Assets.xcassets/AppIcon.appiconset/AppIcon100.png create mode 100644 WatchClock/Assets.xcassets/AppIcon.appiconset/AppIcon102.png create mode 100644 WatchClock/Assets.xcassets/AppIcon.appiconset/AppIcon172.png create mode 100644 WatchClock/Assets.xcassets/AppIcon.appiconset/AppIcon196.png create mode 100644 WatchClock/Assets.xcassets/AppIcon.appiconset/AppIcon216.png create mode 100644 WatchClock/Assets.xcassets/AppIcon.appiconset/AppIcon234.png create mode 100644 WatchClock/Assets.xcassets/AppIcon.appiconset/AppIcon24x24@2x.png create mode 100644 WatchClock/Assets.xcassets/AppIcon.appiconset/AppIcon27.5x27.5@2x.png create mode 100644 WatchClock/Assets.xcassets/AppIcon.appiconset/AppIcon29x29@2x.png create mode 100644 WatchClock/Assets.xcassets/AppIcon.appiconset/AppIcon29x29@3x.png create mode 100644 WatchClock/Assets.xcassets/AppIcon.appiconset/AppIcon66.png create mode 100644 WatchClock/Assets.xcassets/AppIcon.appiconset/AppIcon88.png create mode 100644 WatchClock/Assets.xcassets/AppIcon.appiconset/AppIcon92.png create mode 100644 WatchClock/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 WatchClock/Assets.xcassets/AppIcon.appiconset/ShipsClock_Icon_AppStore_1024x1024.png create mode 100644 WatchClock/Assets.xcassets/AppIcon.appiconset/ShipsClock_Icon_Iphone_80x80.png create mode 100644 WatchClock/Assets.xcassets/Contents.json diff --git a/WatchClock/Assets.xcassets/AccentColor.colorset/Contents.json b/WatchClock/Assets.xcassets/AccentColor.colorset/Contents.json new file mode 100644 index 0000000..eb87897 --- /dev/null +++ b/WatchClock/Assets.xcassets/AccentColor.colorset/Contents.json @@ -0,0 +1,11 @@ +{ + "colors" : [ + { + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/WatchClock/Assets.xcassets/AppIcon.appiconset/AppIcon100.png b/WatchClock/Assets.xcassets/AppIcon.appiconset/AppIcon100.png new file mode 100644 index 0000000000000000000000000000000000000000..3cd4ab41f256c11223da24ae92d653a710b10f55 GIT binary patch literal 4689 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 p(O$OhC_oA6W{2X^aDj+2wNF(Xc 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 z zl(N1{G?#NWHB_4JzP{0MtX27RB+ z>VpA>P5x<@V!b+?^pWz$)+R{ef|vF{7v2-*)K8&Co1qF zmby!UW0OVxqitOMLe7dXl!~q=>RXh$gRb#S{=%N-Z+d>5Zc`52{mhJni8?p>7=L{t znN+>#862{@3zG&@8w#UwhxrlV*B624DSk=ka-~u{^{LJ&Dq6b9-;a#m!6R4JWHI}~ z+dn#R7qG>+K0-dPlG<*#yw5EA zn23jK1Q?O^xV$1uS`~c1ZgDc%qvq;CJkHMz8jgf>OLr}f;kx^XMh|v5H%B$?$wWGu zEi$4IWNH09i}O||TRyp}f2!9@Km^UpLo;U7zj~&sJt7)w+5|UB+r3D4r*nnR&*P0* z5kNvhgSIKu-)V@Q6FNKfoN!E$u5xJ-zq)^Atr)LxMxhyNLW`h#_}H(#qh|XDg~tf0 z3RV5I?G_=*k!sww`q|Y*m(uB6*ywH)-)-~akWneU*$pER1alH|9Rb}o{ee4fP`k=w zZo3ak%c@^U{^KC3F>|GY*D+bKwN^Dac-k>y!JJtvvHk|v6KP4uK@Nq14Eg4@@&4Gu zpSDRJs-aU04MVIW4+boHCx6QB9}KB>RBgzzDHJTsA?_#Y1nNC?Z-5x**0OOZ@n;Zl zJ!f#uZYeAhcd2#vf2i#3y>ws^qtL6PBBLi90_*8K}0CD#3o#Rt{f^QE3ipbs^qjFe~-tpZtp z#)wd5_eVsLIlqT{-kSH!W9MyvNN3Z=tGpadtYQSu8mcJ!K+K}E>)J6eV`RBK$WyFg z>uRBdbZyUHtqmai7ijKJ=eJn?+7o)eI9YD@CMPGl-1}=roJK6Y z>Q#NW)$!M0;rG?H@pX0fMJT|ZAg&Vt0Yf0-V0m${j0IRyK@y?>0gHmc3SjU8hf4c@ z2vDA`?#Q6O0gT-iS!L{eu4nhT|He8T)HS{H-s6&*)_;}0P)u?0(7;Fw5l~==>Gx7 C0PrsW literal 0 HcmV?d00001 diff --git a/WatchClock/Assets.xcassets/AppIcon.appiconset/AppIcon172.png b/WatchClock/Assets.xcassets/AppIcon.appiconset/AppIcon172.png new file mode 100644 index 0000000000000000000000000000000000000000..307c5f612f2e84f20cca285f2dd97528ae53a6aa GIT binary patch literal 8084 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 literal 0 HcmV?d00001 diff --git a/WatchClock/Assets.xcassets/AppIcon.appiconset/AppIcon196.png b/WatchClock/Assets.xcassets/AppIcon.appiconset/AppIcon196.png new file mode 100644 index 0000000000000000000000000000000000000000..4e70b9e7ecc0e8072883c8dbe3025ef79cbd26ef GIT binary patch literal 9287 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 M%Bsm!N}B}#KP`RzRR910 literal 0 HcmV?d00001 diff --git a/WatchClock/Assets.xcassets/AppIcon.appiconset/AppIcon216.png b/WatchClock/Assets.xcassets/AppIcon.appiconset/AppIcon216.png new file mode 100644 index 0000000000000000000000000000000000000000..0c6340443b75bcd6aa741307f0fd9e8639abffc3 GIT binary patch literal 10201 zcmaKybySpJxA+GHBqWBA5(Eb64(T50?vfscp}Pg7m6oAPV(1Vl0RbhIZjcTE>F$`{ z_`UaifA_tA-1V$EXU#b~&U)5f`!VLZ8ZSEp9ug62?qdfP(vYq001u@0AR-g01!8@AI*(BpEgG*i%XE)#FVZOf(Xz3Ps{V0Dvi62`r=QJGYwmhjE*nhix(w$kl)J4lWIEllcynj zb5`Y-YPoZ|lIMV_qfp4dxpPE}>j;-N6GaPU{MkALU~ZD>mfIsaQtui^S_h-7^6aYu1xr=`R~R2zv~t(=pmndA&GMSitv9rnHC_&Lj!{WW7s2;A=9IPdNn1|n5k&yFdzjGfN0Pj zRhEIVNOTqfzhP&8izbOyd}QnZDY@wuM$m>F(uDwlGAvc%RYl=g!V#dateff_J|>DjC~_Ude1$yTntPasAOhtecd zDF#t}(+O>tJtc`Y=7-tp{Eqz?LVP~}(Ha3Wr0PP1D;m54mbEW>A?pY;x#p~^SmtYU zw`$G`j-NDkAbKkeX3>AXDfhI>>mclekmh|1vk#%vr)K24MY%Fdw5TrwL(mj|Wo4{Y zhh1ff$Pa-|YfohDY;62q{Ye!OeE#*5w~WrDc)0+4x>tw8>_k02Nd@7R-@YLBd$FS# z$-EmNM5_q+$OFajQ!iKOG?+>8f3hCerN|NouPh^Y<0*5mz+LVT-^`LI_0o9U2faRW zvPDzv!Lo0qN#956Vu!A14OlHWEC>^C!bk#QGwO84i6Xy#TAfIHIjKMckd2GFqlp3D zf2F>;d*~+56}#%5M&ogpRn1oE^d-P4=u)&{gtu>p&ed>bjhfM*udwc?i+d?0DT7Mr zg6q6i;!7^}Mc_6N0@vzN`A&oBRR1T|>iR&YS0-}5TV3p0z5QPVfr%YJVhG6ssqb#diP8D$}H=ZEGrz9XOjtVllR z?&D!^BgVjM$EV=500A$nGfZyNd`9eIMRLcvs7Vq=DQ;>Loz)o|Y{4#BM)+yDOE0Cfc}2x$Y(%O> z=P{B1!*uIwjRTp7!MmixiY)u_Zy6@9ao;T*77~E?8YB(WtL@64NVL>y@b~`VSUB!g z9Y$7O)7!}>x*eL=WFOr-%mG;9YF%;Te&a)a?lFd$ZVGV=6KRCx}nduoL-!aJcK#X!Bl6GZz~pMT=jY8XpDV+cFB{LyE2^($lw|ae*|p zeTJ%O+SL~?=5t6lDfk7&AF?IRqq#ubxz~LvSr5Bj)?5+N`g=Dz#IUg}Qi?P`Pf8qw zlyFD882y21dmpPu_b-Nb(08zx8JQKfQ+I#nSU0(?otg*F57lv57L!TWFVsXpW#=87 zu!o}$w!q6?25fd5Xc%l0Y^JOZimwUKpY|f;Enwl?C%N&W zD0goB5S&wIfzNY9m4vO$>i)}RnO9BOL!jnpZgQx)A83@&PY${|GO_LrC zReYaDMM4tM%t!@tG!(0>PY-v9*^3z?TJ;m3|I|WHkdMapzSUSEZ#Srb%(ym_NWM2UcMTAIUYjsB8PeL;-83Lowa-aw(iFjbR zB53)mKZ18y+m6due&+#>VI2me94YN0j6D@+X|t2vYmA5!eQ{^L>dg>Z2ERWUP=#JHc_L+vO6)gRYw{S=I!|)xi0R;)T9>B= zs?zGu;o)!Ls(3>bGNtX4!c`|U*;&k|BX8dM-IE!!o{7OO z_LObe%{CJI+vlGtr*r*!@+sc7>R}(rBREV1Kw^0Gu8<;0^jy_w1&fvx%2J+7fJQcm~L}c06&d)_1 zns9m0#r-DsT8NnQl_{y8atO#d;P=~ikI%`;Yf??vgH-0&5|h4v914fAM68}r zLuU#m(-su1d^#T~Ishi~1O|p)v|lJY09?d6u$bQI?5OD9X;=s_fb2Ae9AnM+cq6sV z-E}hO(gdi07Jt-mt7J-ug;lD0>@K-pPMk!-^rGGKb#Y4m=;El}L;}lV178Qc0I@mE z6X6rdIGizi6jM?t$9!QPkPG~s=Ac+50?KuGRIcEnlADnt5(lZHE}*{b%NPhH{){0H zvd8D~@2a>myHWr@*#_UeA#A&uk&pu$ zC5y79J3UI%C=VwuVpQkxJ_gFL(Qx`aRpU^oe)`GAE`$f3+C_;r9)jNWi8+$*^M~I!*1czOgnla&GsGghPL^)}=P7fy zF}obgV(9zt(Q_8Yy%LxOl@2VP=Gp}xNfn{q%m{@W*yKdOXB)u^+=Tm!E|Z-t<#yQ7htPXmu+&xH7QXnDezR zRDM*;BjF#WX)C*(_Cc;8s)ugZN2z3m1XAB1TVOLI)jbq@A_6YcW+bpGY_GH843)Qu zy%u)hu2-D3+JtD*`Y$e+FyRbQ4)_fC2sL#R`)~?gS>;lNrn7q+r>zsGdxl(@=q`w2 zj03m*m#v%aINll3PjUYE)M(0}ozEHPWAW9D5x#VuYD5LL>jNIy=FcMt8OZp}C2-L4 zS-R^&%j(CX>D9TP$1b;4@4h`>3=ks$5N(dV*W_CjA-LU)@;=fg^2?~EFDaYrAKhE*O8j4t&P7d_dIW)-I_YJxv(njZ62S)Mx zDl;&FM zJX-c|c?9TOc-O4#ApfI?k>cTgNC$aZu0&z|%9m89yvyP(jF%cPp-RW8_Zn^xPIKxa zHA-_i2!vka=u(MyqA4O$(9xD$ZH*nSN0x$?J}8lG9>d@!U=(SH;)9#3lkJ**`$yBSKq`Ca|5l^+QOHq-Nc*%rZV9{eew&k;9sO?={?&c{2L4@#{ ztx4Enjk~l!!8EXsdtlAjfuTI!m1T$$jsbF&H(TMh*PLuX zx~-k`tz8Wlv`D}?T?g5g1%31I^Yv@Dn)ZdZ^~2)8gMKAIZ-?O0J56JDkC%}bBd-Hx z(XBFZa?i$0Gq3LD(i*>R74*Ko-<~dag$M^=v~d?{J_@fN%~b+nz6Fp3H(*I!ZC149^fCx+SV@RaGlX zmP7spEydusi9veG@X&669oQ};pL^S@PXeQB7*4@27jUDa*$?f%3CH-RFbMz^C0n@! z`zxz~Z!OzIupM{RWp^#Y*<^lMj6|=LalXdEu+mnE!^wW>!!($h`N6!s&OS^+z)Y0K zbVmjQfX`D}sevNAcJa@}jkj(m^aTaks-(1Zc||2z9a7FelFTBw`@L02%Uf zzBaw+&-e9NCOX^r}x0TQsn9?b;(y*Ga7Ti4nu`V5Kn~rkT%d;0qHPTG4wqfK?^SnnT~ih z3Z^511fvn8DLzk{1ff65SvqdVWQfj@`1!p33vy}d@g?oENUY9m3Ygx_YugfVqAEY2 z_oKMq<>{^2gxTv(H+K9gwOvgeEN@vD9~JMVFwJFeQvY5(dwId2K(-*m)yczZja1w1 zLqpWp{3o*63N+|N{WOs0MR<6fQc_wwyxHTf`3(fEf%7>kbLF7*Jyzu^HIf!tHzj{} zR3Jb#+@UV+8o@i?EQ*91um1xT(DnganHE0GtCy1W8b8ekIiv;Zxt_DuR_e#ATQoO42< zsb}NekNNL`GrRE*XZ>wqBZoWYZ9aAm27yRvc?4!S`U!5Lbg!^>qo!cTyPu`(@~(cb zGUoMZBx`sZKQ>sc7WLyX!!=5uh&8*|2q2OI){jJDZ<5!fQV*}D>jFGw>2`!`6LpQR zU~(hdGG9Q7RKVh-mPtLxLE{J~jD;}nwN^Up+CH}Cdf>gpqu|-u)2q~6uiMBEa+DMi zdpxdIu_qb>b3L*(yqC|(zBcorbCHEdPOot212gA|TMODYcTVleHLA;FZ6vPlhQH-i zFCfdJn!J2oXl{ze4j0jLY{(~5Q@a-qzlk_ryixeFe(ZMlW$gQJH_7`=O7m9dUPH%a z0fuzKK_S}M<&KM$8gt2dw`HPn;%xeEVW{UT3+HgPeUXeS5}5axU!bZf8#8Z zn#<9@%g<{{3%V?QGyV7_m$?Uk{vh&8V#(ede`xK+uK;O>Bfv!)DtxM}0Y@CzOL!a|3Sr$On{S3@_$tq*g@zf)-$#lK|B#`2F-ZHmSV zC>MIM)C9PvHm@`=O^ck|F`ySko{;jP(o*E-4zUjB>&@I@IkysqqDfZ9Q&wsf85VpE znbOLqgvWN_GvLMYXcD~B(gC%hcujv{&d7<++^hIS;p!^bnCQY`1Hw?SCa(RH`WLGt z32`ST@pyl~9Up>VyWGnGt9F8yKeoce%MShW*QtYl)j>u8($TI_Nk6F*u9!H;<=F8d zgVnl59f_zCiqXqXJ`J`&bZb{^f`KI*Tisk)V}?$eC^DBA5fFO#=nrg`xM=>eYR9GU zlk2J!kF0_D-2zTMOHf3gx~Xw#e*GTR@ZP?P(?M*_yik3$wVel4Tm&9Dj_tPTE}vLf z&KSlP&7%N7^sMK7`F*}Mm6Ojwg%2${iW>0=+|d>H?-uV zpsAS_ZKf$TtR|*$CPl6MooXrWOlmV3kojr9*+aeNBi1p&>|YaUb7RS~;~BmU>|?x% z<6X3-@|F`Hsk0TI7KT~E$#D=#PZL`z+1#(|cN}b|I=ub&D~k=UeDA}~lG^v)sj4Uh z+xHy2?R$ACUfTfO`fllqYuV>!lynINf{<5sxCI#vV^j-2d7)Zrd7ACl!-!t1+}tgD1!yxzLrwqWhtx#^VI ziL{$xkAR0OZDzb<2IzP!7&`(kJ!$l^@M4j?=_^eAzPnuUL4@zp>>7USHnH8Txbf-G z#5XxW8|ejIep5jxc{ZM(TaEFo7ew&B^|i*!2Q5-CgI#`Nsw*X)oBr9Gz_~BkU-Ji< zt1~X*sE4KEN_%_*vbAPhH`hCs0+D#P0AXNBdiFCYUE&erI5E9sQ`O0w2);|^>tHt% z$giXTGsL(;#E9o_ijxFBhAKg5eVdruxsU$-j&fp`eD=4>r=+;7T4p4EhXpuIoUk0B z+D>u%b`?o&kzbB0f1dfS;+=@xebu~R?x~rky*sE2FrOQHj795qPWhV;=ebExCbz^+ z9JX<3apn*F)6Cq(r6$W6K#}b1DnX$so9`Jtk2GTAM8ou?*XX>&=Hn^tD!0M&s~=%m zHvz=rPi28VjeaSrIEqsXx)1R&na*aytK&cQA`VUOl$Gdnb-AD;hkNEXapYdcpQ8)k zQ^e|0;nWno^uHxbmaKKu)_Fw{wUMCC_uTInLr4zY!oYGe(-9v&0bEp;A-J{ubRgl- zuom%{z@yVNcUmc}kO@^2QuQSab{z8}7qBhz_YPPdF`)Iek%Rj95Cb{`V;MgHS_uZ_S!7GbFIxgu3PTPHiw$m@q$b=bGJ)&8Yg{z8czCt$g5D zP^_E4Ul~d?o1F^o5i;x2JL-{9XHx}_3#I}d*R+1* z?f#|5zgwMYG?RCh>azE+>=pG;-%!#aglQKp?BRRSD{7r@gE9P(uiS;M;aW4$*19tN z^~mN27g5sSdBSPu#b1ZI;c(jgdBcnH5)62Ipn4ayCiiAj1pgY(I(9t+tYWLE;k5te z-bbI6{#sG{4-c{IJGjrr*J77N0S9N5WtIN`$XhH>?_0qbe?UnKWx&Te6}#P+N@=`OpjBN()|U{&?Mct!C~Y z*cZ&T%tf3_;;~W2D2CI7JgzS}oUK4ioNT_RT1MVBZ&>C&WqV%i)yJ>lynVfRGhEVi zPWwl_Gnq-S=b5eX*KHl83|jRB2&uN!MSW%fDnEuc_5%}01`M8vf6m{Hd|rM0p);-} z_gQ}YuT@6z2>2HZ|9$eB9JfWxxa+1h=)#r!BW?Sri9;bzv&%L?&CJ%l-v@68GSYs4 z`{j^tx+)3Hm$0N2hh~3Py5>)O_CH*a+a=&!o@`kC=4vbaC?#&N&d;$QU&Vn%x_r-@ zBkGma!CB<&i{$d^bTg0Z`b^k4Bx>2*zO12n!9;YuX{l+o`8lH0?#PL1xletL!vILkq{BYg)Zgv0WKgOtzBd-=%($B;hzu?d`6 zv7xe){CU-Z^=A|0mu-j4+;4$C>P!*E?y3aP)Iq1Kp4-g~n;^+!&jJ^xubBB~-1-N| zC655}*(K;OsDHCG$s8~fwVq~ zmkL9@zDDXi{(05ye5AS=ZNL6l-W3E@BwbB0h&*ifJ80!{=1ty>UD|y3`ef06IWi!3 z;b;GAyHXN-C5I^fq@)$kL#e@5$QVYf=i$cl*R>VMi^oD$3k&#ZB9;mc5^O1=aF4{I zaZ%8!Qg{xgPPvQOUp9l;82 zPcVT$XhM=vmDro&*~e-1i!DVB5?jA*Pier#8Aa2=pK0l`Zbw9Un>Cs8Mn$>$Y@7A> z4mwVKOpx^lM4ce+8QVB(?ZCTC*z#A{OZirjfThn;jb*o+d6m2SO7Xtd!r5SLfvFUU z+n*{>fo|36W5yAoM+bj27SFmGxZB5-Hs}kRbOW%>pS(T)EztdOG7DV)j4RTowh{$ZfqI z*$Y}r;qv{E)@)z&DVzU;tju=nve;pm%DiUyu93JrsW6ECydFAyw-SQ7n}>{SK_w7#epjeH&8s?bLVcrV&h ziZQHcTST&!5M(n(Z9A1ES18{@HGqzP-)GPwd9lJi?}Puzot%ZiSovLV%b)in966@c zH1q;LF;}F5+Sl);j2?GJYfDb^6zC}ajLV|ilq8G=3KTIXC0Xd2P`BAApOZ~EkZV-s zE}AasQc6x;>KY&JC{-^=9Boxe1TW3ic_9;xkQ?*_Y>nRXh*w_*-`vFa#FXemi*S$m zog`f09jUL(%OgvlqbuD`ep8 zy>WBbmnXo7?W7NZ)kcxyqvJY9j75}+y6yZyETy|yoVi>DQs^%Zuk^UF)A@jTL! za2&)Dk3X2rXxh4%+pBCH^*-vNCVb*@s2;r<%i3N*v;|*Q)dge4{HXj;bF;S*@m<*c zfrYGTy>4`fa}ejwNnu$ickX(n{E;G_{wBkG@fsK^3;ama3pNH1EOfl_|9Lmv4@3|F zfRdN3oaQ&@O!~A`+n_teGK^XajAk|nqTvITtPH9Q+MK=O>dvzFi3n;W0~g)?=}4@C z_QaJU+tK+#;ALHg8V{#n((aa!xhTSayMC@y@KIN^OMv4_M+Nisj~ltm>e;5XDKlT< zF)N=8)G0H(v^-w?^k)yb`ZFWkq3UU|2cLDJ;Eoi7@ZrGKdPX8iQ!5#9D*;_ilN!9~ z!i2J=!SZY!b6WASE&KeWlW*xd2g8oBuf@ykSAXyLRgq0lTMebGTFE}Gszn_}+>oQ@ zO_vf42x!m2!=MFKwpO?YTO;InWzgE}#ew4!o&DF?=L!efa5A~H@_EI!obX=3RoXZ2${AAzN z*b^TjdZQy2KrGgp9N?e)F8@h*co*u<6^e?;F-IODxS4pXxmomz!MS zc>ir`Un+1!oU}I8?(;PAy!&G0?hZnWm!l8-n1DTtb?Zi#l`?pr9Q^}AN=09mlb{P9 zFPVfVViSP44@4jbm(C_vZ%rS@S*^D39*^u_501>#@d?-a;1&(cbg*CA)( zRCq&?9bWQvb#M(YGw7!MnxEQQ8z%2boHhxMYt9ZjYies+tb3}(ye!Tzim~!7Z%je% z3G^FfjBqSnpHU4tRQ}!2cczyvz3v!e9j!nk9}-nCU!nBGh$!$F8!)0eG~(1 z9_TsWfwX_bKptet#@A`1mNTN@6+K`?717fa&IgD`f=Duwof6 ztfB{daPpE_BK*oLX8vI$%a$WkJI-{LS6c$&opSv=xaELZ!x6ec|Hk{=MY2h??w46@ zp_sG#`he{;XO>Y@jg%L%|IKC9AH%vrjiOiHPE5V8C zmtUxqOw%=u{iOW<%mK0L-dG~!w|=Q#JvU2vraFYPxf4d1hPv~{1!=RoJe;*Wc5d~x z)$z+WX|ysxhE-fhot%6hq6t&POU4@{pJ1<2ID0YF2ua=bVpOB7V+MMovV5DvShva3 zCiN5-ye{}81@ zRjrl5^7CmQ$@W^0#ih5CnpoNyRc0$3Cip>N0jbM}~F>-S35lodf4z zaiS7+`qop{(Cd@DgVn*lLv!Rn#~xR4F5ed-=XchZsuh@t zK;=gf_*NGeOa=!#!3R^hdaXB2v{aG;=`ST9@r4wW-zf3K;!;*oaK!0cIhRAt>jl(3 z6mM$q`^3!JB=$B`P3$npb_N>UR$C+XeL&9Nl&Ts2-b0rtsfJd=cV+L8+u`=kWH@U| z8%>(c3H)8ez2;6+d2e6sU`GkndJ~{BB?D(sm*K1KGA<8lc3Donr0L8*;X8`2en%61 z`Vn`ju&?pvE@fCOxDIw+%oR?<+&vtc`-ypLfeajmlkC+gmvMWbVsiM!f3A~tYLkBA z3IE{*nR%HL7`Ivf5G1*L_UA_whlcac&3K^+^6rElpgu{tc;M0=arAZ>#S9?&EE(al zopQ5&i`l*NscOv^oyCU26|*M|?;=TXULBl;6zsH|E=r!Bqz(Rvnx?(F&=E76oy0^K zO(GoiTwKddMgX0UgLF{Y09{9urD0kLt;!^meaT;IK#g3(P_*sk8m%*$jwX+odvKL3 zfsn|wQ4Jk(wEXpbhw0dHMar${1%4<=%nqvL}3h z)z6jnv8NAlfywQvyXd_R68h%;_!?I(Nqh?I%2zO#ygE4uD#GZDCt2%Bi_3u!ExBMG z3sWEvr0`!Ra;^h%b;fK@RjbVe8f;O4auI2$11Y-7DbCfsz11-xB&eBNL^c@&7#!}P z?mradJ2yx-t(yu+NU;xtODC<51UY6%k6gc3V##t);Wg;KnzJt?DF>017oKnAXQoqo z`OQMOpvU!t*uV0QS|a&xZ?yw%i39vU+}fNBg&@691C_{{+=viQT`X)ITuPUu?ld;RbK8>9MXW&fwK|0K6?|B_PvD1zz=xv(F43f@{J zL?LP~JYN}l+E{u*M6KN+s1Cr#!^g+TBf`lesLR7E%F8Fp$HUIUBg(_GKr8w6KNOr? zY+$y2e-(H*d0ukz^6K*Ni3;$E@{9bJ0#^OJ3QB?H-yS?+P7n`IODEU=?L8J$)?QApjX07b^&zl9MGAq7AXM@pJnL`ODh@lwPTWt7R=h{~z1g BpU?mR literal 0 HcmV?d00001 diff --git a/WatchClock/Assets.xcassets/AppIcon.appiconset/AppIcon234.png b/WatchClock/Assets.xcassets/AppIcon.appiconset/AppIcon234.png new file mode 100644 index 0000000000000000000000000000000000000000..a640c895818d1735a32c927c4b060a860c543070 GIT binary patch literal 11005 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 literal 0 HcmV?d00001 diff --git a/WatchClock/Assets.xcassets/AppIcon.appiconset/AppIcon24x24@2x.png b/WatchClock/Assets.xcassets/AppIcon.appiconset/AppIcon24x24@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..49352e31bd6a183166056b36a7d6a59664e9cac8 GIT binary patch literal 2161 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 T=oRVD;{;fkS)0}vd&K?+N3&ln literal 0 HcmV?d00001 diff --git a/WatchClock/Assets.xcassets/AppIcon.appiconset/AppIcon29x29@2x.png b/WatchClock/Assets.xcassets/AppIcon.appiconset/AppIcon29x29@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..07b41b2488ffdca34dfd3ae45179fb576b42007f GIT binary patch literal 2611 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 O1F%MyFz*aqqW=SF3&Iuv literal 0 HcmV?d00001 diff --git a/WatchClock/Assets.xcassets/AppIcon.appiconset/AppIcon29x29@3x.png b/WatchClock/Assets.xcassets/AppIcon.appiconset/AppIcon29x29@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..52875dc9ec8d5fa6fb946b4aeea15c1b0b30775c GIT binary patch literal 4011 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 KjjA%nQvUn4CwezY|1x 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 literal 0 HcmV?d00001 diff --git a/WatchClock/Assets.xcassets/AppIcon.appiconset/AppIcon92.png b/WatchClock/Assets.xcassets/AppIcon.appiconset/AppIcon92.png new file mode 100644 index 0000000000000000000000000000000000000000..fdc14328dfb131b3244c3f3e85680ad772e264cb GIT binary patch literal 4249 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 UzJ2I_{tEyd&HKn|b-U>Q0J&)Hu>b%7 literal 0 HcmV?d00001 diff --git a/WatchClock/Assets.xcassets/AppIcon.appiconset/Contents.json b/WatchClock/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..07b0c40 --- /dev/null +++ b/WatchClock/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,124 @@ +{ + "images" : [ + { + "filename" : "AppIcon24x24@2x.png", + "idiom" : "watch", + "role" : "notificationCenter", + "scale" : "2x", + "size" : "24x24", + "subtype" : "38mm" + }, + { + "filename" : "AppIcon27.5x27.5@2x.png", + "idiom" : "watch", + "role" : "notificationCenter", + "scale" : "2x", + "size" : "27.5x27.5", + "subtype" : "42mm" + }, + { + "filename" : "AppIcon29x29@2x.png", + "idiom" : "watch", + "role" : "companionSettings", + "scale" : "2x", + "size" : "29x29" + }, + { + "filename" : "AppIcon29x29@3x.png", + "idiom" : "watch", + "role" : "companionSettings", + "scale" : "3x", + "size" : "29x29" + }, + { + "filename" : "AppIcon66.png", + "idiom" : "watch", + "role" : "notificationCenter", + "scale" : "2x", + "size" : "33x33", + "subtype" : "45mm" + }, + { + "filename" : "ShipsClock_Icon_Iphone_80x80.png", + "idiom" : "watch", + "role" : "appLauncher", + "scale" : "2x", + "size" : "40x40", + "subtype" : "38mm" + }, + { + "filename" : "AppIcon88.png", + "idiom" : "watch", + "role" : "appLauncher", + "scale" : "2x", + "size" : "44x44", + "subtype" : "40mm" + }, + { + "filename" : "AppIcon92.png", + "idiom" : "watch", + "role" : "appLauncher", + "scale" : "2x", + "size" : "46x46", + "subtype" : "41mm" + }, + { + "filename" : "AppIcon100.png", + "idiom" : "watch", + "role" : "appLauncher", + "scale" : "2x", + "size" : "50x50", + "subtype" : "44mm" + }, + { + "filename" : "AppIcon102.png", + "idiom" : "watch", + "role" : "appLauncher", + "scale" : "2x", + "size" : "51x51", + "subtype" : "45mm" + }, + { + "filename" : "AppIcon172.png", + "idiom" : "watch", + "role" : "quickLook", + "scale" : "2x", + "size" : "86x86", + "subtype" : "38mm" + }, + { + "filename" : "AppIcon196.png", + "idiom" : "watch", + "role" : "quickLook", + "scale" : "2x", + "size" : "98x98", + "subtype" : "42mm" + }, + { + "filename" : "AppIcon216.png", + "idiom" : "watch", + "role" : "quickLook", + "scale" : "2x", + "size" : "108x108", + "subtype" : "44mm" + }, + { + "filename" : "AppIcon234.png", + "idiom" : "watch", + "role" : "quickLook", + "scale" : "2x", + "size" : "117x117", + "subtype" : "45mm" + }, + { + "filename" : "ShipsClock_Icon_AppStore_1024x1024.png", + "idiom" : "watch-marketing", + "scale" : "1x", + "size" : "1024x1024" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/WatchClock/Assets.xcassets/AppIcon.appiconset/ShipsClock_Icon_AppStore_1024x1024.png b/WatchClock/Assets.xcassets/AppIcon.appiconset/ShipsClock_Icon_AppStore_1024x1024.png new file mode 100644 index 0000000000000000000000000000000000000000..88ad095c52f36945486ea122756909942610b246 GIT binary patch literal 19483 zcmchP>&uTlg=kfNXzl_E{0Bm&Z_^o~f8j&y;LSSX?>AV^bs?@I3o3QF%) zKt#Iq9!PR0&->kTzUO;SyXW3>|JWhyJ+o%5-zu|a&Fs9;(Nd9#|Ky+PK=08*B%l8+if3h!&s%;7w=UX9lX3FBE_I~;ICVwqo~?9`FQWtfw0%-< z1!-OV2d@Kf!J`L@f7bOyym}8@#2hYHe&6e^qRenyx91bM7x2rOk<*2-104wwlkr@< zPyXa{Ay%&M!P%#GmUqm9lV0caP~|GPt;Pxi4+s}Mxc)0&&<(2v7b8Ji$NT@l=zkHnDX#0h1a7O)@_e49MF3r1h)SJ)-M}bEO3J+|A(OT&Li)@T|~ft z3(@q8#h|mmeB6TVnkG z;+_8u4Q%TaQ$jIQ8*V2dRNZYcL?bVqT8BxyOS!KSSY~xnKAx|L-R@ zE4Q#(eJ#f?H|Z8?i6h1hr@M z4>kL$y7FW7ZpJlVq7vo){iH;pmEhAl0qOm83&ADJRvroz5L?!-`_>&zL+==f!MJx> zoUl2U^~QvXC34|Ow+}yT$esEw;f6xyzY{`Gd&Z;Bk$sn( zGl6HG!3yuy$;*{hsnexF=gqm4p$~HngKp?>&K?eGY;X`h9nI5-rz<^bPH2 ze_nikEt|^=G(-=f#hvmRn~r-O*W_e+PJ>kmL0+Y(PW5ckJ1q-8hem8r-X|>r6O7&Z zT%iL^OZpcnA5wuv;nni-D1NL0)Xzp!TK00eitB^81O;gLD>vQOri-}T=U9x)A`CV2 zF}D=iC!h)Ay#d))5=Dt|NMf@TIX40~PzFDIDz|FkiHYPv zdQIJ#=IM`1`X?!Jngp}c6~Ic(Aa_IG^omS{4X(fsH^7)QqAh5`RH(1fHoRuW`FuNjE}U@@_{>vX-J8tHV;7T^!!F&DTAaNm8^H;%&e;w>eqEY?-n|3(@QjJSLbF&s1U~?8O`g_A<10tEu>63;Ev)ap)ag@G@6BYpUgjV5I#k* zk?<$472x76Okw=xJzS}ca~sJ$$4?4QIq$5c%Gf><(UCk`z=C9_gp@49d1Af%uK$#2n?jIvm^^PV6;dMz;I}`}_US z-2cH85B2qf5a&ruo0JrCGu#(a>!6p>G5rUm?n}+a8JMu>asR`f`cYxO3!FN)M_V$`n4lGG+(EJ!MLFHzjmQL%ma19tygvU)&U0rZ#$4F#uNN-`SW#H=q|40fghuGh&|-Ge_DKc00#@RC^hl`os! z*VKv7y2(2GTboX#*7~bgw2#&*X{{QaLvzqnN#@w}(-^eZ#MyTwP^L8r#QLGTDCvWh z`6R)T5KI+Fd)>9R-AZEMMVALEiX`>%l9!&VeE-mNcyt|fA%b*lli_j>Cl9I<_ULqJ zmejrG%*jAVNxLa;FmRA~_W<*pze|`JS7!Ga7$Z|UX7>1NHc-C=sUmjjw!oolrI;|F z{UAOuZc|Tuh07)m#_J2jX#dq{^7RT<;RoPgp#9Bs5eNEelFojV7lgk0&{7varumZ3 zXzdEx7&ClbkKKuHeOx+C0NthUO!V{Fq+IQYL}o>q=JPryx5w*mOOt?Y{CWN(I30jO&`gm2Wyx zwNOA&Lpp(tt6YrNg6iA+e%vGkmQ4e)`rs4a5fs}VO~VlGp8L{Fux9im&CldB2}C4L zMA)Z}46C?(yhoV`<(H)t(>WsJU8@88H*`)^D%W|SG>j2x&eyN2&4O^Apdml2u`2?$ zm2}(?dev$_l`8#LvkUAYh&)Mm35X*0wQuaF)(4%$mngV9vYbcg0YLL`u=9k_I06?P z6Z6pG;U)$u$-}9>d}fri?S7S&>U>)IL4YO*XK5I|W4Rg;w6{Ha{mtxZFK7pD=>}ld zkJ~CY=-&R|;$|)=3>7B=z3)J*{!7oKPE&AR2EdYUHu%LK4StfC9S@xF{fO9Mg`q2C z#tiU5{dbgMKP>_AD3LjnnS%*3ZEsAUWk1C$Ug8R*Z?rEk(eOw6&AaLcM?6ar?6{jW z33N`ThJ3_`Pk*g3R7-I21-Qqv{c%L-HdxKm#kiriHB9s708^BT62$${l*=+IQR1#N z^q>n0VFeKrAya{@`rMZMvhGZy&)3=NS!y>Ppa#{l?FVAARp(#)*%o7aGAD+9q6l=H zN1csYD;4TLgV6mg#TZ4%IWh!ga;M~`(l}}~4nJ2*5IxY7dfa-@H|uouKIp&?X1m~} z_;-%vN()Y1#6Ld;zN7&#(O>s@yEiC$<>0A3$&K=y3ON_Ii@b`JW^i7GJY3Jvg3~AW z_m8R_-X|Gp!EbK$E^cy-Fwy$~{wYmSK6mCbk}HUfhEN*?Q%GN~PcrCer{lO=zO2N+ zeH*r9X8ij!)}h!tYo)jE(*w83@SMU0mE4gQkvYNYUGsU%_a~_JsWo6OLheN+@tAn` zi{{z|*w0>Kz!!BDHl1SP=PF>;>6PqLFwdbwnqTPvi(z|`;cR(p`mc^Vj;4kVbHY5d z5O%5k6yGYcL;cjbg7}M8rI7^U?28cHoU{Qy(dcYX8>0R8eXrjXjTwI}aS(@%b0!6(D6n z9(!@Gk zD|t*)mJzvK&Ps?L-y~5sB@Di5zmr~)So0>mGb1QMhd1)2o73?Z^L0qk{ACFhKxMly zStfm5il#`+*MfX@kRo!I zeOU0<;*eedjCtcY%!chVvI%8-3#Q~eFI#^56W?Wxa3&sLXs@vuH367DM-st8*Wy4n zKx?Ej$i`A(ns*(MNQ^k3<*0~NvmcF(Jna38b5!4# zx&uK%kA-lP^6Yp$??pVlK%$9Wl2OlJL~0}PvP=RY(e6z`f;ybHr4bP1X=<2!s^F4A z^h!AoCp9B&CXEJ5!_fw((2z%n0GAqvch~RS0c-otQtXF94*uwkXYP@wT$0ojhq5X! zRtpHL@3>F8+N_tEH@0}1zB{~06=l8qSiCgpWA;gSV{Y2LR}kXs^Fh?J+A@To$q5M& zl(l#4AVs4lcoLf3sHneNaK0T52JoiTmNP@$bHXkui5554FIBK)zNaAqysQjX9k4_~ zS&4T*kmSD0#-3y9s(Rjb_NZ2gyYsIWDUWqDGAAd7p29l&2svC7RUQ7tL(`i}7a&3F zw#IUCB5=>6xVcJ)M~6((gpVc3XxarX4yaAMsXL!Ip;tk?KmieNzFJMKwnj%#jNp~{ zGQh}`_6P82i2_n$9mTajFKCD$-na#~*y^2K)e zMV7~1n3d)NqIYNoQLJef-=Y&q=k*^m%8$clvF(XD3qutbn7g6mddsmhI!;PZ+HcQk z{9+Z6`OEAUKuSJgTq*q^u3J80YabOXNP%P>Kq+yUug|)550w3%`7AQ7;dA883 z_&Gsp_oF|0S>ywwS{9+G#$P~tXo6E`dbK?>GlVjnV&HIgPaaK?P3K6f0frg9QkwA# z(=*Q}kmQzZC{=4p(35VkA?UJT2P|w05px4gkUGQp!v^Z!1#>Ip&WTjqZs96|BD>5&poluRV8o&+#&dgir_8~8Aa6?ou%^W(XMQv_3SU-K8*8^EQ|pucC$cGxFD3R<`jMu@1sn<@+E6`!xMH_X}B0oSPAJQpo`H1Ug)Y zxN9RmMR8kB`ZZ2O%RUm7a}8V^@11RG6T~muqrd9CjPbbxK}v^50~Ar{yt7W&-gs>b z$>nG~R?2j=drXm`kyvV&3Ied1NDOOwvR!5v9?9foi`Ll)%Yet?+Ftp1@6%N1Q$h@t z0o%g`ACh40oY0>f>dc&zREn#u7L98yh^J!rI!ey2*K57vU8+yGbX6=cf{3jBEQHoI zbERbaqNa_nm7j*UD!djecYlcWe&+kKs8!BIz`O{oAoVpe%a>nd{Sn>oU$||xvGy&6 zqLc@3Bsl}mwd*0eisnIar3ezL19mnrC|W|NVO_dDK&vC5{42-=r&4ZBHm&vOx;nB& z;Hs44#V73L&KOD!yCD}72$^2zMX`=!D|+4IkwzrPgj7e_tBb?fbj;ZHrXetTkJ=Gh zFrn!3y#JY^vgy7&Ar-3EEk7{($^LWu$x_X8n=BF5hk7 zqR8au{A*_@0oj)K&X0JL9I9V#%_~5i;OXzn=JsB}mEc~|%4$azu2tWk%v!f+G<8A zbtO7cEIVtA5fpT8Qqm}OvO$-G2dnp@_^V{SDryP?;rvY4sb>FVcjpMAmOt!uXJ{Uh zvl;-WQ9Oh*oSR@<#?s2ZVR@v`SNPq1uU5YURdDSS4af-j4WI-`6P_r+Y1!P4i8q`# zRB<$=XYG!r7Ns!eE}4Byo-)+HAOs_6?V0FZ6?Bh@1A!Bt-WXJk1khSfr8)qNYQcA`(WiLtYoo;X6;OZX6eESti*X;w#GIVQ?w;@wH2ce?} zYE`~4Bkf$ro;-P1z_6ZXHQry2?cnQdV1MA2+1K%I70P+^sMx0kc(tk;Z6p+b_jOP_ z{zb&FB|BHb6y}>vDv?3$9W*5yh;#g3iQ5lDmIbF=PM#iuQ5~)Bp0RdHkj!8Im@SF< zozeZCy-Q}Bh6GZP%O=yMgK~S{Wppc+FVk#gtTB=md`VjzgzwV~$zWz8=NR|Pg}1}`@b z6UwB9t~j;w6SaUMJ9^H}ehtTWW*>FBxwPrJ_qfA5l`qpk+C-I@hYo_iSOLIm@D!0R zovY!G>R+SU+Z8qGp%yPv8y+U?b-L>n1AJhR=zJ}wAicEbu=@3FI~&RQ<|snO201d! z9>bHlOviV=hsfP&@B1wZd@#Xq>Lq-n|KsW zgQ?Rxt+D~Tj~~vplP?`BdUS*?lS9@wBVVqG6X}j}J<)4nbI*4T3`(>Z2Zjo%mHgUu zm4sJ(Q%Z#Z6L$ALBPH8Vb?dub06BVL0&{4dk%+F9elRR4gr`1*X#iKd?he5->?4@)R+>uWsLn(j>9s&qLy>$mJc z3Q8GySvt{DC|g5S{MpFr;SJ2QdNr&SVexLQXv%47T=)98hwl31vGi5fT~I0k*-QFu z;ji|miMOQwV4l4hU*tkSX#GcJGTUX_pC5mOJ-W_`us3V3E zI4}l;%MHY?vP0zh>@;qHF3d_2Ljsr%*CTs)a=P=u%0!|787OZ*z8}WrC^(;J1L;4P z<3!s!HDn*OaLo=K56!&hYGkl1J$MrmMIV8qrRy#4;(IiPI(SM*6}i{tA8`eTwDJe; zElrbS+BUr#CHqBO@9`fx^BILjiS&{Z({s#S8lwP$N9o0v?o+P?m~jqrLizTz5Mg(# z<)qG%y`O?GhyUwlm(IP32ky=!tYFCnwvgL)IAGz=o_wa>7#9Isl|R|)EZ4^Vw;pl* zUaLh)=;%Dj&*w|>!K_gC{dEsncrc_h(o%UIhIa1atSko@fdLei@DtR8xJKAR9tEk^ z-68BG$az7$hR`Zyq#$kjSxfX&iT1C*P?lLGt=HUSkS3IIz1p~|kxi+c0x~xnbH=j4 z!1@e=E`8=q3%h!YY(uYewDU^h%rZ>$jW z5CNeXzj2n+K->{7Fp|uBuALWNi9;8V_1o`muS4{;P(L5k!VmK4Xf_d23hsbEgCH2j zM)F5wgY3j#rUrFd$&>0U28DBcX!F ze^E>mcIoQ@4UoWb#epcCiMX8b^_D9q_dS|!fZyfZYRVQ_kXCG!!NA{N|2Qzv^3A6? zpx}68ViK12%X8>PoTx~E5@hYYCkd;$2%>L_6cjtPk?HOTEHUlEA5xN^ZXh?vQmOWG zfCP(CTTjbPfUq}K0`_B-puDYOV=J)BpdO{pQL^k|M!29FX92F3qBi<%Yo#+5dSj{_(vE&SmwY2vY^hkQ!cQOWZYAM#ojqs zo>DTu11z@)hrysr9oM+gjG}mQ zkUd=rgu!a+<*$KKHUGQU=U$tTK{{XRP#q~!26(~{A-VegHX|cPrm$BQC)6FoSa9<_ zh&dgL56RJ@Kj73pC?Ie#sJeb>uiE5d0lAY<;9fDHRN3sIF--^V@2idu`BkL{f69Sa zmG}=82DsGl9#g|?fKr3&$&x~`bG#!t`s!-HzJ7X_6`_ty$&lhi1hv>vS>UE{$5A|u zKu08Uzi%HlIKp+%L>4&uMo1)!A?@4k6hA=4P0@Smkj~*v!UCNxHH7#G&>p&H&0X0_ zTQ(o^z^obdtz8Z@i*Px?rH@{@3PTUa;mn$LlO_mv*%sarflf}|jR8(werLSb;n@P* zEU*@^;s$dgfb%93jY`9*FHSiQM_&p-v0s3gj1by3oIxE?@9>1+HBi9=Z?NKBjnyl6=RQpwU=_^j=`On;obv!H zYn?M>Fn;x68TQW6!OL=L7_}*v?+m?!e81GmO#l>(~surYu(Up7AaE9+9%jlm2&`4ObKZnOL1XNS>_! z%qw&4*@@nGEvD7r;^rd_*GO`KH7afFz5zw16JQJheV8FkdW>UJhStp?>;Qz5^?RU#Tm zh`zAnb+lXw$MPhqU_K;sHCT>cY%|A)E7`1wQhtt&dZf7vZ0e@P&=6&r1P9}FcTdjW zN8K5UNLFBFHDm1G2J;VndRW~ZbOmL$@yV{T!pi0=%g(nX-lxD?6}uL-rzdyTsvm}l zQ}`GMt8+D$G4WBl9DQk>8>9SPjd?s`NJwP{?iuMJf6ijnzGze0$pm1?6sBi!r@DGb z{t)0cJF3=;cGV1KSO`#zzk|*iT+qH1LQ}T!z^m2Szj;Br)D_oZR7vSk43&W(8gXkY zmrEEEjM7)T{|;ZZp>W$upt&w-wJzyJiL5oR1{|$6x$~y961m+rd2vI2gjr6FJ>cHN z>B`Q_d{HjC*-Cuur~-sOazx>l>jD>FA8%-X4I$rphYA{bz*?hWq3LtKD`(5pNKCZB z1dA(fN)PrN=m-wPkOg9TS!Vo}HdV0CmZ$??hZxO8b%D({W|ji{hh|i@Z}J>2&hzLoeyem#2z&o+}uI z+ssth_RB*o3$woi59ehQGo11HL4vH;8Xh@-g3FEXu9TSE)UwMD_tf#O)8y5@T*D4z zD-3FK2AiPSO%r1f1-zgr*D{Uh1!pCO#fAl zShL|=?rm(c3qn9pgv%J-8+HFHs~RfpeQRU&BUNm{k2P^KF}ln$PwwYWO0Y;WFp;ED zw9a=pS!cr^=p?*DevGO2j%i=Lyq|g8-?tguoI{y<@)dJs_%_?E=y=Vch{VEp4eCQn zF_8}6w=`C?_rW;rU4-67`r|4e%WBnJ-G<`w4YDWHAF+mL>I;QFFTv&txs|J!KbMEc zo;VwI4-Z-Gxho$jd2eodU5Efx%7r;w2@ktUILdqIAoVfYVCyP<#EHCJv!K2@pswNaAK_uFY36Y2So-{NW+*8MWX+VcnK*UuRk~8)*r&lu3pOO@Hy=M>s(6&h1C-etLg2*4*5F$0J$zwrRUN0cvW5#B!7?xsdB{<|Uk=)SJ_@4K zRcg9o3sg|^3&eszm;4IB?lpDm?p>?S{56PaWvBJrZlzYWJ_Hf<;6see2-Z=Zh@+3g zXM!4PVgCJ^)W7>9l#M*IV2JTGSuwK>Q9X@R&n>pRml~t@wq5x7lOJw^Cx6Q2SkiyE zH~DP|22LAdG_NB?5lu*7^qj>d)jF-NrAp=SH zJ%w{iDkXI}%wkgFLZ08h%3^(G{3@`=JQy30d-KVR5F*{((vnfsJfBkP%S+WCesv}@ zW4~77*aN#&>lZ_e5>_7s38=Q(xjRKc&~F#qUh(zRIs<8@yZ3wh7IQ5}nC7=bEQ819e4E8FfWr!>}ycc4@I+YF@ z;GJ$`fF6;Q3b5@UmqJWZYDyY1QjD(Ag{PS^FvyW41 z*ET*lnEf86vWjrEAlHnzstX+{7el)5W*L?x*G0&{6yx@Ibp)gUNjBm>_%A;a^RGH2 z{no2uR{X-n%jPPQ4j>z>eyA@O|Cjl0^2iJjx#^6R<`AFvaU6M?AY3V zs8+I?!(2X$jmyKON=+YUoTjAgN)}n#_P^+QUaAVhWt9(yc%mMJW@2_AH#H2r^jfEB z9@U)T^j!XH^Ty2M)!-4-S9Sb5?b*qoJ{ir=Tke{7>T?UnMzEkb(cPHnZ zs(e?DxbA$EXw2~likTQ;F2Uh5SK)pVg4pwKbZ)u=2uhH*ktAr=INYwAQ=rXPJ82o; zCV!g_b-u||=?vsi8VIW&Q2uW$?!cEDU!(fa_a%zo*KVXd28Vd^a96D`=K`>s1{gh( zbl=In;?zVYUg*pGO!eBVoJVE!;SaU=r6TXS&RS7h$V*bFe!mpou6|oDtaj@84d>}b zFQ4N=TpW(qnE!ndEj^Usw#4=Np@(d9_kTy2^YBRIANrZx-w!IJ^Yere0w1IHO{uf9>j z5C-R*@|Byb)E)YmyNYt+%HAwtL#wPg3j z&=bqE_G1%G^DSuTH&)h~w_^s%=-%NL4GM9YIgcEXHP<+7RP36O7sfvAP3n zZ|}?*FLj#3Fe^;z<}5$Uh_+io3j5pd-N{LzuX(3PD4}SPPzh+vHX3m|1d2+r;LtqL z#dK)ZhyfL(RA7gb;f-HpDnvWJ;>6DRay>58*`u@iaZXnOsrij~j)(ejnq)(7v%sPB z_oPY#W7e|ce5{ZdEG)eU*$ z89GDdoBc#$PeL9bc*fxzZZ~}Nu7rAKi`Yb=H^{=kN}Snn_3rx^#IMrSD&b-k)mc=H z6&zD(!O~=P4O^V6k5%5yvF+_s*|47&n-$bQ6)nEg*25=;&*^T+FI=3~XXOu{*S@b5 z1x1}sW%EYK7|AHy&cCqZ6WwGmf{OKW^nahY>s6TnAI40dXormbHh5oaqOhAQDU|=l zf|KG++;#2s*-0NADD6g)VK>cJ^Ya_Yo0p%Q)AnxSrL3|3^*IZFsD{71fBj9uS}EpD zhR#-{?4#V5yAgChHjv2LT3MvS(C#y-VeQ`T)y&EfVWBh)+2BuGV*Mjlo5`X~MG>0kbdRu7mTDtj%8<_QS`=m2Mk_;1RXXPg z>d*3#FvXiLS82Kcx7VM)MnB23`=(DzN&!U=VUE_BgAT&jO_pBr)gA69ax+EO+fJRm zI#|9TrjI`+)*F)M%&v&Y{IN1@g%Y4W)ZoB}ypiUW-3^M!0GJ3-UMqGty(M-@yKaj$ zV9yz@rI2?PibWbVcKEEXO>O_$R&+C`e@X5-X^(#Hu$tqJyH+`ZnryX<>HHkqZQSL$ zzk9UqsFgeC$hsQr{8sI7*xB?}Aw8KOE_-I@H|~q@A_J7c{xVaHwxtY_2**S^v$#HV zQ5ktASv}V$Wu>+LK)bYH75+;q+v7#f63BRiJJXkEtICzFj3-K}J>cf`p7!5}nS;(O zN~Ys5>XaLA8KFzppQ^(_svO4a(Yov)@cZ@S09)0`x+i+|bJ`dGWIH@jZq2eSK={+R z;yW!?E+h+f@6h@2o!IJc?U?y(HmGURQ%wj5b-WF5DTC;V2h5306L|E;myB6;F!hbE z4Tm~Sir>uI_i6_f;>C-MR7cK`#3P%g>H@kCUc7E4Nv9|4oV}bh40D2UOU4Js@=;O{ zKQJ^B`{=mP&GZguATYDV7c>eeq)bvWQ$`)t!a~f34oZK-wI({wnN%(0V^{vfMUjL) zHofd#qYZ_>H7@!r`25MVvR0VUVgKBw4g0A0^FHwpFIQVDx0lC!vpuY*<=~IvrI!!a zgfE{s(D>jFN`rV^jq(Sr7+IUDRLAYDh!EXh+}>yRtD?br6b2-I_QbA7a zZ08Jo&7SeAEXB+Y_h$R9w5w40ovf^||JeB*?1er1mLzF2`CJS_HFx-m{gEjY{;_7W z^TI~MMY88I^pU+&a3TXRXnJWqPZpfK~Gxodr+)b3y!5>L!(1E^Kj7-)UWCj4Fe5Yx@gT=OyczFz3j57nb7voUo%k(FFw^| zOE*c8!?Tk-4cXJO~v%5RWjh1{M(bk z10BbcortK5NX(;6HHyy?6Up+Sb*QD#z(J4VgFV_3eBn9Q?eF9vYj7rYV7jkrjTxcv zyq-7LrpxT3J)iHuA1PpC3rwo!%tkTCQ|cANuRN*7)-k1gLEqi^19qgpUB(ZT`8f2w z<2zhCa`2B-UmKg2LeWThz|bmVm)Xa}!(slv-f6itZl1k*??&9Ei9r!vUVXf)c9DjH z)brOUB{ShjUj+B)SyEC+6q0$=Arw?@%GErbn+iE5RE!=h#5uC&-k49_W}QPLYFb$E zjzxYjM(7?3@#wTv-y{?v6vBb8eW2IeU~}5_Ew4sg1Ec-@TIH5*C}D5SNMe3iq%r4s z=D00ZW33ryb5brUr(g=H@Tfl*$Pn*N#BmP=$9TiQ6v|~)XJmY-5dVRFL-lkaDfCTD z1n9Ey0ktyYcG1BNv)J{q1V@Uluo^n{64e)ZH4u2>#1~Nbr4Z?N?^EcF?bZ=?&fnj0 z=k@Mkb3LX+I|YKC?JVInXy}^2l+VZQKm|FT6Iyk3$vc@!MauR>M$N9EvaiBnwejmjKcbA4=^?;BnUR5XRrmd!W4nDl3LHU?DR!r!)M4~>;1jZ}EPV{Ti;)jT}e>0CTn zbPh{cogAxPaYrRpbxBW*ppG=Su+70)7;+f;NZ=1gMZk)8pg_Ti0X}y5((GPOYL3TK z|4)S|c2Lqp$Umo{k3q~22AExaX9_HXqkfj6bQS0PY1$!ZpDqPV&U~(3!Gj*t1-Ls9 z_Y<}p@Jh^wCXkEyODN|V18b;1*!SIBTl<0hkya}xxGf)7C8+ZYC)O)DTJVE zMIhy9u65B;=d~$aWx`klo`BRPbnFkq2W&x}{x{7-d~#~e!BcJjeSExd6+9Occ7p^x zdlm}se^xA-N@6ISoRWxoTl~DlVlR14EJe`i?J7Jt8~+Y9K2}*h=94_WYBdX|fU?Z* zYgiljTZmMG^gk*25))?5=y0Z~1ld@%F5H=2iS>g!VG;-7zLPk+8%Bjok|*w!6QJJ~ zEZw}Gm6B@ntkw1=sMlmK3k2*pdkrhor}c z{Bi=_t>!exX5_d^R#U+!$AhzDclPO+;LvHKA-5`9yk==(es6av?WU1%m*#~CeGv-n z`mMY*xYzx|wcNmfzP&x#)yZq_`>51aIL1@@^t8>gd|D_UXLPw5gEHI)MgLee1-Dph zwREa$vFO6qWPy>*ub~;C&&^+?&W4Kx9__XK3^{y>+fDH*K!pmES7Y_GPs+pM0Mnq- z|A|V%#{P5OIo7;Q9!|V3wy!w@^QH*!$b>JAg8)j(p;=9(%l| zRik&nP=Sdl&m|0bUp0IeQ}uz|`#854V>N^++NHV!LHwyvB%>woM-rsnT5myd1GOjq z9pzzdg*i1DpemS-(Y7@G*OOf0^bI3CEy`r$hqu+G zq5M@Yu-{D~@P{`U9uiOx{UjqE$J zWW=>rC901&kyLL;OipKcW%dKgVDF6{fX8*sFdqjBDBQtRx!)v&lAH3Hu2dJ?yrV#p z9@@nz$03LVlXJPyyTy~GYHXLmi_-yp!uVOb;V{~v+~>SHW_lmEgc2BEs?LBYA=~Hx z{2^qlm4=JUPM`v}$iWV;HQomi8=?eR*L3WQkTHX~%AC5VpSfcnVjX(J#=u5zdcSbP z;rTdIi=Hn!SgBb!JR1IifGDI?AmYrg_!P+5x>;mtihucA1Y<`Q?>pnSxz@$(uo-`Z z*}rOx-8{`aiK%NV`m4{+bBqns4xf`o9qiP@YgP*i2(QrE^#|dfj?Omle6GJ+jPIJZ z2-L=;UBtkE4b=9eT8!=_+EL@W7CJb+bAjoQW3 z{jRninmtwAr~3#F6+&Qp^!F7kYVNfy7sE8Jd(Eubuf>5DJc1CE6~S|DsVB8JJM_Np7M#?q`EW7^zr?2$4utx_EM~sOPt&aW^ODvj3vT!Ioo>{H>6y zW&6}zXX0(BPzN}%B`~IRxqA%__jXAk#t4Uxoi! zyWNmkvxh^?nW5wPuvJt~s_b=7f{R~C-+*sza@CnuJ8N$yy3R`X15=n{xR|a|&`y@ecC)v$ZFY*Jo!6HPVgQa$CdC$=S~orBwwZ6|{Q!YRSsIv-?c*4lz*}Ek)X1b52QP;~U)ZE_i1t={yV)+-yPl z-;8~D_c)UVJmyjg9>jBkGu3Et=EYdg{@`G?J~td?4X}uURUtPeh>7w?YFw1~u|o~D zOLjX;LF+M*PlBK$P-xe;G~2c4p<`-JmJIYy^N3BLq+4MS%F@A{bJh?z-+FFt06(OK z2ZR+%-JG$lA9!Zzy!9tjxBIkmC%j;+^_h1@JttR@E$*Wtb;o9A_Fe1E=KwEX6jXDGEd&9>^DAvJhz8(=r9IsP z3-DLhXM^o_tE~pk5L$s;OkfJX-=QYOp~4tGfBECwoSFQ7X&36~>SJW!D6bR(yff;w zyY#L)$nA0B8lNh+lMjj?GbUS>=He*QRCEaT6SyhW8gKX~@RsqMD5((L)*HbNoZDH& z9Jq{K<&z-g2BA?GmyT9fFQg}~v%2Ld#q5I;cg4;)n>Ar0+JpcUDoJXzq~=UiML>np zpE~L+S0wJ_EpxdAJ8ru8;2#de#OMatP@XHx{WJF@h}B>1wYv zzq2yB|N2QW0a%rnI@hX-o39SP);;QC3MB<&p0_M!VSUlQAlB+oeH&jO(SF6;B^kHI zImRwB3T;V$FolI@=5)UwovjnQC);r>;_>MuZl=UYOR!f+7!%)T+~^YEKf*TO&`#K> z*tv3T}c}HT@PHnkmPM?Rj+TY_ctl$JFNcn(5wy4whXhgYLd>p{RhFX!b zYNd{q@4h zqcLmD0f!1NWNK^GMWeVd(cf`eTQOmSFfBe96G5tVxnFY+wocFC#&~vM zs@Crjw)D}gh#htOb<|-*ToVwSn=EaQ9K?(EbHqtp=B$U8TlujBPIXnyj4FBm%Nb#?#~Yc|KrD2BM&Q6-fHcVUOER=Ig_I4 zoCuEijM|mG^Wpwp%EZB}CG8068)Qlh__WCp;VuKt0yJ4k*0%P;$7RaTN@9v2LJT(v zx)qIPCNj?>-;k0k=`|XjUZSQiAqt*j99G@p6db?4B-so0GgMZl9zDm<-^1SX|G?*(!;2zLgv%lve{5&JS291@I0U=Wysn=!W-UjrLUcpC5^VBJZx1Om3P3uw&=JpL7gQ5omPQ^e~BU< zQ?CrDoixu1st(}G-%bM?yxZJ!0)v5W;qO6s>u#MiXRYZW`Xx$L8GO)>&L9XIp87*h z{uorF7M>KY+3$mU5Z*F|k`$dYJJWr+X<|N>cC^ z3gVXP3L?Z0iBMh<9^NPHhD&3>onpCTPY7ulVA*SDX|7Q&82vGSlmw!TDh#zc&Yu0g z@MJ~r2DS5Aj(M}w9oLJ@U+i2TrH|5;k_YzL((NCn-YWe;&dAC{Qa+xecfF`_$eRC|L5Fu z0BKB(!6*pAPy~+rP1}J1Kza8Ga{f)$zwul0(j7cc3;T}+uMwL6A13zGahsr-fWOH= zus1Zg{slYq+6_6tKAP=s$fmGpgEs$}4F61wr+f`0{W`4#K>h~GzilIbYw|Zl>AwG| z15abi03kHE{)ONF0C>U}9=4<4$CA=Q{&(=vxpp#u*8d^mKXLT4?uZOf_&Z+z^E&^p tsp+4^zImg(1h9Mgf8JStI>^Dupo(d7xm=bKX)q?FdRI%aMBe)8{{<2>6uSTb literal 0 HcmV?d00001 diff --git a/WatchClock/Assets.xcassets/AppIcon.appiconset/ShipsClock_Icon_Iphone_80x80.png b/WatchClock/Assets.xcassets/AppIcon.appiconset/ShipsClock_Icon_Iphone_80x80.png new file mode 100644 index 0000000000000000000000000000000000000000..7ec0b1d649edea3aa4c6176bdbd3ea746c8ef6e0 GIT binary patch literal 3984 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 literal 0 HcmV?d00001 diff --git a/WatchClock/Assets.xcassets/Contents.json b/WatchClock/Assets.xcassets/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/WatchClock/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} From 1031ab509254c6d2dfe640fb5555f1d4e4c3dff4 Mon Sep 17 00:00:00 2001 From: Douglas Lovell Date: Sun, 4 Sep 2022 20:24:34 -0500 Subject: [PATCH 02/17] Add WatchClock watchOS extension --- ShipsClock.xcodeproj/project.pbxproj | 313 ++++++++++++++++++ .../Circular.imageset/Contents.json | 25 ++ .../Contents.json | 53 +++ .../Extra Large.imageset/Contents.json | 25 ++ .../Graphic Bezel.imageset/Contents.json | 20 ++ .../Graphic Circular.imageset/Contents.json | 20 ++ .../Graphic Corner.imageset/Contents.json | 20 ++ .../Contents.json | 25 ++ .../Contents.json | 20 ++ .../Modular.imageset/Contents.json | 25 ++ .../Utilitarian.imageset/Contents.json | 25 ++ .../Assets.xcassets/Contents.json | 6 + .../ComplicationController.swift | 71 ++++ .../ContentView.swift | 33 ++ WatchClock WatchKit Extension/Info.plist | 16 + .../NotificationController.swift | 45 +++ .../NotificationView.swift | 32 ++ .../Preview Assets.xcassets/Contents.json | 6 + .../PushNotificationPayload.apns | 20 ++ .../ShipsClockApp.swift | 33 ++ 20 files changed, 833 insertions(+) create mode 100644 WatchClock WatchKit Extension/Assets.xcassets/Complication.complicationset/Circular.imageset/Contents.json create mode 100644 WatchClock WatchKit Extension/Assets.xcassets/Complication.complicationset/Contents.json create mode 100644 WatchClock WatchKit Extension/Assets.xcassets/Complication.complicationset/Extra Large.imageset/Contents.json create mode 100644 WatchClock WatchKit Extension/Assets.xcassets/Complication.complicationset/Graphic Bezel.imageset/Contents.json create mode 100644 WatchClock WatchKit Extension/Assets.xcassets/Complication.complicationset/Graphic Circular.imageset/Contents.json create mode 100644 WatchClock WatchKit Extension/Assets.xcassets/Complication.complicationset/Graphic Corner.imageset/Contents.json create mode 100644 WatchClock WatchKit Extension/Assets.xcassets/Complication.complicationset/Graphic Extra Large.imageset/Contents.json create mode 100644 WatchClock WatchKit Extension/Assets.xcassets/Complication.complicationset/Graphic Large Rectangular.imageset/Contents.json create mode 100644 WatchClock WatchKit Extension/Assets.xcassets/Complication.complicationset/Modular.imageset/Contents.json create mode 100644 WatchClock WatchKit Extension/Assets.xcassets/Complication.complicationset/Utilitarian.imageset/Contents.json create mode 100644 WatchClock WatchKit Extension/Assets.xcassets/Contents.json create mode 100644 WatchClock WatchKit Extension/ComplicationController.swift create mode 100644 WatchClock WatchKit Extension/ContentView.swift create mode 100644 WatchClock WatchKit Extension/Info.plist create mode 100644 WatchClock WatchKit Extension/NotificationController.swift create mode 100644 WatchClock WatchKit Extension/NotificationView.swift create mode 100644 WatchClock WatchKit Extension/Preview Content/Preview Assets.xcassets/Contents.json create mode 100644 WatchClock WatchKit Extension/PushNotificationPayload.apns create mode 100644 WatchClock WatchKit Extension/ShipsClockApp.swift diff --git a/ShipsClock.xcodeproj/project.pbxproj b/ShipsClock.xcodeproj/project.pbxproj index c77e633..3b72955 100644 --- a/ShipsClock.xcodeproj/project.pbxproj +++ b/ShipsClock.xcodeproj/project.pbxproj @@ -33,6 +33,16 @@ 6F5F631C24D47E3A00172BC4 /* MoonCalcTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6F5F631B24D47E3A00172BC4 /* MoonCalcTest.swift */; }; 6F5F631D24D481B100172BC4 /* MoonCalculator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6F5F631924D1E4B900172BC4 /* MoonCalculator.swift */; }; 6F6029442726F65C009359D4 /* ClockGeometry.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6F6029432726F65C009359D4 /* ClockGeometry.swift */; }; + 6F73EB9A28C57DB00049C1BF /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 6F73EB9928C57DB00049C1BF /* Assets.xcassets */; }; + 6F73EBA028C57DB00049C1BF /* WatchClock WatchKit Extension.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = 6F73EB9F28C57DB00049C1BF /* WatchClock WatchKit Extension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; + 6F73EBA528C57DB00049C1BF /* ShipsClockApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6F73EBA428C57DB00049C1BF /* ShipsClockApp.swift */; }; + 6F73EBA728C57DB00049C1BF /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6F73EBA628C57DB00049C1BF /* ContentView.swift */; }; + 6F73EBA928C57DB00049C1BF /* NotificationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6F73EBA828C57DB00049C1BF /* NotificationController.swift */; }; + 6F73EBAB28C57DB00049C1BF /* NotificationView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6F73EBAA28C57DB00049C1BF /* NotificationView.swift */; }; + 6F73EBAD28C57DB00049C1BF /* ComplicationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6F73EBAC28C57DB00049C1BF /* ComplicationController.swift */; }; + 6F73EBAF28C57DB10049C1BF /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 6F73EBAE28C57DB10049C1BF /* Assets.xcassets */; }; + 6F73EBB228C57DB10049C1BF /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 6F73EBB128C57DB10049C1BF /* Preview Assets.xcassets */; }; + 6F73EBB728C57DB10049C1BF /* WatchClock.app in Embed Watch Content */ = {isa = PBXBuildFile; fileRef = 6F73EB9728C57DAD0049C1BF /* WatchClock.app */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; 6F77AF04244FDD4E0070DB57 /* ShipsClock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6F77AF03244FDD4E0070DB57 /* ShipsClock.swift */; }; 6F7DAC21259430830053E24C /* LocationFormatterTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6F7DAC20259430830053E24C /* LocationFormatterTest.swift */; }; 6F7DAC26259431510053E24C /* LocationFormatter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6F7DAC25259431510053E24C /* LocationFormatter.swift */; }; @@ -64,6 +74,20 @@ /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ + 6F73EBA128C57DB00049C1BF /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 6FE9AFA1243F9CA8002B45BA /* Project object */; + proxyType = 1; + remoteGlobalIDString = 6F73EB9E28C57DB00049C1BF; + remoteInfo = "WatchClock WatchKit Extension"; + }; + 6F73EBB528C57DB10049C1BF /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 6FE9AFA1243F9CA8002B45BA /* Project object */; + proxyType = 1; + remoteGlobalIDString = 6F73EB9628C57DAD0049C1BF; + remoteInfo = WatchClock; + }; 6FE9AFC0243F9CAA002B45BA /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 6FE9AFA1243F9CA8002B45BA /* Project object */; @@ -87,6 +111,7 @@ dstPath = "$(CONTENTS_FOLDER_PATH)/Watch"; dstSubfolderSpec = 16; files = ( + 6F73EBB728C57DB10049C1BF /* WatchClock.app in Embed Watch Content */, ); name = "Embed Watch Content"; runOnlyForDeploymentPostprocessing = 0; @@ -111,6 +136,17 @@ name = "Embed Frameworks"; runOnlyForDeploymentPostprocessing = 0; }; + 6F73EBBA28C57DB10049C1BF /* Embed App Extensions */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 13; + files = ( + 6F73EBA028C57DB00049C1BF /* WatchClock WatchKit Extension.appex in Embed App Extensions */, + ); + name = "Embed App Extensions"; + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ @@ -152,6 +188,18 @@ 6F725BF7255D796200CC85A3 /* aa3101.pdf */ = {isa = PBXFileReference; lastKnownFileType = image.pdf; path = aa3101.pdf; sourceTree = ""; }; 6F725BF8255D796200CC85A3 /* ELPMPP02.for */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.fortran; path = ELPMPP02.for; sourceTree = ""; }; 6F725C03255D8A8900CC85A3 /* Makefile */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.make; path = Makefile; sourceTree = ""; }; + 6F73EB9728C57DAD0049C1BF /* WatchClock.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = WatchClock.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 6F73EB9928C57DB00049C1BF /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 6F73EB9F28C57DB00049C1BF /* WatchClock WatchKit Extension.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = "WatchClock WatchKit Extension.appex"; sourceTree = BUILT_PRODUCTS_DIR; }; + 6F73EBA428C57DB00049C1BF /* ShipsClockApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShipsClockApp.swift; sourceTree = ""; }; + 6F73EBA628C57DB00049C1BF /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = ""; }; + 6F73EBA828C57DB00049C1BF /* NotificationController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationController.swift; sourceTree = ""; }; + 6F73EBAA28C57DB00049C1BF /* NotificationView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationView.swift; sourceTree = ""; }; + 6F73EBAC28C57DB00049C1BF /* ComplicationController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ComplicationController.swift; sourceTree = ""; }; + 6F73EBAE28C57DB10049C1BF /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 6F73EBB128C57DB10049C1BF /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = ""; }; + 6F73EBB328C57DB10049C1BF /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 6F73EBB428C57DB10049C1BF /* PushNotificationPayload.apns */ = {isa = PBXFileReference; lastKnownFileType = text; path = PushNotificationPayload.apns; sourceTree = ""; }; 6F77AF03244FDD4E0070DB57 /* ShipsClock.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShipsClock.swift; sourceTree = ""; }; 6F7DAC20259430830053E24C /* LocationFormatterTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocationFormatterTest.swift; sourceTree = ""; }; 6F7DAC25259431510053E24C /* LocationFormatter.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LocationFormatter.swift; sourceTree = ""; }; @@ -182,6 +230,13 @@ /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ + 6F73EB9C28C57DB00049C1BF /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; 6FE9AFA6243F9CA8002B45BA /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; @@ -227,6 +282,38 @@ path = ELPmpp02; sourceTree = ""; }; + 6F73EB9828C57DAD0049C1BF /* WatchClock */ = { + isa = PBXGroup; + children = ( + 6F73EB9928C57DB00049C1BF /* Assets.xcassets */, + ); + path = WatchClock; + sourceTree = ""; + }; + 6F73EBA328C57DB00049C1BF /* WatchClock WatchKit Extension */ = { + isa = PBXGroup; + children = ( + 6F73EBA428C57DB00049C1BF /* ShipsClockApp.swift */, + 6F73EBA628C57DB00049C1BF /* ContentView.swift */, + 6F73EBA828C57DB00049C1BF /* NotificationController.swift */, + 6F73EBAA28C57DB00049C1BF /* NotificationView.swift */, + 6F73EBAC28C57DB00049C1BF /* ComplicationController.swift */, + 6F73EBAE28C57DB10049C1BF /* Assets.xcassets */, + 6F73EBB328C57DB10049C1BF /* Info.plist */, + 6F73EBB428C57DB10049C1BF /* PushNotificationPayload.apns */, + 6F73EBB028C57DB10049C1BF /* Preview Content */, + ); + path = "WatchClock WatchKit Extension"; + sourceTree = ""; + }; + 6F73EBB028C57DB10049C1BF /* Preview Content */ = { + isa = PBXGroup; + children = ( + 6F73EBB128C57DB10049C1BF /* Preview Assets.xcassets */, + ); + path = "Preview Content"; + sourceTree = ""; + }; 6FE9AFA0243F9CA8002B45BA = { isa = PBXGroup; children = ( @@ -237,6 +324,10 @@ 6F24FDAC245F8EC10006590A /* ShipsClock.app */, 6F94CAC828C4DDA700941D26 /* ShipsClockTests.xctest */, 6F94CAC928C4DDA700941D26 /* ShipsClockUITests.xctest */, + 6F73EB9728C57DAD0049C1BF /* WatchClock.app */, + 6F73EB9828C57DAD0049C1BF /* WatchClock */, + 6F73EB9F28C57DB00049C1BF /* WatchClock WatchKit Extension.appex */, + 6F73EBA328C57DB00049C1BF /* WatchClock WatchKit Extension */, ); sourceTree = ""; }; @@ -320,6 +411,40 @@ /* End PBXGroup section */ /* Begin PBXNativeTarget section */ + 6F73EB9628C57DAD0049C1BF /* WatchClock */ = { + isa = PBXNativeTarget; + buildConfigurationList = 6F73EBBE28C57DB10049C1BF /* Build configuration list for PBXNativeTarget "WatchClock" */; + buildPhases = ( + 6F73EB9528C57DAD0049C1BF /* Resources */, + 6F73EBBA28C57DB10049C1BF /* Embed App Extensions */, + ); + buildRules = ( + ); + dependencies = ( + 6F73EBA228C57DB00049C1BF /* PBXTargetDependency */, + ); + name = WatchClock; + productName = WatchClock; + productReference = 6F73EB9728C57DAD0049C1BF /* WatchClock.app */; + productType = "com.apple.product-type.application.watchapp2"; + }; + 6F73EB9E28C57DB00049C1BF /* WatchClock WatchKit Extension */ = { + isa = PBXNativeTarget; + buildConfigurationList = 6F73EBBD28C57DB10049C1BF /* Build configuration list for PBXNativeTarget "WatchClock WatchKit Extension" */; + buildPhases = ( + 6F73EB9B28C57DB00049C1BF /* Sources */, + 6F73EB9C28C57DB00049C1BF /* Frameworks */, + 6F73EB9D28C57DB00049C1BF /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "WatchClock WatchKit Extension"; + productName = "WatchClock WatchKit Extension"; + productReference = 6F73EB9F28C57DB00049C1BF /* WatchClock WatchKit Extension.appex */; + productType = "com.apple.product-type.watchkit2-extension"; + }; 6FE9AFA8243F9CA8002B45BA /* ShipsClock */ = { isa = PBXNativeTarget; buildConfigurationList = 6FE9AFD3243F9CAA002B45BA /* Build configuration list for PBXNativeTarget "ShipsClock" */; @@ -334,6 +459,7 @@ buildRules = ( ); dependencies = ( + 6F73EBB628C57DB10049C1BF /* PBXTargetDependency */, ); name = ShipsClock; productName = ShipsClock; @@ -386,6 +512,12 @@ LastUpgradeCheck = 1210; ORGANIZATIONNAME = "Douglas Lovell"; TargetAttributes = { + 6F73EB9628C57DAD0049C1BF = { + CreatedOnToolsVersion = 13.4.1; + }; + 6F73EB9E28C57DB00049C1BF = { + CreatedOnToolsVersion = 13.4.1; + }; 6FE9AFA8243F9CA8002B45BA = { CreatedOnToolsVersion = 11.4; }; @@ -416,11 +548,30 @@ 6FE9AFA8243F9CA8002B45BA /* ShipsClock */, 6FE9AFBE243F9CAA002B45BA /* ShipsClockTests */, 6FE9AFC9243F9CAA002B45BA /* ShipsClockUITests */, + 6F73EB9628C57DAD0049C1BF /* WatchClock */, + 6F73EB9E28C57DB00049C1BF /* WatchClock WatchKit Extension */, ); }; /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ + 6F73EB9528C57DAD0049C1BF /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 6F73EB9A28C57DB00049C1BF /* Assets.xcassets in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 6F73EB9D28C57DB00049C1BF /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 6F73EBB228C57DB10049C1BF /* Preview Assets.xcassets in Resources */, + 6F73EBAF28C57DB10049C1BF /* Assets.xcassets in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; 6FE9AFA7243F9CA8002B45BA /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; @@ -452,6 +603,18 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ + 6F73EB9B28C57DB00049C1BF /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 6F73EBA928C57DB00049C1BF /* NotificationController.swift in Sources */, + 6F73EBA728C57DB00049C1BF /* ContentView.swift in Sources */, + 6F73EBAD28C57DB00049C1BF /* ComplicationController.swift in Sources */, + 6F73EBA528C57DB00049C1BF /* ShipsClockApp.swift in Sources */, + 6F73EBAB28C57DB00049C1BF /* NotificationView.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; 6FE9AFA5243F9CA8002B45BA /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; @@ -523,6 +686,16 @@ /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ + 6F73EBA228C57DB00049C1BF /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 6F73EB9E28C57DB00049C1BF /* WatchClock WatchKit Extension */; + targetProxy = 6F73EBA128C57DB00049C1BF /* PBXContainerItemProxy */; + }; + 6F73EBB628C57DB10049C1BF /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 6F73EB9628C57DAD0049C1BF /* WatchClock */; + targetProxy = 6F73EBB528C57DB10049C1BF /* PBXContainerItemProxy */; + }; 6FE9AFC1243F9CAA002B45BA /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 6FE9AFA8243F9CA8002B45BA /* ShipsClock */; @@ -547,6 +720,128 @@ /* End PBXVariantGroup section */ /* Begin XCBuildConfiguration section */ + 6F73EBB828C57DB10049C1BF /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; + CODE_SIGN_IDENTITY = "Apple Development"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = 9QGTTGV2S5; + GENERATE_INFOPLIST_FILE = YES; + IBSC_MODULE = WatchClock_WatchKit_Extension; + INFOPLIST_KEY_CFBundleDisplayName = WatchClock; + INFOPLIST_KEY_UISupportedInterfaceOrientations = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown"; + INFOPLIST_KEY_WKCompanionAppBundleIdentifier = com.wbreeze.ShipsClock; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.wbreeze.ShipsClock.watchkitapp; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = watchos; + SKIP_INSTALL = YES; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = 4; + WATCHOS_DEPLOYMENT_TARGET = 8.5; + }; + name = Debug; + }; + 6F73EBB928C57DB10049C1BF /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; + CODE_SIGN_IDENTITY = "Apple Development"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = 9QGTTGV2S5; + GENERATE_INFOPLIST_FILE = YES; + IBSC_MODULE = WatchClock_WatchKit_Extension; + INFOPLIST_KEY_CFBundleDisplayName = WatchClock; + INFOPLIST_KEY_UISupportedInterfaceOrientations = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown"; + INFOPLIST_KEY_WKCompanionAppBundleIdentifier = com.wbreeze.ShipsClock; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.wbreeze.ShipsClock.watchkitapp; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = watchos; + SKIP_INSTALL = YES; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = 4; + WATCHOS_DEPLOYMENT_TARGET = 8.5; + }; + name = Release; + }; + 6F73EBBB28C57DB10049C1BF /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_COMPLICATION_NAME = Complication; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_ASSET_PATHS = "\"WatchClock WatchKit Extension/Preview Content\""; + DEVELOPMENT_TEAM = 9QGTTGV2S5; + ENABLE_PREVIEWS = YES; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = "WatchClock WatchKit Extension/Info.plist"; + INFOPLIST_KEY_CFBundleDisplayName = "WatchClock WatchKit Extension"; + INFOPLIST_KEY_CLKComplicationPrincipalClass = WatchClock_WatchKit_Extension.ComplicationController; + INFOPLIST_KEY_NSHumanReadableCopyright = "Copyright © 2022 Douglas Lovell. All rights reserved."; + INFOPLIST_KEY_WKRunsIndependentlyOfCompanionApp = YES; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@executable_path/../../Frameworks", + ); + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.wbreeze.ShipsClock.watchkitapp.watchkitextension; + PRODUCT_NAME = "${TARGET_NAME}"; + SDKROOT = watchos; + SKIP_INSTALL = YES; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = 4; + WATCHOS_DEPLOYMENT_TARGET = 8.5; + }; + name = Debug; + }; + 6F73EBBC28C57DB10049C1BF /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_COMPLICATION_NAME = Complication; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_ASSET_PATHS = "\"WatchClock WatchKit Extension/Preview Content\""; + DEVELOPMENT_TEAM = 9QGTTGV2S5; + ENABLE_PREVIEWS = YES; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = "WatchClock WatchKit Extension/Info.plist"; + INFOPLIST_KEY_CFBundleDisplayName = "WatchClock WatchKit Extension"; + INFOPLIST_KEY_CLKComplicationPrincipalClass = WatchClock_WatchKit_Extension.ComplicationController; + INFOPLIST_KEY_NSHumanReadableCopyright = "Copyright © 2022 Douglas Lovell. All rights reserved."; + INFOPLIST_KEY_WKRunsIndependentlyOfCompanionApp = YES; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@executable_path/../../Frameworks", + ); + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.wbreeze.ShipsClock.watchkitapp.watchkitextension; + PRODUCT_NAME = "${TARGET_NAME}"; + SDKROOT = watchos; + SKIP_INSTALL = YES; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = 4; + WATCHOS_DEPLOYMENT_TARGET = 8.5; + }; + name = Release; + }; 6FE9AFD1243F9CAA002B45BA /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { @@ -807,6 +1102,24 @@ /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ + 6F73EBBD28C57DB10049C1BF /* Build configuration list for PBXNativeTarget "WatchClock WatchKit Extension" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 6F73EBBB28C57DB10049C1BF /* Debug */, + 6F73EBBC28C57DB10049C1BF /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 6F73EBBE28C57DB10049C1BF /* Build configuration list for PBXNativeTarget "WatchClock" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 6F73EBB828C57DB10049C1BF /* Debug */, + 6F73EBB928C57DB10049C1BF /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; 6FE9AFA4243F9CA8002B45BA /* Build configuration list for PBXProject "ShipsClock" */ = { isa = XCConfigurationList; buildConfigurations = ( diff --git a/WatchClock WatchKit Extension/Assets.xcassets/Complication.complicationset/Circular.imageset/Contents.json b/WatchClock WatchKit Extension/Assets.xcassets/Complication.complicationset/Circular.imageset/Contents.json new file mode 100644 index 0000000..26454ca --- /dev/null +++ b/WatchClock WatchKit Extension/Assets.xcassets/Complication.complicationset/Circular.imageset/Contents.json @@ -0,0 +1,25 @@ +{ + "images" : [ + { + "idiom" : "watch", + "scale" : "2x" + }, + { + "idiom" : "watch", + "scale" : "2x", + "screen-width" : "<=145" + }, + { + "idiom" : "watch", + "scale" : "2x", + "screen-width" : ">183" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "auto-scaling" : "auto" + } +} diff --git a/WatchClock WatchKit Extension/Assets.xcassets/Complication.complicationset/Contents.json b/WatchClock WatchKit Extension/Assets.xcassets/Complication.complicationset/Contents.json new file mode 100644 index 0000000..e8b3252 --- /dev/null +++ b/WatchClock WatchKit Extension/Assets.xcassets/Complication.complicationset/Contents.json @@ -0,0 +1,53 @@ +{ + "assets" : [ + { + "filename" : "Circular.imageset", + "idiom" : "watch", + "role" : "circular" + }, + { + "filename" : "Extra Large.imageset", + "idiom" : "watch", + "role" : "extra-large" + }, + { + "filename" : "Graphic Bezel.imageset", + "idiom" : "watch", + "role" : "graphic-bezel" + }, + { + "filename" : "Graphic Circular.imageset", + "idiom" : "watch", + "role" : "graphic-circular" + }, + { + "filename" : "Graphic Corner.imageset", + "idiom" : "watch", + "role" : "graphic-corner" + }, + { + "filename" : "Graphic Extra Large.imageset", + "idiom" : "watch", + "role" : "graphic-extra-large" + }, + { + "filename" : "Graphic Large Rectangular.imageset", + "idiom" : "watch", + "role" : "graphic-large-rectangular" + }, + { + "filename" : "Modular.imageset", + "idiom" : "watch", + "role" : "modular" + }, + { + "filename" : "Utilitarian.imageset", + "idiom" : "watch", + "role" : "utilitarian" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/WatchClock WatchKit Extension/Assets.xcassets/Complication.complicationset/Extra Large.imageset/Contents.json b/WatchClock WatchKit Extension/Assets.xcassets/Complication.complicationset/Extra Large.imageset/Contents.json new file mode 100644 index 0000000..26454ca --- /dev/null +++ b/WatchClock WatchKit Extension/Assets.xcassets/Complication.complicationset/Extra Large.imageset/Contents.json @@ -0,0 +1,25 @@ +{ + "images" : [ + { + "idiom" : "watch", + "scale" : "2x" + }, + { + "idiom" : "watch", + "scale" : "2x", + "screen-width" : "<=145" + }, + { + "idiom" : "watch", + "scale" : "2x", + "screen-width" : ">183" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "auto-scaling" : "auto" + } +} diff --git a/WatchClock WatchKit Extension/Assets.xcassets/Complication.complicationset/Graphic Bezel.imageset/Contents.json b/WatchClock WatchKit Extension/Assets.xcassets/Complication.complicationset/Graphic Bezel.imageset/Contents.json new file mode 100644 index 0000000..6e184db --- /dev/null +++ b/WatchClock WatchKit Extension/Assets.xcassets/Complication.complicationset/Graphic Bezel.imageset/Contents.json @@ -0,0 +1,20 @@ +{ + "images" : [ + { + "idiom" : "watch", + "scale" : "2x" + }, + { + "idiom" : "watch", + "scale" : "2x", + "screen-width" : ">183" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "auto-scaling" : "auto" + } +} diff --git a/WatchClock WatchKit Extension/Assets.xcassets/Complication.complicationset/Graphic Circular.imageset/Contents.json b/WatchClock WatchKit Extension/Assets.xcassets/Complication.complicationset/Graphic Circular.imageset/Contents.json new file mode 100644 index 0000000..6e184db --- /dev/null +++ b/WatchClock WatchKit Extension/Assets.xcassets/Complication.complicationset/Graphic Circular.imageset/Contents.json @@ -0,0 +1,20 @@ +{ + "images" : [ + { + "idiom" : "watch", + "scale" : "2x" + }, + { + "idiom" : "watch", + "scale" : "2x", + "screen-width" : ">183" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "auto-scaling" : "auto" + } +} diff --git a/WatchClock WatchKit Extension/Assets.xcassets/Complication.complicationset/Graphic Corner.imageset/Contents.json b/WatchClock WatchKit Extension/Assets.xcassets/Complication.complicationset/Graphic Corner.imageset/Contents.json new file mode 100644 index 0000000..6e184db --- /dev/null +++ b/WatchClock WatchKit Extension/Assets.xcassets/Complication.complicationset/Graphic Corner.imageset/Contents.json @@ -0,0 +1,20 @@ +{ + "images" : [ + { + "idiom" : "watch", + "scale" : "2x" + }, + { + "idiom" : "watch", + "scale" : "2x", + "screen-width" : ">183" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "auto-scaling" : "auto" + } +} diff --git a/WatchClock WatchKit Extension/Assets.xcassets/Complication.complicationset/Graphic Extra Large.imageset/Contents.json b/WatchClock WatchKit Extension/Assets.xcassets/Complication.complicationset/Graphic Extra Large.imageset/Contents.json new file mode 100644 index 0000000..26454ca --- /dev/null +++ b/WatchClock WatchKit Extension/Assets.xcassets/Complication.complicationset/Graphic Extra Large.imageset/Contents.json @@ -0,0 +1,25 @@ +{ + "images" : [ + { + "idiom" : "watch", + "scale" : "2x" + }, + { + "idiom" : "watch", + "scale" : "2x", + "screen-width" : "<=145" + }, + { + "idiom" : "watch", + "scale" : "2x", + "screen-width" : ">183" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "auto-scaling" : "auto" + } +} diff --git a/WatchClock WatchKit Extension/Assets.xcassets/Complication.complicationset/Graphic Large Rectangular.imageset/Contents.json b/WatchClock WatchKit Extension/Assets.xcassets/Complication.complicationset/Graphic Large Rectangular.imageset/Contents.json new file mode 100644 index 0000000..6e184db --- /dev/null +++ b/WatchClock WatchKit Extension/Assets.xcassets/Complication.complicationset/Graphic Large Rectangular.imageset/Contents.json @@ -0,0 +1,20 @@ +{ + "images" : [ + { + "idiom" : "watch", + "scale" : "2x" + }, + { + "idiom" : "watch", + "scale" : "2x", + "screen-width" : ">183" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "auto-scaling" : "auto" + } +} diff --git a/WatchClock WatchKit Extension/Assets.xcassets/Complication.complicationset/Modular.imageset/Contents.json b/WatchClock WatchKit Extension/Assets.xcassets/Complication.complicationset/Modular.imageset/Contents.json new file mode 100644 index 0000000..26454ca --- /dev/null +++ b/WatchClock WatchKit Extension/Assets.xcassets/Complication.complicationset/Modular.imageset/Contents.json @@ -0,0 +1,25 @@ +{ + "images" : [ + { + "idiom" : "watch", + "scale" : "2x" + }, + { + "idiom" : "watch", + "scale" : "2x", + "screen-width" : "<=145" + }, + { + "idiom" : "watch", + "scale" : "2x", + "screen-width" : ">183" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "auto-scaling" : "auto" + } +} diff --git a/WatchClock WatchKit Extension/Assets.xcassets/Complication.complicationset/Utilitarian.imageset/Contents.json b/WatchClock WatchKit Extension/Assets.xcassets/Complication.complicationset/Utilitarian.imageset/Contents.json new file mode 100644 index 0000000..26454ca --- /dev/null +++ b/WatchClock WatchKit Extension/Assets.xcassets/Complication.complicationset/Utilitarian.imageset/Contents.json @@ -0,0 +1,25 @@ +{ + "images" : [ + { + "idiom" : "watch", + "scale" : "2x" + }, + { + "idiom" : "watch", + "scale" : "2x", + "screen-width" : "<=145" + }, + { + "idiom" : "watch", + "scale" : "2x", + "screen-width" : ">183" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "auto-scaling" : "auto" + } +} diff --git a/WatchClock WatchKit Extension/Assets.xcassets/Contents.json b/WatchClock WatchKit Extension/Assets.xcassets/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/WatchClock WatchKit Extension/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/WatchClock WatchKit Extension/ComplicationController.swift b/WatchClock WatchKit Extension/ComplicationController.swift new file mode 100644 index 0000000..3f4e26f --- /dev/null +++ b/WatchClock WatchKit Extension/ComplicationController.swift @@ -0,0 +1,71 @@ +// + // WatchClock WatchKit Extension + // Created by Douglas Lovell on 4/9/22. + // Copyright © 2022 Douglas Lovell + /* + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + + +import ClockKit + + +class ComplicationController: NSObject, CLKComplicationDataSource { + + // MARK: - Complication Configuration + + func getComplicationDescriptors(handler: @escaping ([CLKComplicationDescriptor]) -> Void) { + let descriptors = [ + CLKComplicationDescriptor(identifier: "complication", displayName: "ShipsClock", supportedFamilies: CLKComplicationFamily.allCases) + // Multiple complication support can be added here with more descriptors + ] + + // Call the handler with the currently supported complication descriptors + handler(descriptors) + } + + func handleSharedComplicationDescriptors(_ complicationDescriptors: [CLKComplicationDescriptor]) { + // Do any necessary work to support these newly shared complication descriptors + } + + // MARK: - Timeline Configuration + + func getTimelineEndDate(for complication: CLKComplication, withHandler handler: @escaping (Date?) -> Void) { + // Call the handler with the last entry date you can currently provide or nil if you can't support future timelines + handler(nil) + } + + func getPrivacyBehavior(for complication: CLKComplication, withHandler handler: @escaping (CLKComplicationPrivacyBehavior) -> Void) { + // Call the handler with your desired behavior when the device is locked + handler(.showOnLockScreen) + } + + // MARK: - Timeline Population + + func getCurrentTimelineEntry(for complication: CLKComplication, withHandler handler: @escaping (CLKComplicationTimelineEntry?) -> Void) { + // Call the handler with the current timeline entry + handler(nil) + } + + func getTimelineEntries(for complication: CLKComplication, after date: Date, limit: Int, withHandler handler: @escaping ([CLKComplicationTimelineEntry]?) -> Void) { + // Call the handler with the timeline entries after the given date + handler(nil) + } + + // MARK: - Sample Templates + + func getLocalizableSampleTemplate(for complication: CLKComplication, withHandler handler: @escaping (CLKComplicationTemplate?) -> Void) { + // This method will be called once per supported complication, and the results will be cached + handler(nil) + } +} diff --git a/WatchClock WatchKit Extension/ContentView.swift b/WatchClock WatchKit Extension/ContentView.swift new file mode 100644 index 0000000..26b6835 --- /dev/null +++ b/WatchClock WatchKit Extension/ContentView.swift @@ -0,0 +1,33 @@ +// + // WatchClock WatchKit Extension + // Created by Douglas Lovell on 4/9/22. + // Copyright © 2022 Douglas Lovell + /* + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + + +import SwiftUI + +struct ContentView: View { + var body: some View { + Text("Hello, World!") + .padding() + } +} + +struct ContentView_Previews: PreviewProvider { + static var previews: some View { + ContentView() + } +} diff --git a/WatchClock WatchKit Extension/Info.plist b/WatchClock WatchKit Extension/Info.plist new file mode 100644 index 0000000..0f4498c --- /dev/null +++ b/WatchClock WatchKit Extension/Info.plist @@ -0,0 +1,16 @@ + + + + + NSExtension + + NSExtensionAttributes + + WKAppBundleIdentifier + com.wbreeze.ShipsClock.watchkitapp + + NSExtensionPointIdentifier + com.apple.watchkit + + + diff --git a/WatchClock WatchKit Extension/NotificationController.swift b/WatchClock WatchKit Extension/NotificationController.swift new file mode 100644 index 0000000..533594f --- /dev/null +++ b/WatchClock WatchKit Extension/NotificationController.swift @@ -0,0 +1,45 @@ +// + // WatchClock WatchKit Extension + // Created by Douglas Lovell on 4/9/22. + // Copyright © 2022 Douglas Lovell + /* + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + + +import WatchKit +import SwiftUI +import UserNotifications + +class NotificationController: WKUserNotificationHostingController { + + override var body: NotificationView { + return NotificationView() + } + + override func willActivate() { + // This method is called when watch view controller is about to be visible to user + super.willActivate() + } + + override func didDeactivate() { + // This method is called when watch view controller is no longer visible + super.didDeactivate() + } + + override func didReceive(_ notification: UNNotification) { + // This method is called when a notification needs to be presented. + // Implement it if you use a dynamic notification interface. + // Populate your dynamic notification interface as quickly as possible. + } +} diff --git a/WatchClock WatchKit Extension/NotificationView.swift b/WatchClock WatchKit Extension/NotificationView.swift new file mode 100644 index 0000000..a22f698 --- /dev/null +++ b/WatchClock WatchKit Extension/NotificationView.swift @@ -0,0 +1,32 @@ +// + // WatchClock WatchKit Extension + // Created by Douglas Lovell on 4/9/22. + // Copyright © 2022 Douglas Lovell + /* + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + + +import SwiftUI + +struct NotificationView: View { + var body: some View { + Text("Hello, World!") + } +} + +struct NotificationView_Previews: PreviewProvider { + static var previews: some View { + NotificationView() + } +} diff --git a/WatchClock WatchKit Extension/Preview Content/Preview Assets.xcassets/Contents.json b/WatchClock WatchKit Extension/Preview Content/Preview Assets.xcassets/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/WatchClock WatchKit Extension/Preview Content/Preview Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/WatchClock WatchKit Extension/PushNotificationPayload.apns b/WatchClock WatchKit Extension/PushNotificationPayload.apns new file mode 100644 index 0000000..c18b00a --- /dev/null +++ b/WatchClock WatchKit Extension/PushNotificationPayload.apns @@ -0,0 +1,20 @@ +{ + "aps": { + "alert": { + "body": "Test message", + "title": "Optional title", + "subtitle": "Optional subtitle" + }, + "category": "myCategory", + "thread-id": "5280" + }, + + "WatchKit Simulator Actions": [ + { + "title": "First Button", + "identifier": "firstButtonAction" + } + ], + + "customKey": "Use this file to define a testing payload for your notifications. The aps dictionary specifies the category, alert text and title. The WatchKit Simulator Actions array can provide info for one or more action buttons in addition to the standard Dismiss button. Any other top level keys are custom payload. If you have multiple such JSON files in your project, you'll be able to select them when choosing to debug the notification interface of your Watch App." +} diff --git a/WatchClock WatchKit Extension/ShipsClockApp.swift b/WatchClock WatchKit Extension/ShipsClockApp.swift new file mode 100644 index 0000000..85dc399 --- /dev/null +++ b/WatchClock WatchKit Extension/ShipsClockApp.swift @@ -0,0 +1,33 @@ +// + // WatchClock WatchKit Extension + // Created by Douglas Lovell on 4/9/22. + // Copyright © 2022 Douglas Lovell + /* + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + + +import SwiftUI + +@main +struct ShipsClockApp: App { + @SceneBuilder var body: some Scene { + WindowGroup { + NavigationView { + ContentView() + } + } + + WKNotificationScene(controller: NotificationController.self, category: "myCategory") + } +} From fb13737d66347b04c9fe22ef6226baec4d7ad791 Mon Sep 17 00:00:00 2001 From: Douglas Lovell Date: Sun, 4 Sep 2022 21:18:23 -0500 Subject: [PATCH 03/17] Add clock background to view --- ShipsClock.xcodeproj/project.pbxproj | 4 ++++ WatchClock WatchKit Extension/ContentView.swift | 9 +++++++-- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/ShipsClock.xcodeproj/project.pbxproj b/ShipsClock.xcodeproj/project.pbxproj index 3b72955..2b2941a 100644 --- a/ShipsClock.xcodeproj/project.pbxproj +++ b/ShipsClock.xcodeproj/project.pbxproj @@ -43,6 +43,8 @@ 6F73EBAF28C57DB10049C1BF /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 6F73EBAE28C57DB10049C1BF /* Assets.xcassets */; }; 6F73EBB228C57DB10049C1BF /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 6F73EBB128C57DB10049C1BF /* Preview Assets.xcassets */; }; 6F73EBB728C57DB10049C1BF /* WatchClock.app in Embed Watch Content */ = {isa = PBXBuildFile; fileRef = 6F73EB9728C57DAD0049C1BF /* WatchClock.app */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; + 6F73EBBF28C588B10049C1BF /* ClockGeometry.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6F6029432726F65C009359D4 /* ClockGeometry.swift */; }; + 6F73EBC028C588CD0049C1BF /* ClockBackground.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6F40411B247F47CB00B1BF5D /* ClockBackground.swift */; }; 6F77AF04244FDD4E0070DB57 /* ShipsClock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6F77AF03244FDD4E0070DB57 /* ShipsClock.swift */; }; 6F7DAC21259430830053E24C /* LocationFormatterTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6F7DAC20259430830053E24C /* LocationFormatterTest.swift */; }; 6F7DAC26259431510053E24C /* LocationFormatter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6F7DAC25259431510053E24C /* LocationFormatter.swift */; }; @@ -609,9 +611,11 @@ files = ( 6F73EBA928C57DB00049C1BF /* NotificationController.swift in Sources */, 6F73EBA728C57DB00049C1BF /* ContentView.swift in Sources */, + 6F73EBBF28C588B10049C1BF /* ClockGeometry.swift in Sources */, 6F73EBAD28C57DB00049C1BF /* ComplicationController.swift in Sources */, 6F73EBA528C57DB00049C1BF /* ShipsClockApp.swift in Sources */, 6F73EBAB28C57DB00049C1BF /* NotificationView.swift in Sources */, + 6F73EBC028C588CD0049C1BF /* ClockBackground.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/WatchClock WatchKit Extension/ContentView.swift b/WatchClock WatchKit Extension/ContentView.swift index 26b6835..22d7faf 100644 --- a/WatchClock WatchKit Extension/ContentView.swift +++ b/WatchClock WatchKit Extension/ContentView.swift @@ -21,8 +21,13 @@ import SwiftUI struct ContentView: View { var body: some View { - Text("Hello, World!") - .padding() + GeometryReader { geometry in + let currentDiameter = ClockGeometry.diameter(geometry) + ZStack { + let currentRadius = ClockGeometry.radius(geometry) + ClockBackground(radius: currentRadius) + }.frame(width: currentDiameter, height: currentDiameter, alignment: .top) + } } } From 97f15ea4f2daa2879eadd96133109657cba94acd Mon Sep 17 00:00:00 2001 From: Douglas Lovell Date: Sun, 4 Sep 2022 21:25:20 -0500 Subject: [PATCH 04/17] Refactor base class for clock model --- ShipsClock.xcodeproj/project.pbxproj | 6 ++++++ ShipsClock/ClockModel.swift | 25 +++++++++++++++++++++++++ ShipsClock/ShipsClock.swift | 11 +++++------ 3 files changed, 36 insertions(+), 6 deletions(-) create mode 100644 ShipsClock/ClockModel.swift diff --git a/ShipsClock.xcodeproj/project.pbxproj b/ShipsClock.xcodeproj/project.pbxproj index 2b2941a..eec7393 100644 --- a/ShipsClock.xcodeproj/project.pbxproj +++ b/ShipsClock.xcodeproj/project.pbxproj @@ -45,6 +45,8 @@ 6F73EBB728C57DB10049C1BF /* WatchClock.app in Embed Watch Content */ = {isa = PBXBuildFile; fileRef = 6F73EB9728C57DAD0049C1BF /* WatchClock.app */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; 6F73EBBF28C588B10049C1BF /* ClockGeometry.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6F6029432726F65C009359D4 /* ClockGeometry.swift */; }; 6F73EBC028C588CD0049C1BF /* ClockBackground.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6F40411B247F47CB00B1BF5D /* ClockBackground.swift */; }; + 6F73EBC328C594880049C1BF /* ClockModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6F73EBC228C594880049C1BF /* ClockModel.swift */; }; + 6F73EBC528C595260049C1BF /* ClockModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6F73EBC228C594880049C1BF /* ClockModel.swift */; }; 6F77AF04244FDD4E0070DB57 /* ShipsClock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6F77AF03244FDD4E0070DB57 /* ShipsClock.swift */; }; 6F7DAC21259430830053E24C /* LocationFormatterTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6F7DAC20259430830053E24C /* LocationFormatterTest.swift */; }; 6F7DAC26259431510053E24C /* LocationFormatter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6F7DAC25259431510053E24C /* LocationFormatter.swift */; }; @@ -202,6 +204,7 @@ 6F73EBB128C57DB10049C1BF /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = ""; }; 6F73EBB328C57DB10049C1BF /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 6F73EBB428C57DB10049C1BF /* PushNotificationPayload.apns */ = {isa = PBXFileReference; lastKnownFileType = text; path = PushNotificationPayload.apns; sourceTree = ""; }; + 6F73EBC228C594880049C1BF /* ClockModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ClockModel.swift; sourceTree = ""; }; 6F77AF03244FDD4E0070DB57 /* ShipsClock.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShipsClock.swift; sourceTree = ""; }; 6F7DAC20259430830053E24C /* LocationFormatterTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocationFormatterTest.swift; sourceTree = ""; }; 6F7DAC25259431510053E24C /* LocationFormatter.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LocationFormatter.swift; sourceTree = ""; }; @@ -347,6 +350,7 @@ 6F8FEC98246C4FE000A1FAE7 /* SituationDisplay.swift */, 6FE9AFAE243F9CA8002B45BA /* SceneDelegate.swift */, 6F77AF03244FDD4E0070DB57 /* ShipsClock.swift */, + 6F73EBC228C594880049C1BF /* ClockModel.swift */, 6FCCEE872497051A00F18212 /* CelestialComputer.swift */, 6FAC63B7256C1EF800C2C834 /* MoonPhase.swift */, 6FCCEE84249652D800F18212 /* SunCalculator.swift */, @@ -610,6 +614,7 @@ buildActionMask = 2147483647; files = ( 6F73EBA928C57DB00049C1BF /* NotificationController.swift in Sources */, + 6F73EBC528C595260049C1BF /* ClockModel.swift in Sources */, 6F73EBA728C57DB00049C1BF /* ContentView.swift in Sources */, 6F73EBBF28C588B10049C1BF /* ClockGeometry.swift in Sources */, 6F73EBAD28C57DB00049C1BF /* ComplicationController.swift in Sources */, @@ -633,6 +638,7 @@ 6F8FEC97246C1F9F00A1FAE7 /* LocationTracker.swift in Sources */, 6FE9AFAD243F9CA8002B45BA /* AppDelegate.swift in Sources */, 6F24FD9E245D2D6A0006590A /* ShipsBell.swift in Sources */, + 6F73EBC328C594880049C1BF /* ClockModel.swift in Sources */, 6F5F631A24D1E4B900172BC4 /* MoonCalculator.swift in Sources */, 6F40411C247F47CB00B1BF5D /* ClockBackground.swift in Sources */, 6F8FEC8F2469B3D300A1FAE7 /* TimerRinger.swift in Sources */, diff --git a/ShipsClock/ClockModel.swift b/ShipsClock/ClockModel.swift new file mode 100644 index 0000000..37f4962 --- /dev/null +++ b/ShipsClock/ClockModel.swift @@ -0,0 +1,25 @@ +// + // ShipsClock + // Created by Douglas Lovell on 4/9/22. + // Copyright © 2022 Douglas Lovell + /* + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + + +import Foundation + +class ClockModel : ObservableObject { + @Published var timeOfDayInSeconds = 0 + @Published var utcTimeInSeconds = 0 +} diff --git a/ShipsClock/ShipsClock.swift b/ShipsClock/ShipsClock.swift index c2e277a..40f78e4 100644 --- a/ShipsClock/ShipsClock.swift +++ b/ShipsClock/ShipsClock.swift @@ -11,9 +11,7 @@ import Foundation /*: Application model for the Ships Clock */ -class ShipsClock : ObservableObject { - @Published var timeOfDayInSeconds = 0 - @Published var utcTimeInSeconds = 0 +class ShipsClock : ClockModel { @Published var locationTracker: LocationTracker @Published var celestialComputer: CelestialComputer @@ -24,14 +22,15 @@ class ShipsClock : ObservableObject { private let tickInterval = 1.0 // seconds - init() { - timeOfDayInSeconds = ShipsClock.nextTime() - utcTimeInSeconds = ShipsClock.utcTime() + override init() { foregroundRinger = TimerRinger(bell: bell) backgroundRinger = NotifierRinger(bell: bell) let lt = LocationTracker() locationTracker = lt celestialComputer = CelestialComputer(locationTracker: lt) + super.init() + timeOfDayInSeconds = ShipsClock.nextTime() + utcTimeInSeconds = ShipsClock.utcTime() } func prepareForStart() { From 47ba9a02f68175b0358b3b7d9fb8fdac355c1e5d Mon Sep 17 00:00:00 2001 From: Douglas Lovell Date: Sun, 4 Sep 2022 21:55:57 -0500 Subject: [PATCH 05/17] Lift timer and time update from ShipsClock to ClockModel --- ShipsClock/ClockHands.swift | 6 ++--- ShipsClock/ClockModel.swift | 51 +++++++++++++++++++++++++++++++++++++ ShipsClock/ShipsClock.swift | 46 +++++---------------------------- 3 files changed, 61 insertions(+), 42 deletions(-) diff --git a/ShipsClock/ClockHands.swift b/ShipsClock/ClockHands.swift index 8114cf9..d920afd 100644 --- a/ShipsClock/ClockHands.swift +++ b/ShipsClock/ClockHands.swift @@ -9,7 +9,7 @@ import SwiftUI struct ClockHands: View { - @EnvironmentObject var shipsClock: ShipsClock + @EnvironmentObject var shipsClock: ClockModel var radius : Double var body: some View { @@ -118,13 +118,13 @@ struct ClockHands: View { return Circle() .size(width: centerSize, height: centerSize) .offset(x: offset, y: offset) - .fill(Color(UIColor.systemBackground)) + .fill(Color(UIColor.clear)) } } } struct ClockHands_Previews: PreviewProvider { static var previews: some View { - ClockHands(radius: 200.0).environmentObject(ShipsClock()) + ClockHands(radius: 200.0).environmentObject(ClockModel()) } } diff --git a/ShipsClock/ClockModel.swift b/ShipsClock/ClockModel.swift index 37f4962..00e003a 100644 --- a/ShipsClock/ClockModel.swift +++ b/ShipsClock/ClockModel.swift @@ -22,4 +22,55 @@ import Foundation class ClockModel : ObservableObject { @Published var timeOfDayInSeconds = 0 @Published var utcTimeInSeconds = 0 + + private var ticker: Timer? + + private let tickInterval = 1.0 // seconds + + init() { + timeOfDayInSeconds = ClockModel.nextTime() + utcTimeInSeconds = ClockModel.utcTime() + } + + func moveToForeground() { + updateClock() // right away, not at next tick + ticker = Timer.scheduledTimer(withTimeInterval: tickInterval, repeats: true, block: updateTimeCallback) + } + + func moveToBackground() { + ticker?.invalidate() + } + + private func updateTimeCallback(_: Timer) { + updateClock() + } + + func updateClock() { + timeOfDayInSeconds = ClockModel.nextTime() + utcTimeInSeconds = ClockModel.utcTime() + } + + fileprivate static func timeInSeconds(_ cal: Calendar) -> Int { + let now = Date() + let hms = cal.dateComponents([.hour, .minute, .second], from: now) + return timeInSeconds(hms) + } + + fileprivate static func timeInSeconds(_ hms: DateComponents) -> Int { + if let hour = hms.hour, let minute = hms.minute, let second = hms.second { + return (hour * 60 + minute) * 60 + second + } else { + return 0 + } + } + + static func nextTime() -> Int { + return timeInSeconds(Calendar.current) + } + + static func utcTime() -> Int { + var cal = Calendar.current + cal.timeZone = TimeZone.init(secondsFromGMT: 0) ?? TimeZone.current + return timeInSeconds(cal) + } } diff --git a/ShipsClock/ShipsClock.swift b/ShipsClock/ShipsClock.swift index 40f78e4..d2ffe1d 100644 --- a/ShipsClock/ShipsClock.swift +++ b/ShipsClock/ShipsClock.swift @@ -29,8 +29,6 @@ class ShipsClock : ClockModel { locationTracker = lt celestialComputer = CelestialComputer(locationTracker: lt) super.init() - timeOfDayInSeconds = ShipsClock.nextTime() - utcTimeInSeconds = ShipsClock.utcTime() } func prepareForStart() { @@ -44,52 +42,22 @@ class ShipsClock : ClockModel { backgroundRinger.disableNotifications() } - func moveToForeground() { + override func moveToForeground() { + super.moveToForeground() backgroundRinger.disableNotifications() - foregroundRinger.initializeLastPlayed(forTimeInSeconds: ShipsClock.nextTime()) - updateClock() // right away, not at next tick - ticker = Timer.scheduledTimer(withTimeInterval: tickInterval, repeats: true, block: updateTimeCallback) + foregroundRinger.initializeLastPlayed(forTimeInSeconds: timeOfDayInSeconds) locationTracker.activate() } - func moveToBackground() { - ticker?.invalidate() + override func moveToBackground() { + super.moveToBackground() backgroundRinger.scheduleBellNotificationsIfAuthorized() locationTracker.deactivate() } - private func updateTimeCallback(_: Timer) { - updateClock() - } - - private func updateClock() { - timeOfDayInSeconds = ShipsClock.nextTime() - utcTimeInSeconds = ShipsClock.utcTime() + override func updateClock() { + super.updateClock() celestialComputer.maybeUpdateTheSky(timeOfDayInSeconds: timeOfDayInSeconds) foregroundRinger.maybeRing(forTimeInSeconds: timeOfDayInSeconds) } - - fileprivate static func timeInSeconds(_ hms: DateComponents) -> Int { - if let hour = hms.hour, let minute = hms.minute, let second = hms.second { - return (hour * 60 + minute) * 60 + second - } else { - return 0 - } - } - - fileprivate static func timeInSeconds(_ cal: Calendar) -> Int { - let now = Date() - let hms = cal.dateComponents([.hour, .minute, .second], from: now) - return timeInSeconds(hms) - } - - private static func nextTime() -> Int { - return timeInSeconds(Calendar.current) - } - - private static func utcTime() -> Int { - var cal = Calendar.current - cal.timeZone = TimeZone.init(secondsFromGMT: 0) ?? TimeZone.current - return timeInSeconds(cal) - } } From a3dce5f83e4aa8fc27ea8ea8190f0c8e9ad32b92 Mon Sep 17 00:00:00 2001 From: Douglas Lovell Date: Sun, 4 Sep 2022 21:56:23 -0500 Subject: [PATCH 06/17] Add hands to watch view --- ShipsClock.xcodeproj/project.pbxproj | 2 ++ WatchClock WatchKit Extension/ContentView.swift | 5 ++++- WatchClock WatchKit Extension/ShipsClockApp.swift | 2 +- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/ShipsClock.xcodeproj/project.pbxproj b/ShipsClock.xcodeproj/project.pbxproj index eec7393..920dbfa 100644 --- a/ShipsClock.xcodeproj/project.pbxproj +++ b/ShipsClock.xcodeproj/project.pbxproj @@ -47,6 +47,7 @@ 6F73EBC028C588CD0049C1BF /* ClockBackground.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6F40411B247F47CB00B1BF5D /* ClockBackground.swift */; }; 6F73EBC328C594880049C1BF /* ClockModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6F73EBC228C594880049C1BF /* ClockModel.swift */; }; 6F73EBC528C595260049C1BF /* ClockModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6F73EBC228C594880049C1BF /* ClockModel.swift */; }; + 6F73EBC628C59A3B0049C1BF /* ClockHands.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6F40411D247F47DE00B1BF5D /* ClockHands.swift */; }; 6F77AF04244FDD4E0070DB57 /* ShipsClock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6F77AF03244FDD4E0070DB57 /* ShipsClock.swift */; }; 6F7DAC21259430830053E24C /* LocationFormatterTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6F7DAC20259430830053E24C /* LocationFormatterTest.swift */; }; 6F7DAC26259431510053E24C /* LocationFormatter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6F7DAC25259431510053E24C /* LocationFormatter.swift */; }; @@ -614,6 +615,7 @@ buildActionMask = 2147483647; files = ( 6F73EBA928C57DB00049C1BF /* NotificationController.swift in Sources */, + 6F73EBC628C59A3B0049C1BF /* ClockHands.swift in Sources */, 6F73EBC528C595260049C1BF /* ClockModel.swift in Sources */, 6F73EBA728C57DB00049C1BF /* ContentView.swift in Sources */, 6F73EBBF28C588B10049C1BF /* ClockGeometry.swift in Sources */, diff --git a/WatchClock WatchKit Extension/ContentView.swift b/WatchClock WatchKit Extension/ContentView.swift index 22d7faf..09f2fcc 100644 --- a/WatchClock WatchKit Extension/ContentView.swift +++ b/WatchClock WatchKit Extension/ContentView.swift @@ -20,12 +20,15 @@ import SwiftUI struct ContentView: View { + @EnvironmentObject var clockModel: ClockModel + var body: some View { GeometryReader { geometry in let currentDiameter = ClockGeometry.diameter(geometry) ZStack { let currentRadius = ClockGeometry.radius(geometry) ClockBackground(radius: currentRadius) + ClockHands(radius: currentRadius).environmentObject(clockModel) }.frame(width: currentDiameter, height: currentDiameter, alignment: .top) } } @@ -33,6 +36,6 @@ struct ContentView: View { struct ContentView_Previews: PreviewProvider { static var previews: some View { - ContentView() + ContentView().environmentObject(ClockModel()) } } diff --git a/WatchClock WatchKit Extension/ShipsClockApp.swift b/WatchClock WatchKit Extension/ShipsClockApp.swift index 85dc399..937acc7 100644 --- a/WatchClock WatchKit Extension/ShipsClockApp.swift +++ b/WatchClock WatchKit Extension/ShipsClockApp.swift @@ -24,7 +24,7 @@ struct ShipsClockApp: App { @SceneBuilder var body: some Scene { WindowGroup { NavigationView { - ContentView() + ContentView().environmentObject(ClockModel()) } } From d8a9d1229d64a8a5d0f93e71e65186d29ff523ca Mon Sep 17 00:00:00 2001 From: Douglas Lovell Date: Mon, 5 Sep 2022 08:19:12 -0500 Subject: [PATCH 07/17] Offset the watch clock frame to center the clock --- WatchClock WatchKit Extension/ContentView.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/WatchClock WatchKit Extension/ContentView.swift b/WatchClock WatchKit Extension/ContentView.swift index 09f2fcc..1cf37dc 100644 --- a/WatchClock WatchKit Extension/ContentView.swift +++ b/WatchClock WatchKit Extension/ContentView.swift @@ -29,7 +29,7 @@ struct ContentView: View { let currentRadius = ClockGeometry.radius(geometry) ClockBackground(radius: currentRadius) ClockHands(radius: currentRadius).environmentObject(clockModel) - }.frame(width: currentDiameter, height: currentDiameter, alignment: .top) + }.frame(width: currentDiameter, height: currentDiameter).offset(x:CGFloat((geometry.size.width - currentDiameter) / 2.0), y:CGFloat(4.0 + (geometry.size.height - currentDiameter) / 2.0)) } } } From 585f45cecb3653da75094c7848bba76821a8b659 Mon Sep 17 00:00:00 2001 From: Douglas Lovell Date: Mon, 5 Sep 2022 08:23:54 -0500 Subject: [PATCH 08/17] Add small watch size preview --- WatchClock WatchKit Extension/ContentView.swift | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/WatchClock WatchKit Extension/ContentView.swift b/WatchClock WatchKit Extension/ContentView.swift index 1cf37dc..be9fa64 100644 --- a/WatchClock WatchKit Extension/ContentView.swift +++ b/WatchClock WatchKit Extension/ContentView.swift @@ -36,6 +36,10 @@ struct ContentView: View { struct ContentView_Previews: PreviewProvider { static var previews: some View { - ContentView().environmentObject(ClockModel()) + let model = ClockModel() + Group { + ContentView().previewDevice("Apple Watch Series 5 - 40mm").environmentObject(model) + ContentView().previewDevice("Apple Watch Series 7 - 45mm").environmentObject(model) + } } } From 6a0ee062b0609e2d808365370a71da6d2addc613 Mon Sep 17 00:00:00 2001 From: Douglas Lovell Date: Mon, 5 Sep 2022 17:33:21 -0500 Subject: [PATCH 09/17] Rename the watch app extension main file --- ShipsClock.xcodeproj/project.pbxproj | 12 ++++++++---- .../{ShipsClockApp.swift => WatchClockApp.swift} | 2 +- 2 files changed, 9 insertions(+), 5 deletions(-) rename WatchClock WatchKit Extension/{ShipsClockApp.swift => WatchClockApp.swift} (97%) diff --git a/ShipsClock.xcodeproj/project.pbxproj b/ShipsClock.xcodeproj/project.pbxproj index 920dbfa..cdae7d7 100644 --- a/ShipsClock.xcodeproj/project.pbxproj +++ b/ShipsClock.xcodeproj/project.pbxproj @@ -35,7 +35,7 @@ 6F6029442726F65C009359D4 /* ClockGeometry.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6F6029432726F65C009359D4 /* ClockGeometry.swift */; }; 6F73EB9A28C57DB00049C1BF /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 6F73EB9928C57DB00049C1BF /* Assets.xcassets */; }; 6F73EBA028C57DB00049C1BF /* WatchClock WatchKit Extension.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = 6F73EB9F28C57DB00049C1BF /* WatchClock WatchKit Extension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; - 6F73EBA528C57DB00049C1BF /* ShipsClockApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6F73EBA428C57DB00049C1BF /* ShipsClockApp.swift */; }; + 6F73EBA528C57DB00049C1BF /* WatchClockApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6F73EBA428C57DB00049C1BF /* WatchClockApp.swift */; }; 6F73EBA728C57DB00049C1BF /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6F73EBA628C57DB00049C1BF /* ContentView.swift */; }; 6F73EBA928C57DB00049C1BF /* NotificationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6F73EBA828C57DB00049C1BF /* NotificationController.swift */; }; 6F73EBAB28C57DB00049C1BF /* NotificationView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6F73EBAA28C57DB00049C1BF /* NotificationView.swift */; }; @@ -48,6 +48,8 @@ 6F73EBC328C594880049C1BF /* ClockModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6F73EBC228C594880049C1BF /* ClockModel.swift */; }; 6F73EBC528C595260049C1BF /* ClockModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6F73EBC228C594880049C1BF /* ClockModel.swift */; }; 6F73EBC628C59A3B0049C1BF /* ClockHands.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6F40411D247F47DE00B1BF5D /* ClockHands.swift */; }; + 6F73EBC728C6AEDB0049C1BF /* ShipsBell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6F24FD9D245D2D6A0006590A /* ShipsBell.swift */; }; + 6F73EBC828C6AF220049C1BF /* TimerRinger.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6F8FEC8E2469B3D300A1FAE7 /* TimerRinger.swift */; }; 6F77AF04244FDD4E0070DB57 /* ShipsClock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6F77AF03244FDD4E0070DB57 /* ShipsClock.swift */; }; 6F7DAC21259430830053E24C /* LocationFormatterTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6F7DAC20259430830053E24C /* LocationFormatterTest.swift */; }; 6F7DAC26259431510053E24C /* LocationFormatter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6F7DAC25259431510053E24C /* LocationFormatter.swift */; }; @@ -196,7 +198,7 @@ 6F73EB9728C57DAD0049C1BF /* WatchClock.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = WatchClock.app; sourceTree = BUILT_PRODUCTS_DIR; }; 6F73EB9928C57DB00049C1BF /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 6F73EB9F28C57DB00049C1BF /* WatchClock WatchKit Extension.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = "WatchClock WatchKit Extension.appex"; sourceTree = BUILT_PRODUCTS_DIR; }; - 6F73EBA428C57DB00049C1BF /* ShipsClockApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShipsClockApp.swift; sourceTree = ""; }; + 6F73EBA428C57DB00049C1BF /* WatchClockApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WatchClockApp.swift; sourceTree = ""; }; 6F73EBA628C57DB00049C1BF /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = ""; }; 6F73EBA828C57DB00049C1BF /* NotificationController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationController.swift; sourceTree = ""; }; 6F73EBAA28C57DB00049C1BF /* NotificationView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationView.swift; sourceTree = ""; }; @@ -299,7 +301,7 @@ 6F73EBA328C57DB00049C1BF /* WatchClock WatchKit Extension */ = { isa = PBXGroup; children = ( - 6F73EBA428C57DB00049C1BF /* ShipsClockApp.swift */, + 6F73EBA428C57DB00049C1BF /* WatchClockApp.swift */, 6F73EBA628C57DB00049C1BF /* ContentView.swift */, 6F73EBA828C57DB00049C1BF /* NotificationController.swift */, 6F73EBAA28C57DB00049C1BF /* NotificationView.swift */, @@ -614,14 +616,16 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 6F73EBC728C6AEDB0049C1BF /* ShipsBell.swift in Sources */, 6F73EBA928C57DB00049C1BF /* NotificationController.swift in Sources */, 6F73EBC628C59A3B0049C1BF /* ClockHands.swift in Sources */, 6F73EBC528C595260049C1BF /* ClockModel.swift in Sources */, 6F73EBA728C57DB00049C1BF /* ContentView.swift in Sources */, 6F73EBBF28C588B10049C1BF /* ClockGeometry.swift in Sources */, 6F73EBAD28C57DB00049C1BF /* ComplicationController.swift in Sources */, - 6F73EBA528C57DB00049C1BF /* ShipsClockApp.swift in Sources */, + 6F73EBA528C57DB00049C1BF /* WatchClockApp.swift in Sources */, 6F73EBAB28C57DB00049C1BF /* NotificationView.swift in Sources */, + 6F73EBC828C6AF220049C1BF /* TimerRinger.swift in Sources */, 6F73EBC028C588CD0049C1BF /* ClockBackground.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; diff --git a/WatchClock WatchKit Extension/ShipsClockApp.swift b/WatchClock WatchKit Extension/WatchClockApp.swift similarity index 97% rename from WatchClock WatchKit Extension/ShipsClockApp.swift rename to WatchClock WatchKit Extension/WatchClockApp.swift index 937acc7..7e2616f 100644 --- a/WatchClock WatchKit Extension/ShipsClockApp.swift +++ b/WatchClock WatchKit Extension/WatchClockApp.swift @@ -20,7 +20,7 @@ import SwiftUI @main -struct ShipsClockApp: App { +struct WatchClockApp: App { @SceneBuilder var body: some Scene { WindowGroup { NavigationView { From 608020e3a2ce78c338af9049e5d647e5581ff601 Mon Sep 17 00:00:00 2001 From: Douglas Lovell Date: Tue, 6 Sep 2022 09:10:26 -0500 Subject: [PATCH 10/17] Add bell to watch in foreground --- ShipsClock.xcodeproj/project.pbxproj | 8 +++-- ShipsClock/ClockFace.swift | 6 ++-- ShipsClock/ClockHands.swift | 10 +++--- ShipsClock/ContentView.swift | 4 +-- ShipsClock/WatchClock.swift | 35 +++++++++++++++++++ .../ContentView.swift | 6 ++-- .../WatchClockApp.swift | 2 +- 7 files changed, 55 insertions(+), 16 deletions(-) create mode 100644 ShipsClock/WatchClock.swift diff --git a/ShipsClock.xcodeproj/project.pbxproj b/ShipsClock.xcodeproj/project.pbxproj index cdae7d7..0bc4937 100644 --- a/ShipsClock.xcodeproj/project.pbxproj +++ b/ShipsClock.xcodeproj/project.pbxproj @@ -50,6 +50,7 @@ 6F73EBC628C59A3B0049C1BF /* ClockHands.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6F40411D247F47DE00B1BF5D /* ClockHands.swift */; }; 6F73EBC728C6AEDB0049C1BF /* ShipsBell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6F24FD9D245D2D6A0006590A /* ShipsBell.swift */; }; 6F73EBC828C6AF220049C1BF /* TimerRinger.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6F8FEC8E2469B3D300A1FAE7 /* TimerRinger.swift */; }; + 6F73EBCA28C6B3650049C1BF /* WatchClock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6F73EBC928C6B3650049C1BF /* WatchClock.swift */; }; 6F77AF04244FDD4E0070DB57 /* ShipsClock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6F77AF03244FDD4E0070DB57 /* ShipsClock.swift */; }; 6F7DAC21259430830053E24C /* LocationFormatterTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6F7DAC20259430830053E24C /* LocationFormatterTest.swift */; }; 6F7DAC26259431510053E24C /* LocationFormatter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6F7DAC25259431510053E24C /* LocationFormatter.swift */; }; @@ -208,6 +209,7 @@ 6F73EBB328C57DB10049C1BF /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 6F73EBB428C57DB10049C1BF /* PushNotificationPayload.apns */ = {isa = PBXFileReference; lastKnownFileType = text; path = PushNotificationPayload.apns; sourceTree = ""; }; 6F73EBC228C594880049C1BF /* ClockModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ClockModel.swift; sourceTree = ""; }; + 6F73EBC928C6B3650049C1BF /* WatchClock.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = WatchClock.swift; path = ShipsClock/WatchClock.swift; sourceTree = SOURCE_ROOT; }; 6F77AF03244FDD4E0070DB57 /* ShipsClock.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShipsClock.swift; sourceTree = ""; }; 6F7DAC20259430830053E24C /* LocationFormatterTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocationFormatterTest.swift; sourceTree = ""; }; 6F7DAC25259431510053E24C /* LocationFormatter.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LocationFormatter.swift; sourceTree = ""; }; @@ -301,6 +303,7 @@ 6F73EBA328C57DB00049C1BF /* WatchClock WatchKit Extension */ = { isa = PBXGroup; children = ( + 6F73EBC928C6B3650049C1BF /* WatchClock.swift */, 6F73EBA428C57DB00049C1BF /* WatchClockApp.swift */, 6F73EBA628C57DB00049C1BF /* ContentView.swift */, 6F73EBA828C57DB00049C1BF /* NotificationController.swift */, @@ -622,6 +625,7 @@ 6F73EBC528C595260049C1BF /* ClockModel.swift in Sources */, 6F73EBA728C57DB00049C1BF /* ContentView.swift in Sources */, 6F73EBBF28C588B10049C1BF /* ClockGeometry.swift in Sources */, + 6F73EBCA28C6B3650049C1BF /* WatchClock.swift in Sources */, 6F73EBAD28C57DB00049C1BF /* ComplicationController.swift in Sources */, 6F73EBA528C57DB00049C1BF /* WatchClockApp.swift in Sources */, 6F73EBAB28C57DB00049C1BF /* NotificationView.swift in Sources */, @@ -986,7 +990,7 @@ DEVELOPMENT_TEAM = 9QGTTGV2S5; ENABLE_PREVIEWS = YES; INFOPLIST_FILE = ShipsClock/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; + IPHONEOS_DEPLOYMENT_TARGET = 13.6; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -1012,7 +1016,7 @@ DEVELOPMENT_TEAM = 9QGTTGV2S5; ENABLE_PREVIEWS = YES; INFOPLIST_FILE = ShipsClock/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; + IPHONEOS_DEPLOYMENT_TARGET = 13.6; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", diff --git a/ShipsClock/ClockFace.swift b/ShipsClock/ClockFace.swift index 8bd3a0a..5225cbc 100644 --- a/ShipsClock/ClockFace.swift +++ b/ShipsClock/ClockFace.swift @@ -9,7 +9,7 @@ import SwiftUI struct ClockFace: View { - @EnvironmentObject var shipsClock: ShipsClock + @ObservedObject var shipsClock: ShipsClock var body: some View { GeometryReader { geometry in @@ -20,7 +20,7 @@ struct ClockFace: View { ClockUTC(radius: currentRadius).environmentObject(self.shipsClock) ClockSun(radius: currentRadius).environmentObject(self.shipsClock.celestialComputer) ClockMoon(radius: currentRadius).environmentObject(self.shipsClock.celestialComputer) - ClockHands(radius: currentRadius).environmentObject(self.shipsClock) + ClockHands(clockModel: self.shipsClock, radius: currentRadius) }.frame(width: currentDiameter, height: currentDiameter, alignment: .top) } } @@ -28,6 +28,6 @@ struct ClockFace: View { struct ClockFace_Previews: PreviewProvider { static var previews: some View { - ClockFace().environmentObject(ShipsClock()) + ClockFace(shipsClock: ShipsClock()) } } diff --git a/ShipsClock/ClockHands.swift b/ShipsClock/ClockHands.swift index d920afd..eb960c1 100644 --- a/ShipsClock/ClockHands.swift +++ b/ShipsClock/ClockHands.swift @@ -9,17 +9,17 @@ import SwiftUI struct ClockHands: View { - @EnvironmentObject var shipsClock: ClockModel + @ObservedObject var clockModel: ClockModel var radius : Double var body: some View { ZStack { MinuteHand( - radius: self.radius, timeInSeconds: self.shipsClock.timeOfDayInSeconds) + radius: self.radius, timeInSeconds: clockModel.timeOfDayInSeconds) HourHand( - radius: self.radius, timeInSeconds: self.shipsClock.timeOfDayInSeconds) + radius: self.radius, timeInSeconds: clockModel.timeOfDayInSeconds) WatchHand( - radius: self.radius, timeInSeconds: self.shipsClock.timeOfDayInSeconds) + radius: self.radius, timeInSeconds: clockModel.timeOfDayInSeconds) CenterCircle(radius: self.radius) } } @@ -125,6 +125,6 @@ struct ClockHands: View { struct ClockHands_Previews: PreviewProvider { static var previews: some View { - ClockHands(radius: 200.0).environmentObject(ClockModel()) + ClockHands(clockModel: ClockModel(), radius: 200.0) } } diff --git a/ShipsClock/ContentView.swift b/ShipsClock/ContentView.swift index 6338f27..5be2599 100644 --- a/ShipsClock/ContentView.swift +++ b/ShipsClock/ContentView.swift @@ -16,7 +16,7 @@ struct ContentView: View { var body: some View { VStack { - ClockFace() + ClockFace(shipsClock: shipsClock) SituationDisplay(displayWidth: displaySize) .environmentObject(shipsClock.locationTracker) } @@ -30,7 +30,7 @@ struct ContentView: View { var body: some View { HStack(alignment: .top, spacing: nil) { - ClockFace() + ClockFace(shipsClock: shipsClock) SituationDisplay(displayWidth: displaySize) .environmentObject(shipsClock.locationTracker) } diff --git a/ShipsClock/WatchClock.swift b/ShipsClock/WatchClock.swift new file mode 100644 index 0000000..1fd05f2 --- /dev/null +++ b/ShipsClock/WatchClock.swift @@ -0,0 +1,35 @@ +// + // WatchClock WatchKit Extension + // Created by Douglas Lovell on 5/9/22. + // Copyright © 2022 Douglas Lovell + /* + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + + +import Foundation + +class WatchClock : ClockModel { + private var bell = ShipsBell() + private var foregroundRinger: TimerRinger + + override init() { + foregroundRinger = TimerRinger(bell: bell) + super.init() + } + + override func updateClock() { + super.updateClock() + foregroundRinger.maybeRing(forTimeInSeconds: timeOfDayInSeconds) + } +} diff --git a/WatchClock WatchKit Extension/ContentView.swift b/WatchClock WatchKit Extension/ContentView.swift index be9fa64..b3f3762 100644 --- a/WatchClock WatchKit Extension/ContentView.swift +++ b/WatchClock WatchKit Extension/ContentView.swift @@ -20,7 +20,7 @@ import SwiftUI struct ContentView: View { - @EnvironmentObject var clockModel: ClockModel + @EnvironmentObject var clockModel: WatchClock var body: some View { GeometryReader { geometry in @@ -28,7 +28,7 @@ struct ContentView: View { ZStack { let currentRadius = ClockGeometry.radius(geometry) ClockBackground(radius: currentRadius) - ClockHands(radius: currentRadius).environmentObject(clockModel) + ClockHands(clockModel: clockModel, radius: currentRadius) }.frame(width: currentDiameter, height: currentDiameter).offset(x:CGFloat((geometry.size.width - currentDiameter) / 2.0), y:CGFloat(4.0 + (geometry.size.height - currentDiameter) / 2.0)) } } @@ -36,7 +36,7 @@ struct ContentView: View { struct ContentView_Previews: PreviewProvider { static var previews: some View { - let model = ClockModel() + let model = WatchClock() Group { ContentView().previewDevice("Apple Watch Series 5 - 40mm").environmentObject(model) ContentView().previewDevice("Apple Watch Series 7 - 45mm").environmentObject(model) diff --git a/WatchClock WatchKit Extension/WatchClockApp.swift b/WatchClock WatchKit Extension/WatchClockApp.swift index 7e2616f..e06a1e4 100644 --- a/WatchClock WatchKit Extension/WatchClockApp.swift +++ b/WatchClock WatchKit Extension/WatchClockApp.swift @@ -24,7 +24,7 @@ struct WatchClockApp: App { @SceneBuilder var body: some Scene { WindowGroup { NavigationView { - ContentView().environmentObject(ClockModel()) + ContentView().environmentObject(WatchClock()) } } From 8b381fbcfe7d395e74f801b387b3d151e85fd9d6 Mon Sep 17 00:00:00 2001 From: Douglas Lovell Date: Wed, 7 Sep 2022 19:16:01 -0500 Subject: [PATCH 11/17] Tap into lifecycle to tick clock --- ShipsClock.xcodeproj/project.pbxproj | 6 ++--- ShipsClock/WatchClock.swift | 5 ++++ .../WatchClockApp.swift | 24 ++++++++++++++++++- 3 files changed, 31 insertions(+), 4 deletions(-) diff --git a/ShipsClock.xcodeproj/project.pbxproj b/ShipsClock.xcodeproj/project.pbxproj index 0bc4937..ee5156a 100644 --- a/ShipsClock.xcodeproj/project.pbxproj +++ b/ShipsClock.xcodeproj/project.pbxproj @@ -303,8 +303,8 @@ 6F73EBA328C57DB00049C1BF /* WatchClock WatchKit Extension */ = { isa = PBXGroup; children = ( - 6F73EBC928C6B3650049C1BF /* WatchClock.swift */, 6F73EBA428C57DB00049C1BF /* WatchClockApp.swift */, + 6F73EBC928C6B3650049C1BF /* WatchClock.swift */, 6F73EBA628C57DB00049C1BF /* ContentView.swift */, 6F73EBA828C57DB00049C1BF /* NotificationController.swift */, 6F73EBAA28C57DB00049C1BF /* NotificationView.swift */, @@ -368,6 +368,7 @@ 6F7DAC25259431510053E24C /* LocationFormatter.swift */, 6F24FD9D245D2D6A0006590A /* ShipsBell.swift */, 6F8FEC8E2469B3D300A1FAE7 /* TimerRinger.swift */, + 6F24FDAF246708860006590A /* NotifierRinger.swift */, 6F6029432726F65C009359D4 /* ClockGeometry.swift */, 6FE9AFDE243FBB79002B45BA /* ClockFace.swift */, 6F40411F2485DB4700B1BF5D /* ClockSun.swift */, @@ -375,12 +376,11 @@ 6F37A35E27339E190016A38C /* ClockUTC.swift */, 6F40411B247F47CB00B1BF5D /* ClockBackground.swift */, 6F40411D247F47DE00B1BF5D /* ClockHands.swift */, + 6F093CA926CFF7DA0091A4B7 /* ClockConfiguration.swift */, 6FE9AFB2243F9CAA002B45BA /* Assets.xcassets */, 6FE9AFB7243F9CAA002B45BA /* LaunchScreen.storyboard */, 6FE9AFBA243F9CAA002B45BA /* Info.plist */, 6FE9AFB4243F9CAA002B45BA /* Preview Content */, - 6F24FDAF246708860006590A /* NotifierRinger.swift */, - 6F093CA926CFF7DA0091A4B7 /* ClockConfiguration.swift */, ); path = ShipsClock; sourceTree = ""; diff --git a/ShipsClock/WatchClock.swift b/ShipsClock/WatchClock.swift index 1fd05f2..65a21eb 100644 --- a/ShipsClock/WatchClock.swift +++ b/ShipsClock/WatchClock.swift @@ -28,6 +28,11 @@ class WatchClock : ClockModel { super.init() } + override func moveToForeground() { + foregroundRinger.initializeLastPlayed(forTimeInSeconds: timeOfDayInSeconds) + super.moveToForeground() + } + override func updateClock() { super.updateClock() foregroundRinger.maybeRing(forTimeInSeconds: timeOfDayInSeconds) diff --git a/WatchClock WatchKit Extension/WatchClockApp.swift b/WatchClock WatchKit Extension/WatchClockApp.swift index e06a1e4..791fc2f 100644 --- a/WatchClock WatchKit Extension/WatchClockApp.swift +++ b/WatchClock WatchKit Extension/WatchClockApp.swift @@ -21,10 +21,32 @@ import SwiftUI @main struct WatchClockApp: App { + @Environment(\.scenePhase) private var scenePhase + let clockModel = WatchClock() + @SceneBuilder var body: some Scene { WindowGroup { NavigationView { - ContentView().environmentObject(WatchClock()) + ContentView().environmentObject(clockModel).onChange(of: scenePhase) { phase in + switch phase { + case .active: + // The app has become active. + print("State: active") + clockModel.moveToForeground() + break + case .inactive: + // The app has become inactive. + print("State: inactive") + break + case .background: + // The app has moved to the background. + print("State: background") + clockModel.moveToBackground() + break + @unknown default: + fatalError("WatchClock has entered an unknown state.") + } + } } } From 8b035aefe132d63035e84d38fa9a361bc36a5449 Mon Sep 17 00:00:00 2001 From: Douglas Lovell Date: Fri, 9 Sep 2022 23:33:04 -0500 Subject: [PATCH 12/17] Add sound files to watch app --- ShipsClock.xcodeproj/project.pbxproj | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ShipsClock.xcodeproj/project.pbxproj b/ShipsClock.xcodeproj/project.pbxproj index ee5156a..2262f94 100644 --- a/ShipsClock.xcodeproj/project.pbxproj +++ b/ShipsClock.xcodeproj/project.pbxproj @@ -55,6 +55,7 @@ 6F7DAC21259430830053E24C /* LocationFormatterTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6F7DAC20259430830053E24C /* LocationFormatterTest.swift */; }; 6F7DAC26259431510053E24C /* LocationFormatter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6F7DAC25259431510053E24C /* LocationFormatter.swift */; }; 6F7DAC27259431510053E24C /* LocationFormatter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6F7DAC25259431510053E24C /* LocationFormatter.swift */; }; + 6F86FA3828CAC664003F7B0C /* sounds in Resources */ = {isa = PBXBuildFile; fileRef = 6F24FDA3245E48480006590A /* sounds */; }; 6F8FEC8F2469B3D300A1FAE7 /* TimerRinger.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6F8FEC8E2469B3D300A1FAE7 /* TimerRinger.swift */; }; 6F8FEC97246C1F9F00A1FAE7 /* LocationTracker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6F8FEC96246C1F9F00A1FAE7 /* LocationTracker.swift */; }; 6F8FEC99246C4FE000A1FAE7 /* SituationDisplay.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6F8FEC98246C4FE000A1FAE7 /* SituationDisplay.swift */; }; @@ -581,6 +582,7 @@ files = ( 6F73EBB228C57DB10049C1BF /* Preview Assets.xcassets in Resources */, 6F73EBAF28C57DB10049C1BF /* Assets.xcassets in Resources */, + 6F86FA3828CAC664003F7B0C /* sounds in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; From 64557b2ddd9f40d2a93d60d2c74fb4b7e80bf18e Mon Sep 17 00:00:00 2001 From: Douglas Lovell Date: Mon, 21 Nov 2022 20:05:51 -0300 Subject: [PATCH 13/17] Remove life cycle print statements --- WatchClock WatchKit Extension/WatchClockApp.swift | 6 ------ 1 file changed, 6 deletions(-) diff --git a/WatchClock WatchKit Extension/WatchClockApp.swift b/WatchClock WatchKit Extension/WatchClockApp.swift index 791fc2f..e656273 100644 --- a/WatchClock WatchKit Extension/WatchClockApp.swift +++ b/WatchClock WatchKit Extension/WatchClockApp.swift @@ -30,17 +30,11 @@ struct WatchClockApp: App { ContentView().environmentObject(clockModel).onChange(of: scenePhase) { phase in switch phase { case .active: - // The app has become active. - print("State: active") clockModel.moveToForeground() break case .inactive: - // The app has become inactive. - print("State: inactive") break case .background: - // The app has moved to the background. - print("State: background") clockModel.moveToBackground() break @unknown default: From 9daa3eabde5f0629fa5c0fd27732266c770d8576 Mon Sep 17 00:00:00 2001 From: Douglas Lovell Date: Wed, 23 Nov 2022 12:38:10 -0300 Subject: [PATCH 14/17] Agree Watch and iOS versions and bump for TestFlight distribution --- ShipsClock.xcodeproj/project.pbxproj | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/ShipsClock.xcodeproj/project.pbxproj b/ShipsClock.xcodeproj/project.pbxproj index 8988823..45c6c1f 100644 --- a/ShipsClock.xcodeproj/project.pbxproj +++ b/ShipsClock.xcodeproj/project.pbxproj @@ -751,14 +751,14 @@ CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; + CURRENT_PROJECT_VERSION = 9; DEVELOPMENT_TEAM = 9QGTTGV2S5; GENERATE_INFOPLIST_FILE = YES; IBSC_MODULE = WatchClock_WatchKit_Extension; INFOPLIST_KEY_CFBundleDisplayName = WatchClock; INFOPLIST_KEY_UISupportedInterfaceOrientations = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown"; INFOPLIST_KEY_WKCompanionAppBundleIdentifier = com.wbreeze.ShipsClock; - MARKETING_VERSION = 1.0; + MARKETING_VERSION = 1.2.1; PRODUCT_BUNDLE_IDENTIFIER = com.wbreeze.ShipsClock.watchkitapp; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = watchos; @@ -779,14 +779,14 @@ CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; + CURRENT_PROJECT_VERSION = 9; DEVELOPMENT_TEAM = 9QGTTGV2S5; GENERATE_INFOPLIST_FILE = YES; IBSC_MODULE = WatchClock_WatchKit_Extension; INFOPLIST_KEY_CFBundleDisplayName = WatchClock; INFOPLIST_KEY_UISupportedInterfaceOrientations = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown"; INFOPLIST_KEY_WKCompanionAppBundleIdentifier = com.wbreeze.ShipsClock; - MARKETING_VERSION = 1.0; + MARKETING_VERSION = 1.2.1; PRODUCT_BUNDLE_IDENTIFIER = com.wbreeze.ShipsClock.watchkitapp; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = watchos; @@ -804,7 +804,7 @@ ASSETCATALOG_COMPILER_COMPLICATION_NAME = Complication; CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; + CURRENT_PROJECT_VERSION = 9; DEVELOPMENT_ASSET_PATHS = "\"WatchClock WatchKit Extension/Preview Content\""; DEVELOPMENT_TEAM = 9QGTTGV2S5; ENABLE_PREVIEWS = YES; @@ -819,7 +819,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 1.0; + MARKETING_VERSION = 1.2.1; PRODUCT_BUNDLE_IDENTIFIER = com.wbreeze.ShipsClock.watchkitapp.watchkitextension; PRODUCT_NAME = "${TARGET_NAME}"; SDKROOT = watchos; @@ -837,7 +837,7 @@ ASSETCATALOG_COMPILER_COMPLICATION_NAME = Complication; CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; + CURRENT_PROJECT_VERSION = 9; DEVELOPMENT_ASSET_PATHS = "\"WatchClock WatchKit Extension/Preview Content\""; DEVELOPMENT_TEAM = 9QGTTGV2S5; ENABLE_PREVIEWS = YES; @@ -852,7 +852,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 1.0; + MARKETING_VERSION = 1.2.1; PRODUCT_BUNDLE_IDENTIFIER = com.wbreeze.ShipsClock.watchkitapp.watchkitextension; PRODUCT_NAME = "${TARGET_NAME}"; SDKROOT = watchos; @@ -987,7 +987,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 8; + CURRENT_PROJECT_VERSION = 9; DEVELOPMENT_ASSET_PATHS = "\"ShipsClock/Preview Content\""; DEVELOPMENT_TEAM = 9QGTTGV2S5; ENABLE_PREVIEWS = YES; @@ -997,7 +997,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.1.4; + MARKETING_VERSION = 1.2.1; PRODUCT_BUNDLE_IDENTIFIER = com.wbreeze.ShipsClock; PRODUCT_NAME = ShipsClock; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -1013,7 +1013,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 8; + CURRENT_PROJECT_VERSION = 9; DEVELOPMENT_ASSET_PATHS = "\"ShipsClock/Preview Content\""; DEVELOPMENT_TEAM = 9QGTTGV2S5; ENABLE_PREVIEWS = YES; @@ -1023,7 +1023,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.1.4; + MARKETING_VERSION = 1.2.1; PRODUCT_BUNDLE_IDENTIFIER = com.wbreeze.ShipsClock; PRODUCT_NAME = ShipsClock; PROVISIONING_PROFILE_SPECIFIER = ""; From d33b2748175d104c68744930f23ada30d76b36c0 Mon Sep 17 00:00:00 2001 From: Douglas Lovell Date: Wed, 4 Jan 2023 21:09:24 -0300 Subject: [PATCH 15/17] Bump to 1.2.2 build 11 --- ShipsClock.xcodeproj/project.pbxproj | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/ShipsClock.xcodeproj/project.pbxproj b/ShipsClock.xcodeproj/project.pbxproj index 45c6c1f..e1d729c 100644 --- a/ShipsClock.xcodeproj/project.pbxproj +++ b/ShipsClock.xcodeproj/project.pbxproj @@ -751,14 +751,14 @@ CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 9; + CURRENT_PROJECT_VERSION = 11; DEVELOPMENT_TEAM = 9QGTTGV2S5; GENERATE_INFOPLIST_FILE = YES; IBSC_MODULE = WatchClock_WatchKit_Extension; INFOPLIST_KEY_CFBundleDisplayName = WatchClock; INFOPLIST_KEY_UISupportedInterfaceOrientations = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown"; INFOPLIST_KEY_WKCompanionAppBundleIdentifier = com.wbreeze.ShipsClock; - MARKETING_VERSION = 1.2.1; + MARKETING_VERSION = 1.2.2; PRODUCT_BUNDLE_IDENTIFIER = com.wbreeze.ShipsClock.watchkitapp; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = watchos; @@ -779,14 +779,14 @@ CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 9; + CURRENT_PROJECT_VERSION = 11; DEVELOPMENT_TEAM = 9QGTTGV2S5; GENERATE_INFOPLIST_FILE = YES; IBSC_MODULE = WatchClock_WatchKit_Extension; INFOPLIST_KEY_CFBundleDisplayName = WatchClock; INFOPLIST_KEY_UISupportedInterfaceOrientations = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown"; INFOPLIST_KEY_WKCompanionAppBundleIdentifier = com.wbreeze.ShipsClock; - MARKETING_VERSION = 1.2.1; + MARKETING_VERSION = 1.2.2; PRODUCT_BUNDLE_IDENTIFIER = com.wbreeze.ShipsClock.watchkitapp; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = watchos; @@ -987,7 +987,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 9; + CURRENT_PROJECT_VERSION = 11; DEVELOPMENT_ASSET_PATHS = "\"ShipsClock/Preview Content\""; DEVELOPMENT_TEAM = 9QGTTGV2S5; ENABLE_PREVIEWS = YES; @@ -997,7 +997,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.2.1; + MARKETING_VERSION = 1.2.2; PRODUCT_BUNDLE_IDENTIFIER = com.wbreeze.ShipsClock; PRODUCT_NAME = ShipsClock; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -1013,7 +1013,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 9; + CURRENT_PROJECT_VERSION = 11; DEVELOPMENT_ASSET_PATHS = "\"ShipsClock/Preview Content\""; DEVELOPMENT_TEAM = 9QGTTGV2S5; ENABLE_PREVIEWS = YES; @@ -1023,7 +1023,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.2.1; + MARKETING_VERSION = 1.2.2; PRODUCT_BUNDLE_IDENTIFIER = com.wbreeze.ShipsClock; PRODUCT_NAME = ShipsClock; PROVISIONING_PROFILE_SPECIFIER = ""; From f6c46a3f85a6f3b29eaddab9c8cccbbe330f8c64 Mon Sep 17 00:00:00 2001 From: Douglas Lovell Date: Wed, 4 Jan 2023 21:14:37 -0300 Subject: [PATCH 16/17] Project updates for xCode 14.2 --- ShipsClock.xcodeproj/project.pbxproj | 153 +++--------------- .../xcschemes/ShipsClock.xcscheme | 2 +- 2 files changed, 20 insertions(+), 135 deletions(-) diff --git a/ShipsClock.xcodeproj/project.pbxproj b/ShipsClock.xcodeproj/project.pbxproj index e1d729c..3840b5a 100644 --- a/ShipsClock.xcodeproj/project.pbxproj +++ b/ShipsClock.xcodeproj/project.pbxproj @@ -34,7 +34,6 @@ 6F5F631D24D481B100172BC4 /* MoonCalculator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6F5F631924D1E4B900172BC4 /* MoonCalculator.swift */; }; 6F6029442726F65C009359D4 /* ClockGeometry.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6F6029432726F65C009359D4 /* ClockGeometry.swift */; }; 6F73EB9A28C57DB00049C1BF /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 6F73EB9928C57DB00049C1BF /* Assets.xcassets */; }; - 6F73EBA028C57DB00049C1BF /* WatchClock WatchKit Extension.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = 6F73EB9F28C57DB00049C1BF /* WatchClock WatchKit Extension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; 6F73EBA528C57DB00049C1BF /* WatchClockApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6F73EBA428C57DB00049C1BF /* WatchClockApp.swift */; }; 6F73EBA728C57DB00049C1BF /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6F73EBA628C57DB00049C1BF /* ContentView.swift */; }; 6F73EBA928C57DB00049C1BF /* NotificationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6F73EBA828C57DB00049C1BF /* NotificationController.swift */; }; @@ -83,13 +82,6 @@ /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ - 6F73EBA128C57DB00049C1BF /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 6FE9AFA1243F9CA8002B45BA /* Project object */; - proxyType = 1; - remoteGlobalIDString = 6F73EB9E28C57DB00049C1BF; - remoteInfo = "WatchClock WatchKit Extension"; - }; 6F73EBB528C57DB10049C1BF /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 6FE9AFA1243F9CA8002B45BA /* Project object */; @@ -145,17 +137,6 @@ name = "Embed Frameworks"; runOnlyForDeploymentPostprocessing = 0; }; - 6F73EBBA28C57DB10049C1BF /* Embed App Extensions */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = ""; - dstSubfolderSpec = 13; - files = ( - 6F73EBA028C57DB00049C1BF /* WatchClock WatchKit Extension.appex in Embed App Extensions */, - ); - name = "Embed App Extensions"; - runOnlyForDeploymentPostprocessing = 0; - }; /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ @@ -199,7 +180,6 @@ 6F725C03255D8A8900CC85A3 /* Makefile */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.make; path = Makefile; sourceTree = ""; }; 6F73EB9728C57DAD0049C1BF /* WatchClock.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = WatchClock.app; sourceTree = BUILT_PRODUCTS_DIR; }; 6F73EB9928C57DB00049C1BF /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; - 6F73EB9F28C57DB00049C1BF /* WatchClock WatchKit Extension.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = "WatchClock WatchKit Extension.appex"; sourceTree = BUILT_PRODUCTS_DIR; }; 6F73EBA428C57DB00049C1BF /* WatchClockApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WatchClockApp.swift; sourceTree = ""; }; 6F73EBA628C57DB00049C1BF /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = ""; }; 6F73EBA828C57DB00049C1BF /* NotificationController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationController.swift; sourceTree = ""; }; @@ -338,7 +318,6 @@ 6F94CAC928C4DDA700941D26 /* ShipsClockUITests.xctest */, 6F73EB9728C57DAD0049C1BF /* WatchClock.app */, 6F73EB9828C57DAD0049C1BF /* WatchClock */, - 6F73EB9F28C57DB00049C1BF /* WatchClock WatchKit Extension.appex */, 6F73EBA328C57DB00049C1BF /* WatchClock WatchKit Extension */, ); sourceTree = ""; @@ -429,34 +408,17 @@ buildConfigurationList = 6F73EBBE28C57DB10049C1BF /* Build configuration list for PBXNativeTarget "WatchClock" */; buildPhases = ( 6F73EB9528C57DAD0049C1BF /* Resources */, - 6F73EBBA28C57DB10049C1BF /* Embed App Extensions */, + 6F73EB9B28C57DB00049C1BF /* Sources */, + 6F73EB9C28C57DB00049C1BF /* Frameworks */, ); buildRules = ( ); dependencies = ( - 6F73EBA228C57DB00049C1BF /* PBXTargetDependency */, ); name = WatchClock; productName = WatchClock; productReference = 6F73EB9728C57DAD0049C1BF /* WatchClock.app */; - productType = "com.apple.product-type.application.watchapp2"; - }; - 6F73EB9E28C57DB00049C1BF /* WatchClock WatchKit Extension */ = { - isa = PBXNativeTarget; - buildConfigurationList = 6F73EBBD28C57DB10049C1BF /* Build configuration list for PBXNativeTarget "WatchClock WatchKit Extension" */; - buildPhases = ( - 6F73EB9B28C57DB00049C1BF /* Sources */, - 6F73EB9C28C57DB00049C1BF /* Frameworks */, - 6F73EB9D28C57DB00049C1BF /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = "WatchClock WatchKit Extension"; - productName = "WatchClock WatchKit Extension"; - productReference = 6F73EB9F28C57DB00049C1BF /* WatchClock WatchKit Extension.appex */; - productType = "com.apple.product-type.watchkit2-extension"; + productType = "com.apple.product-type.application"; }; 6FE9AFA8243F9CA8002B45BA /* ShipsClock */ = { isa = PBXNativeTarget; @@ -522,15 +484,12 @@ isa = PBXProject; attributes = { LastSwiftUpdateCheck = 1340; - LastUpgradeCheck = 1410; + LastUpgradeCheck = 1420; ORGANIZATIONNAME = "Douglas Lovell"; TargetAttributes = { 6F73EB9628C57DAD0049C1BF = { CreatedOnToolsVersion = 13.4.1; }; - 6F73EB9E28C57DB00049C1BF = { - CreatedOnToolsVersion = 13.4.1; - }; 6FE9AFA8243F9CA8002B45BA = { CreatedOnToolsVersion = 11.4; }; @@ -562,27 +521,19 @@ 6FE9AFBE243F9CAA002B45BA /* ShipsClockTests */, 6FE9AFC9243F9CAA002B45BA /* ShipsClockUITests */, 6F73EB9628C57DAD0049C1BF /* WatchClock */, - 6F73EB9E28C57DB00049C1BF /* WatchClock WatchKit Extension */, ); }; /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ 6F73EB9528C57DAD0049C1BF /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 6F73EB9A28C57DB00049C1BF /* Assets.xcassets in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 6F73EB9D28C57DB00049C1BF /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( 6F73EBB228C57DB10049C1BF /* Preview Assets.xcassets in Resources */, 6F73EBAF28C57DB10049C1BF /* Assets.xcassets in Resources */, 6F86FA3828CAC664003F7B0C /* sounds in Resources */, + 6F73EB9A28C57DB00049C1BF /* Assets.xcassets in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -708,11 +659,6 @@ /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ - 6F73EBA228C57DB00049C1BF /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 6F73EB9E28C57DB00049C1BF /* WatchClock WatchKit Extension */; - targetProxy = 6F73EBA128C57DB00049C1BF /* PBXContainerItemProxy */; - }; 6F73EBB628C57DB10049C1BF /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 6F73EB9628C57DAD0049C1BF /* WatchClock */; @@ -747,6 +693,7 @@ buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_COMPLICATION_NAME = Complication; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; CODE_SIGN_IDENTITY = "Apple Development"; @@ -754,10 +701,16 @@ CURRENT_PROJECT_VERSION = 11; DEVELOPMENT_TEAM = 9QGTTGV2S5; GENERATE_INFOPLIST_FILE = YES; - IBSC_MODULE = WatchClock_WatchKit_Extension; INFOPLIST_KEY_CFBundleDisplayName = WatchClock; + INFOPLIST_KEY_CLKComplicationPrincipalClass = "$(PRODUCT_MODULE_NAME).ComplicationController"; + INFOPLIST_KEY_NSHumanReadableCopyright = "Copyright © 2022 Douglas Lovell. All rights reserved."; INFOPLIST_KEY_UISupportedInterfaceOrientations = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown"; INFOPLIST_KEY_WKCompanionAppBundleIdentifier = com.wbreeze.ShipsClock; + INFOPLIST_KEY_WKRunsIndependentlyOfCompanionApp = YES; + LD_RUNPATH_SEARCH_PATHS = ( + "@executable_path/Frameworks", + "@executable_path/../../Frameworks", + ); MARKETING_VERSION = 1.2.2; PRODUCT_BUNDLE_IDENTIFIER = com.wbreeze.ShipsClock.watchkitapp; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -775,6 +728,7 @@ buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_COMPLICATION_NAME = Complication; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; CODE_SIGN_IDENTITY = "Apple Development"; @@ -782,79 +736,19 @@ CURRENT_PROJECT_VERSION = 11; DEVELOPMENT_TEAM = 9QGTTGV2S5; GENERATE_INFOPLIST_FILE = YES; - IBSC_MODULE = WatchClock_WatchKit_Extension; INFOPLIST_KEY_CFBundleDisplayName = WatchClock; + INFOPLIST_KEY_CLKComplicationPrincipalClass = "$(PRODUCT_MODULE_NAME).ComplicationController"; + INFOPLIST_KEY_NSHumanReadableCopyright = "Copyright © 2022 Douglas Lovell. All rights reserved."; INFOPLIST_KEY_UISupportedInterfaceOrientations = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown"; INFOPLIST_KEY_WKCompanionAppBundleIdentifier = com.wbreeze.ShipsClock; - MARKETING_VERSION = 1.2.2; - PRODUCT_BUNDLE_IDENTIFIER = com.wbreeze.ShipsClock.watchkitapp; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = watchos; - SKIP_INSTALL = YES; - SWIFT_EMIT_LOC_STRINGS = YES; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = 4; - WATCHOS_DEPLOYMENT_TARGET = 8.5; - }; - name = Release; - }; - 6F73EBBB28C57DB10049C1BF /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ASSETCATALOG_COMPILER_COMPLICATION_NAME = Complication; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; - CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 9; - DEVELOPMENT_ASSET_PATHS = "\"WatchClock WatchKit Extension/Preview Content\""; - DEVELOPMENT_TEAM = 9QGTTGV2S5; - ENABLE_PREVIEWS = YES; - GENERATE_INFOPLIST_FILE = YES; - INFOPLIST_FILE = "WatchClock WatchKit Extension/Info.plist"; - INFOPLIST_KEY_CFBundleDisplayName = "WatchClock WatchKit Extension"; - INFOPLIST_KEY_CLKComplicationPrincipalClass = WatchClock_WatchKit_Extension.ComplicationController; - INFOPLIST_KEY_NSHumanReadableCopyright = "Copyright © 2022 Douglas Lovell. All rights reserved."; - INFOPLIST_KEY_WKRunsIndependentlyOfCompanionApp = YES; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@executable_path/../../Frameworks", - ); - MARKETING_VERSION = 1.2.1; - PRODUCT_BUNDLE_IDENTIFIER = com.wbreeze.ShipsClock.watchkitapp.watchkitextension; - PRODUCT_NAME = "${TARGET_NAME}"; - SDKROOT = watchos; - SKIP_INSTALL = YES; - SWIFT_EMIT_LOC_STRINGS = YES; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = 4; - WATCHOS_DEPLOYMENT_TARGET = 8.5; - }; - name = Debug; - }; - 6F73EBBC28C57DB10049C1BF /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ASSETCATALOG_COMPILER_COMPLICATION_NAME = Complication; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; - CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 9; - DEVELOPMENT_ASSET_PATHS = "\"WatchClock WatchKit Extension/Preview Content\""; - DEVELOPMENT_TEAM = 9QGTTGV2S5; - ENABLE_PREVIEWS = YES; - GENERATE_INFOPLIST_FILE = YES; - INFOPLIST_FILE = "WatchClock WatchKit Extension/Info.plist"; - INFOPLIST_KEY_CFBundleDisplayName = "WatchClock WatchKit Extension"; - INFOPLIST_KEY_CLKComplicationPrincipalClass = WatchClock_WatchKit_Extension.ComplicationController; - INFOPLIST_KEY_NSHumanReadableCopyright = "Copyright © 2022 Douglas Lovell. All rights reserved."; INFOPLIST_KEY_WKRunsIndependentlyOfCompanionApp = YES; LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 1.2.1; - PRODUCT_BUNDLE_IDENTIFIER = com.wbreeze.ShipsClock.watchkitapp.watchkitextension; - PRODUCT_NAME = "${TARGET_NAME}"; + MARKETING_VERSION = 1.2.2; + PRODUCT_BUNDLE_IDENTIFIER = com.wbreeze.ShipsClock.watchkitapp; + PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = watchos; SKIP_INSTALL = YES; SWIFT_EMIT_LOC_STRINGS = YES; @@ -1124,15 +1018,6 @@ /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ - 6F73EBBD28C57DB10049C1BF /* Build configuration list for PBXNativeTarget "WatchClock WatchKit Extension" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 6F73EBBB28C57DB10049C1BF /* Debug */, - 6F73EBBC28C57DB10049C1BF /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; 6F73EBBE28C57DB10049C1BF /* Build configuration list for PBXNativeTarget "WatchClock" */ = { isa = XCConfigurationList; buildConfigurations = ( diff --git a/ShipsClock.xcodeproj/xcshareddata/xcschemes/ShipsClock.xcscheme b/ShipsClock.xcodeproj/xcshareddata/xcschemes/ShipsClock.xcscheme index 64b40de..04ae777 100644 --- a/ShipsClock.xcodeproj/xcshareddata/xcschemes/ShipsClock.xcscheme +++ b/ShipsClock.xcodeproj/xcshareddata/xcschemes/ShipsClock.xcscheme @@ -1,6 +1,6 @@ Date: Sat, 11 Feb 2023 20:56:03 -0300 Subject: [PATCH 17/17] Remove bell sounds and notifications from watch app --- .../ContentView.swift | 4 +-- .../WatchClockApp.swift | 33 ++++++++++--------- 2 files changed, 19 insertions(+), 18 deletions(-) diff --git a/WatchClock WatchKit Extension/ContentView.swift b/WatchClock WatchKit Extension/ContentView.swift index b3f3762..9d04ef4 100644 --- a/WatchClock WatchKit Extension/ContentView.swift +++ b/WatchClock WatchKit Extension/ContentView.swift @@ -20,7 +20,7 @@ import SwiftUI struct ContentView: View { - @EnvironmentObject var clockModel: WatchClock + @EnvironmentObject var clockModel: ClockModel var body: some View { GeometryReader { geometry in @@ -36,7 +36,7 @@ struct ContentView: View { struct ContentView_Previews: PreviewProvider { static var previews: some View { - let model = WatchClock() + let model = ClockModel() Group { ContentView().previewDevice("Apple Watch Series 5 - 40mm").environmentObject(model) ContentView().previewDevice("Apple Watch Series 7 - 45mm").environmentObject(model) diff --git a/WatchClock WatchKit Extension/WatchClockApp.swift b/WatchClock WatchKit Extension/WatchClockApp.swift index e656273..d5a32c0 100644 --- a/WatchClock WatchKit Extension/WatchClockApp.swift +++ b/WatchClock WatchKit Extension/WatchClockApp.swift @@ -22,28 +22,29 @@ import SwiftUI @main struct WatchClockApp: App { @Environment(\.scenePhase) private var scenePhase - let clockModel = WatchClock() + let clockModel = ClockModel() @SceneBuilder var body: some Scene { WindowGroup { NavigationView { - ContentView().environmentObject(clockModel).onChange(of: scenePhase) { phase in - switch phase { - case .active: - clockModel.moveToForeground() - break - case .inactive: - break - case .background: - clockModel.moveToBackground() - break - @unknown default: - fatalError("WatchClock has entered an unknown state.") - } - } + ContentView().environmentObject(clockModel) +// .onChange(of: scenePhase) { phase in +// switch phase { +// case .active: +// clockModel.moveToForeground() +// break +// case .inactive: +// break +// case .background: +// clockModel.moveToBackground() +// break +// @unknown default: +// fatalError("WatchClock has entered an unknown state.") +// } +// } } } - WKNotificationScene(controller: NotificationController.self, category: "myCategory") +// WKNotificationScene(controller: NotificationController.self, category: "myCategory") } }