ΠΠ°ΠΌΠ΅ΡΠΊΠ°
ΠΠ°Π½Π½ΠΎΠ΅ ΡΡΠ΅Π±Π½ΠΎΠ΅ ΠΏΠΎΡΠΎΠ±ΠΈΠ΅ ΠΏΡΠ΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅Ρ, ΡΡΠΎ Π²Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΠ΅ Ρ ΠΎΡΡ Π±Ρ Xcode 8.3 ΠΈ Swift 3.1 (Π’Π°ΠΊΠΆΠ΅ ΠΏΡΠΎΠ²Π΅ΡΠ΅Π½ΠΎ Π½Π° Xcode 9 Beta 4 ΠΈΠ»ΠΈ Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ·Π΄Π½Π΅ΠΉ Π²Π΅ΡΡΠΈΠΈ, Swift 4 ΠΈ iOS 11)
Π Π°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΈ iOS Π»ΡΠ±ΡΡ ΠΏΡΠ΅Π΄ΡΡΠ°Π²ΠΈΡΡ ΡΠ²ΠΎΠ΅ Ρ ΠΎΡΠΎΡΠΎ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠ°Π½Π½ΠΎΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΠΊΠΎΡΠΎΡΠΎΠ΅ ΠΏΠΎΠ½ΡΠ°Π²ΠΈΡΡΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΠΌ, ΠΆΠ΅Π»Π°Ρ, ΡΡΠΎΠ±Ρ ΠΎΠ½ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π»ΠΈ Π΅Π³ΠΎ Π² ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ Π²ΡΠ΅Π³ΠΎ Π΄Π½Ρ ΠΈ ΠΊΠ°ΠΆΠ΄ΡΠΉ Π΄Π΅Π½Ρ. Π ΡΠΎΠΆΠ°Π»Π΅Π½ΠΈΡ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΎΠ², ΡΡΡΠΎΠ²Π°Ρ ΠΏΡΠ°Π²Π΄Π° Π² ΡΠΎΠΌ, ΡΡΠΎ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΠΈ Π½Π΅ ΠΌΠΎΠ³ΡΡ ΡΠ°Π±ΠΎΡΠ°ΡΡ Ρ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡΠΌΠΈ ΡΠ΅Π»ΡΠΉ Π΄Π΅Π½Ρ, ΠΈ ΠΈΠΌ ΠΏΡΠΈΡ ΠΎΠ΄ΠΈΡΡΡ Π²ΡΠ΅ΠΌΡ ΠΎΡ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ Π·Π°ΠΊΡΡΠ²Π°ΡΡ ΡΠ²ΠΎΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, ΡΡΠΎΠ±Ρ Π·Π°Π½ΡΡΡΡΡ ΡΠ²ΠΎΠΈΠΌΠΈ Π΄Π΅Π»Π°ΠΌΠΈβ¦ Π½Ρ ΠΈΠ»ΠΈ ΠΎΡΠΊΡΡΡΡ Π΄ΡΡΠ³ΠΎΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, Π¨Π£Π’ΠΠ :]
Π ΡΡΠ°ΡΡΡΡ, ΡΠ°ΠΊΠΎΠΉ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ, ΠΊΠ°ΠΊ push-ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΡ, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ°ΠΌ βΠ΄ΠΎΡΡΡΡΠ°ΡΡΡΡβ Π΄ΠΎ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ ΠΈ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡ Π½Π΅Π±ΠΎΠ»ΡΡΠΈΠ΅ Π·Π°Π΄Π°ΡΠΈ, ΠΏΡΠΈ ΡΠΎΠΌ, ΡΡΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π² ΡΡΠΎΡ ΠΌΠΎΠΌΠ΅Π½Ρ Π·Π°ΠΊΡΡΡΠΎ ΠΈ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ!
Push-ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΡ ΡΡΠ°Π½ΠΎΠ²ΡΡΡΡ Π²ΡΠ΅ Π±ΠΎΠ»Π΅Π΅ ΠΈ Π±ΠΎΠ»Π΅Π΅ ΠΌΠΎΡΠ½ΡΠΌ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΎΠΌ Ρ ΡΠΎΠ³ΠΎ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ, ΠΊΠ°ΠΊ ΠΎΠ½ΠΈ Π±ΡΠ»ΠΈ Π²ΠΏΠ΅ΡΠ²ΡΠ΅ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½Ρ.
ΠΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ push-ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΡ Π² iOS 10:
- ΠΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ ΠΊΠΎΡΠΎΡΠΊΠΎΠ³ΠΎ ΡΠ΅ΠΊΡΡΠΎΠ²ΠΎΠ³ΠΎ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ.
- ΠΠΎΡΠΏΡΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΊΠΎΡΠΎΡΠΊΠΎΠ³ΠΎ Π·Π²ΡΠΊΠΎΠ²ΠΎΠ³ΠΎ ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΡ.
- Π£ΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ ΡΠΈΡΠ»ΠΎ/Π½ΠΎΠΌΠ΅Ρ Π½Π° ΠΈΠΊΠΎΠ½ΠΊΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ.
- ΠΡΠ΅Π΄ΠΎΡΡΠ°Π²ΠΈΡΡ ΠΊΠ°ΠΊΠΈΠ΅-Π»ΠΈΠ±ΠΎ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠ΅Π΄ΠΏΡΠΈΠ½ΡΡΡ, Π½Π΅ ΠΎΡΠΊΡΡΠ²Π°Ρ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅.
- ΠΡΠΎΠ±ΡΠ°Π·ΠΈΡΡ ΠΌΠ΅Π΄ΠΈΠ°Π²Π»ΠΎΠΆΠ΅Π½ΠΈΡ
- ΠΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ βΠ±Π΅ΡΡΡΠΌΠ½ΠΎ ΡΠ°Π·Π±ΡΠ΄ΠΈΡΡβ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π² ΡΠΎΠ½ΠΎΠ²ΠΎΠΌ ΡΠ΅ΠΆΠΈΠΌΠ΅ ΠΈ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡ Π·Π°Π΄Π°ΡΡ
ΠΠ°Π½Π½ΠΎΠ΅ ΡΡΠ΅Π±Π½ΠΎΠ΅ ΠΏΠΎΡΠΎΠ±ΠΈΠ΅ Π±ΡΠ΄Π΅Ρ ΠΏΠΎΡΠ²ΡΡΠ΅Π½ΠΎ ΡΠΎΠΌΡ, ΠΊΠ°ΠΊ ΡΠ°Π±ΠΎΡΠ°ΡΡ Ρ push-ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΡΠΌΠΈ ΠΈ, ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ Π²Π°ΠΌ ΠΏΠΎΡΠ°Π±ΠΎΡΠ°ΡΡ Ρ Π½ΠΈΠΌΠΈ.
ΠΡΠ΅ΠΆΠ΄Π΅ ΡΠ΅ΠΌ ΠΏΡΠΈΡΡΡΠΏΠΈΡΡ ΠΊ ΡΠ°Π±ΠΎΡΠ΅, Π²Π°ΠΌ ΠΏΠΎΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΡΠ»Π΅Π΄ΡΡΡΠ΅Π΅:
- Π Π΅Π°Π»ΡΠ½ΡΠΉ iOS ΠΠ΅Π²Π°ΠΉΡ. Push-ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΡ Π½Π΅ ΡΠ°Π±ΠΎΡΠ°ΡΡ Π² ΡΠΈΠΌΡΠ»ΡΡΠΎΡΠ΅, ΠΏΠΎΡΡΠΎΠΌΡ Π²Π°ΠΌ ΠΏΠΎΠ½Π°Π΄ΠΎΠ±ΠΈΡΡΡ ΡΠ΅Π°Π»ΡΠ½ΠΎΠ΅ ΡΡΡΡΠΎΠΉΡΡΠ²ΠΎ.
- Π’ΡΠ΅Π±ΡΠ΅ΡΡΡ ΡΡΠ°ΡΡΠΈΠ΅ Π² ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ΅ Apple Developer Program. ΠΠ°ΡΠΈΠ½Π°Ρ Ρ Xcode 7, Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°ΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π½Π° ΡΠ²ΠΎΠ΅ΠΌ ΡΡΡΡΠΎΠΉΡΡΠ²Π΅ Π±Π΅Π· ΡΡΠ°ΡΡΠΈΡ Π² Π΄Π°Π½Π½ΠΎΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ΅. ΠΠ΄Π½Π°ΠΊΠΎ Π΄Π»Ρ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ ΠΈ ΠΎΡΠΏΡΠ°Π²ΠΊΠΈ push-ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠΉ Π²Π°ΠΌ Π²ΡΠ΅ ΡΠ°Π²Π½ΠΎ ΠΏΠΎΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°Ρ push-ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠΉ Π΄Π»Ρ Π²Π°ΡΠ΅Π³ΠΎ App ID, Π΄Π»Ρ ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ ΠΈ ΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΡΡΠ°ΡΡΠΈΠ΅ Π² ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ΅.
- ΠΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Pusher. ΠΡ Π±ΡΠ΄Π΅ΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΡΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π΄Π»Ρ ΠΎΡΠΏΡΠ°Π²ΠΊΠΈ ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠΉ Π½Π° ΡΡΡΡΠΎΠΉΡΡΠ²ΠΎ. ΠΠ»Ρ Π΅Π³ΠΎ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ ΡΠ»Π΅Π΄ΡΠΉΡΠ΅ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΡΠΌ Π·Π΄Π΅ΡΡ.
ΠΠΎΠ΅Ρ Π°Π»ΠΈ!
ΠΠ»Ρ ΠΎΡΠΏΡΠ°Π²ΠΊΠΈ ΠΈ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ push-ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΡ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡ ΡΡΠΈ ΠΎΡΠ½ΠΎΠ²Π½ΡΠ΅ Π·Π°Π΄Π°ΡΠΈ:
- ΠΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±ΡΡΡ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎ Π½Π°ΡΡΡΠΎΠ΅Π½ΠΎ ΠΈ Π·Π°ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠΎΠ²Π°Π½ΠΎ Π² Apple Push Notification Service (APNS) Π΄Π»Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ push-ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠΉ ΠΏΡΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ Π·Π°ΠΏΡΡΠΊΠ΅.
- Π‘Π΅ΡΠ²Π΅Ρ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°ΡΡ push-ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠ΅ Π² APNS, ΠΈ Π·Π°ΡΠ΅ΠΌ ΡΠΆΠ΅ APNS Π±ΡΠ΄Π΅Ρ ΠΎΡΠΏΡΠ°Π²Π»ΡΡΡ ΡΡΠΈ ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΡ Π½Π° ΠΎΠ΄Π½ΠΎ ΠΈΠ»ΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΡ ΡΡΡΡΠΎΠΉΡΡΠ².
- ΠΠ°ΡΠ΅ΠΌ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡΡΠΈΡΡ push-ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠ΅,Β ΠΏΠΎΡΠ»Π΅ ΡΡΠΎΠ³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅Ρ ΠΊΠ°ΠΊΠΈΠ΅-Π»ΠΈΠ±ΠΎ Π·Π°Π΄Π°ΡΠΈ ΠΈΠ»ΠΈ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°Π΅Ρ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΎΡΠΊΡΡΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΈΠ· ΠΏΡΠΈΡΠ΅Π΄ΡΠ΅Π³ΠΎ ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΡ), ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΠΎΠ±ΡΠ°ΡΠ½ΡΠΉ Π²ΡΠ·ΠΎΠ² Π² Π΄Π΅Π»Π΅Π³Π°ΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ.
ΠΡΠΏΡΠ°Π²ΠΊΠ° push-ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠΉ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΎΠ±ΡΠ·Π°Π½Π½ΠΎΡΡΡΡ ΡΠ΅ΡΠ²Π΅Ρ-ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ½ΠΎΠ³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, ΠΈ, ΠΊΠ°ΠΊ ΠΏΡΠ°Π²ΠΈΠ»ΠΎ, ΠΎΡ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΊ Π΄ΡΡΠ³ΠΎΠΌΡ ΠΎΠ½Π° ΡΠ΅Π°Π»ΠΈΠ·ΡΠ΅ΡΡΡ ΠΏΠΎ-ΡΠ°Π·Π½ΠΎΠΌΡ. ΠΠ½ΠΎΠ³ΠΈΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡ ΡΡΠΎΡΠΎΠ½Π½ΠΈΠ΅ ΡΠ΅ΡΠ΅Π½ΠΈΡ (Π·Π΄Π΅ΡΡ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π½Π°ΠΉΡΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ Ρ ΠΎΡΠΎΡΠΈΡ ΠΏΡΠΈΠΌΠ΅ΡΠΎΠ²) Π΄Π»Ρ ΠΎΡΠΏΡΠ°Π²ΠΊΠΈ push-ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠΉ, Π² ΡΠΎ Π²ΡΠ΅ΠΌΡ ΠΊΠ°ΠΊ Π΄ΡΡΠ³ΠΈΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡ ΡΠ²ΠΎΠΈ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΠ΅ ΡΠ΅ΡΠ΅Π½ΠΈΡ ΠΈ/ΠΈΠ»ΠΈ ΠΏΠΎΠΏΡΠ»ΡΡΠ½ΡΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Houston).
ΠΠ»Ρ Π½Π°ΡΠ°Π»Π° Π·Π°Π³ΡΡΠ·ΠΈΡΠ΅ ΡΡΠ°ΡΡΠΎΠ²ΡΠΉ ΠΏΡΠΎΠ΅ΠΊΡ WenderCast.
WenderCastΒ Π±ΡΠ΄Π΅Ρ Π½Π°ΡΠΈΠΌ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ Π΄Π»Ρ ΠΏΠΎΠΈΡΠΊΠ° ΠΏΠΎΠ΄ΠΊΠ°ΡΡΠΎΠ² Π½Π° raywenderlich.com ΠΈ Π½ΠΎΠ²ΡΡ Π½ΠΎΠ²ΠΎΡΡΠ΅ΠΉ.
ΠΡΠΊΡΠΎΠΉΡΠ΅ WenderCast.xcodeproj Π² Xcode ΠΈ Π΄Π°Π²Π°ΠΉΡΠ΅ Π²Π·Π³Π»ΡΠ½Π΅ΠΌ Π½Π° Π½Π΅Π³ΠΎ. ΠΠ°ΠΏΡΡΡΠΈΡΠ΅ ΠΏΡΠΎΠ΅ΠΊΡ Π² ΡΠΈΠΌΡΠ»ΡΡΠΎΡΠ΅ iPhone, ΡΡΠΎΠ±Ρ ΡΠ²ΠΈΠ΄Π΅ΡΡ ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΠ΅ ΠΏΠΎΠ΄ΠΊΠ°ΡΡΡ (Π² ΡΠΊΠΎΡΠΎΠΌ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ Π½Π°ΠΌ ΠΏΠΎΠ½Π°Π΄ΠΎΠ±ΠΈΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠ΅Π°Π»ΡΠ½ΠΎΠ΅ ΡΡΡΡΠΎΠΉΡΡΠ²ΠΎ!):
ΠΡ Π΄ΠΎΠ»ΠΆΠ½Ρ ΡΠ²ΠΈΠ΄Π΅ΡΡ ΡΠ»Π΅Π΄ΡΡΡΠ΅Π΅:

ΠΠ° Π΄Π°Π½Π½ΡΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π·Π°ΠΊΠ»ΡΡΠ°Π΅ΡΡΡ Π² ΡΠΎΠΌ, ΡΡΠΎ ΠΎΠ½ΠΎ Π½Π΅ Π΄Π°Π΅Ρ Π·Π½Π°ΡΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΠΌ, ΠΊΠΎΠ³Π΄Π° Π΄ΠΎΡΡΡΠΏΠ΅Π½ Π½ΠΎΠ²ΡΠΉ ΠΏΠΎΠ΄ΠΊΠ°ΡΡ. Π£ Π½Π΅Π³ΠΎ ΡΠ°ΠΊΠΆΠ΅ Π½Π΅Ρ Π½ΠΎΠ²ΠΎΡΡΠ΅ΠΉ. ΠΡΠ΅ ΡΡΠΎ Π²Ρ ΡΠΊΠΎΡΠΎ ΡΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΈΡΠΏΡΠ°Π²ΠΈΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ Π²Π°ΡΠΈΡ push-ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠΉ! :]
ΠΠ°ΡΡΡΠΎΠΉΠΊΠ° Push-ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΡ Π²Β Π²Π°ΡΠ΅ΠΌ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ
Push-ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΡ Π½ΡΠΆΠ΄Π°ΡΡΡΡ Π² Ρ ΠΎΡΠΎΡΠ΅ΠΉ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΠΈ. ΠΡΠΎ ΠΎΡΠ΅Π½Ρ Π²Π°ΠΆΠ½ΠΎ, Π²Ρ ΠΆΠ΅ Π½Π΅ Ρ ΠΎΡΠ΅Π»ΠΈ Π±Ρ, ΡΡΠΎΠ±Ρ ΠΊΡΠΎ-ΡΠΎ Π΄ΡΡΠ³ΠΎΠΉ ΠΎΡΠΏΡΠ°Π²Π»ΡΠ» push-ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΠΌ Π² Π²Π°ΡΠ΅ΠΌ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ. Π ΡΠΎΠΆΠ°Π»Π΅Π½ΠΈΡ, Π½ΠΎ ΡΠΊΠ°ΠΆΡ, ΡΡΠΎ ΡΡΠΎ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ, ΡΡΠΎ Π΅ΡΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ Π΄Π»Ρ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ push-ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠΉ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ.
ΠΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΡΠ»ΡΠΆΠ±Ρ Push-ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΡ
ΠΠ΅ΡΠ²ΡΠΌ Π΄Π΅Π»ΠΎΠΌ Π½ΡΠΆΠ½ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ (App ID). ΠΠ΅ΡΠ΅ΠΉΠ΄ΠΈΡΠ΅ Π² App Settings (ΠΠ°ΡΡΡΠΎΠΉΠΊΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ) -> General ΠΈ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΠ΅ Π² ΠΏΠΎΠ»Π΅ Bundle Identifier Π½Π° ΠΊΠ°ΠΊΠΎΠΉ-Π½ΠΈΠ±ΡΠ΄Ρ ΡΠ½ΠΈΠΊΠ°Π»ΡΠ½ΡΠΉ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ:

Π§ΡΡΡ Π½ΠΈΠΆΠ΅, Π² ΡΠ°Π·Π΄Π΅Π»Π΅ Signing, ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΠ΅ ΠΏΠΎΠ»Π΅ Team, Π²ΡΠ±Π΅ΡΠΈΡΠ΅ Π² ΡΠΏΠΈΡΠΊΠ΅ Π²ΠΌΠ΅ΡΡΠΎ Π½Π°Π΄ΠΏΠΈΡΠΈ None,Β Π΄ΡΡΠ³ΠΎΠ³ΠΎ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ°, Π² Π½Π°ΡΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅ ΡΠΊΠΎΡΠ΅Π΅ ΠΌΡ Π³ΠΎΠ²ΠΎΡΠΈΠΌ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎ ΠΏΡΠΎ Π²Π°ΡΡ ΡΡΠ΅ΡΠ½ΡΡ Π·Π°ΠΏΠΈΡΡ, Ρ ΠΊΠΎΡΠΎΡΠΎΠΉ ΠΌΡ Π±ΡΠ΄Π΅ΠΌ ΡΠ°Π±ΠΎΡΠ°ΡΡ. ΠΠΏΡΡΡ ΠΆΠ΅ ΠΏΠΎΠ²ΡΠΎΡΡΡΡ, ΡΡΠΎ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΡΡ ΠΎΠΏΠ»Π°ΡΠ΅Π½Π½ΡΠΉ Π°ΠΊΠΊΠ°ΡΠ½Ρ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ°. ΠΡΠ»ΠΈ Π²Ρ Π½Π΅ Π²ΠΈΠ΄ΠΈΡΠ΅ Π² ΡΠΏΠΈΡΠΊΠ΅ Team ΡΠ²ΠΎΠ΅ΠΉ ΡΡΠ΅ΡΠ½ΠΎΠΉ Π·Π°ΠΏΠΈΡΠΈ ΠΈΠ»ΠΈ Π΄ΡΡΠ³ΠΈΡ ΠΊΠ°ΠΊΠΈΡ -Π»ΠΈΠ±ΠΎ Π·Π°ΠΏΠΈΡΠ΅ΠΉ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΎΠ², ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΠΎΠ³ΡΡ Ρ Π²Π°ΠΌΠΈ ΠΏΠΎΠ΄Π΅Π»ΠΈΠ»ΠΈΡΡ Π°ΠΊΠΊΠ°ΡΠ½ΡΠΎΠΌ :] , ΡΠΎ ΡΠ½Π°ΡΠ°Π»Π° Π²Π°ΠΌ ΠΏΡΠΈΠ΄Π΅ΡΡΡ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ ΡΠ²ΠΎΡ ΡΡΠ΅ΡΠ½ΡΡ Π·Π°ΠΏΠΈΡΡ (development team), ΡΠ΄Π΅Π»Π°ΡΡ ΡΡΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΅ΡΠ΅Π· Xcode -> Preferences -> Accounts -> +.
ΠΠ°ΡΠ΅ΠΌ Π²Π°ΠΌ Π½ΡΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°ΡΡ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ (App ID) Π² ΡΡΠ΅ΡΠ½ΠΎΠΉ Π·Π°ΠΏΠΈΡΠΈ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ° (developer account), Π½Π° ΠΊΠΎΡΠΎΡΠΎΠΌ Π±ΡΠ΄Π΅Ρ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΎ ΡΠ°Π·ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ Π½Π° ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ push-ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠΉ. Π ΡΡΠ°ΡΡΡΡ, Ρ Xcode Π΅ΡΡΡ ΠΏΡΠΎΡΡΠΎΠΉ ΡΠΏΠΎΡΠΎΠ±, ΡΡΠΎΠ±Ρ ΡΠ΄Π΅Π»Π°ΡΡ ΡΡΠΎ. ΠΠ΅ΡΠ΅ΠΉΠ΄ΠΈΡΠ΅ Π² App Settings (ΠΠ°ΡΡΡΠΎΠΉΠΊΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ) -> Capabilities ΠΈ ΠΏΠ΅ΡΠ΅ΠΊΠ»ΡΡΠΈΡΠ΅ ΠΏΠ΅ΡΠ΅ΠΊΠ»ΡΡΠ°ΡΠ΅Π»Ρ Π΄Π»Ρ Push Notifications (Push-ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠΉ) Π² ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ On (ΠΠΊΠ».).
ΠΠΎΡΠ»Π΅ Π·Π°Π³ΡΡΠ·ΠΊΠΈ ΠΎΠ½ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²ΡΠ³Π»ΡΠ΄Π΅ΡΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ:

ΠΡΠ»ΠΈ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡΡ ΠΊΠ°ΠΊΠΈΠ΅-Π»ΠΈΠ±ΠΎ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ, ΠΏΠΎΡΠ΅ΡΠΈΡΠ΅Β Apple Developer Center. Π’Π°ΠΌ Π²Π°ΠΌ ΠΎΡΡΠ°Π½Π΅ΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΡΠΎΠ³Π»Π°ΡΠΈΡΡΡΡ Ρ Π½ΠΎΠ²ΠΎΠΉ Π»ΠΈΡΠ΅Π½Π·ΠΈΠ΅ΠΉ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ°, ΠΊΠΎΡΠΎΡΡΡ Apple ΡΠ°ΠΊ Π»ΡΠ±ΠΈΡ ΡΠ°ΡΡΠΎ ΠΌΠ΅Π½ΡΡΡ ;], ΠΈ Π·Π°ΡΠ΅ΠΌ ΠΏΠΎΠ²ΡΠΎΡΠΈΡΠ΅ ΠΏΠΎΠΏΡΡΠΊΡ. Π Ρ ΡΠ΄ΡΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅ Π²Π°ΠΌ ΠΏΠΎΡΡΠ΅Π±ΡΠ΅ΡΡΡ Π²ΡΡΡΠ½ΡΡ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ ΠΏΡΠ°Π²Π° Π½Π° push-ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ Π΄Π²ΡΡ ΠΊΠ½ΠΎΠΏΠΎΠΊ + ΠΈ Edit.
ΠΠ° ΠΊΠ°Π΄ΡΠΎΠΌ ΡΡΠΎ ΡΠΎΠ·Π΄Π°ΡΡ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ (App ID), Π° Π·Π°ΡΠ΅ΠΌ Π΄ΠΎΠ±Π°Π²ΠΈΡ ΠΏΡΠ°Π²Π° Π½Π° push-ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΡ. ΠΡ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΏΠΎΡΠ΅ΡΠΈΡΡ Apple Developer Center ΠΈ ΡΠ±Π΅Π΄ΠΈΡΡΡΡ Π² ΡΡΠΎΠΌ:

ΠΠΎ Π½Π°ΡΡΡΠΎΠΉΠΊΠ°ΠΌ ΡΡΠΎ Π²ΡΠ΅, ΡΡΠΎ Π½Π°ΠΌ ΠΏΠΎΡΡΠ΅Π±ΠΎΠ²Π°Π»ΠΎΡΡ.
Π Π΅Π³ΠΈΡΡΡΠ°ΡΠΈΡ Push-ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠΉ
Π Π΅Π³ΠΈΡΡΡΠ°ΡΠΈΡ push-ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠΉ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ Π² 2 ΡΠ°Π³Π°. Π‘Π½Π°ΡΠ°Π»Π° Π²Ρ Π΄ΠΎΠ»ΠΆΠ½Ρ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΡΠ°Π·ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ ΠΎΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Π½Π° ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ Π»ΡΠ±ΠΎΠ³ΠΎ Π²ΠΈΠ΄Π° ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠΉ, ΠΏΠΎΡΠ»Π΅ ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΡΠΌΠΎΠΆΠ΅Ρ Π·Π°ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠΎΠ²Π°ΡΡΡΡ Π΄Π»Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ ΡΠ΄Π°Π»Π΅Π½Π½ΡΡ ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠΉ, ΠΎΡΠΏΡΠ°Π²Π»Π΅Π½Π½ΡΡ Π²Π°ΡΠΈΠΌ ΡΠ΅ΡΠ²Π΅ΡΠΎΠΌ. ΠΡΠ»ΠΈ Π²ΡΠ΅ ΠΏΠΎΠΉΠ΄Π΅Ρ Ρ ΠΎΡΠΎΡΠΎ, ΡΠΈΡΡΠ΅ΠΌΠ° ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²ΠΈΡ Π²Π°ΠΌ ΡΠΎΠΊΠ΅Π½ ΡΡΡΡΠΎΠΉΡΡΠ²Π°/Π΄Π΅Π²Π°ΠΉΡΠ° (device token), ΠΊΠΎΡΠΎΡΡΠΉ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΏΡΠ΅Π΄ΡΡΠ°Π²ΠΈΡΡ ΠΊΠ°ΠΊ Β«Π°Π΄ΡΠ΅ΡΒ» ΡΡΠΎΠ³ΠΎ ΡΡΡΡΠΎΠΉΡΡΠ²Π°/Π΄Π΅Π²Π°ΠΉΡΠ°.
Π WenderCast ΠΌΡ ΡΠ΅Π³ΠΈΡΡΡΠΈΡΡΠ΅ΠΌ push-ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΡ ΡΡΠ°Π·Ρ ΠΏΠΎΡΠ»Π΅ Π·Π°ΠΏΡΡΠΊΠ° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ.
ΠΡΠΊΡΠΎΠΉΡΠ΅ AppDelegate.swift ΠΈ Π΄ΠΎΠ±Π°Π²ΡΡΠ΅ ΡΡΡΠΉΠΌΠ²ΠΎΡΠΊ Π² Π²Π΅ΡΡ Π½ΡΡ ΡΠ°ΡΡΡ ΡΠ°ΠΉΠ»Π°:
import UserNotifications
ΠΠ°ΡΠ΅ΠΌ Π΄ΠΎΠ±Π°Π²ΡΡΠ΅ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ ΠΌΠ΅ΡΠΎΠ΄ Π² ΠΊΠΎΠ½ΡΠ΅ AppDelegate:
func registerForPushNotifications() {
UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .sound, .badge]) {
(granted, error) in
print("Permission granted: \(granted)")
}
}
Π ΡΠ΅ΠΏΠ΅ΡΡ Π΄ΠΎΠ±Π°Π²ΡΡΠ΅ Π²ΡΠ·ΠΎΠ² ΡΡΠΎΠ³ΠΎ ΠΌΠ΅ΡΠΎΠ΄Π° registerForPushNotifications() Π² ΠΊΠΎΠ½ΡΠ΅ ΠΌΠ΅ΡΠΎΠ΄Π° application(_:didFinishLaunchingWithOptions:), ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½ΠΈΠΆΠ΅:
func application(
_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
// ... existing code ...
registerForPushNotifications()
return true
}
ΠΠ΄Π΅ΠΌ Π΄Π°Π»ΡΡΠ΅: UNUserNotificationCenter Π±ΡΠ» ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ Π² iOS 10 Π² ΡΡΡΠΉΠΌΠ²ΠΎΡΠΊΠ΅ UserNotifications. ΠΠ½ ΠΎΡΠ²Π΅ΡΠ°Π΅Ρ Π·Π° ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π²ΡΠ΅Π³ΠΎ ΡΠΎΠ³ΠΎ, ΡΡΠΎ ΡΠ²ΡΠ·Π°Π½ΠΎ Ρ Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠΌΠΈ ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠΉ Π² ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ.
Π£ UNUserNotificationCenter.current() Π²Ρ Π²ΡΠ·ΡΠ²Π°Π΅ΡΠ΅ requestAuthorization(options: completHandler :), ΡΡΠΎΠ±Ρ (ΠΊΠ°ΠΊ Π²Ρ Π΄ΠΎΠ³Π°Π΄Π°Π»ΠΈΡΡ) Π·Π°ΠΏΡΠΎΡΠΈΡΡ Π°Π²ΡΠΎΡΠΈΠ·Π°ΡΠΈΡ Π΄Π»Ρ push-ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠΉ. ΠΠ΄Π΅ΡΡ Π²Ρ Π΄ΠΎΠ»ΠΆΠ½Ρ ΡΠΊΠ°Π·Π°ΡΡ ΡΠΈΠΏ ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠΉ, ΠΊΠΎΡΠΎΡΠΎΠ΅ Π±ΡΠ΄Π΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π²Π°ΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅. ΠΡΠΈ ΡΠΈΠΏΡ (ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½Π½ΡΠ΅ ΠΊΠ°ΠΊ UNAuthorizationOptions) ΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΡΡ ΡΠΎΠ±ΠΎΠΉ Π»ΡΠ±ΡΡ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°ΡΠΈΡ ΠΈΠ· ΡΠ»Π΅Π΄ΡΡΡΠ΅Π³ΠΎ:
- .badge ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΎΡΠΎΠ±ΡΠ°Π·ΠΈΡΡ ΡΠΈΡΠ»ΠΎ Π² ΡΠ³Π»Ρ ΠΈΠΊΠΎΠ½ΠΊΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ.
- .sound ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π²ΠΎΡΠΏΡΠΎΠΈΠ·Π²Π΅ΡΡΠΈ Π·Π²ΡΠΊ.
- .alert ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΎΡΠΎΠ±ΡΠ°Π·ΠΈΡΡ ΡΠ΅ΠΊΡΡ.
- .carPlay ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΎΡΠΎΠ±ΡΠ°Π·ΠΈΡΡ ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΡ Π² ΡΠΈΡΡΠ΅ΠΌΠ΅ CarPlay.
ΠΡ Π²ΡΠ·ΡΠ²Π°Π΅ΡΠ΅ ΠΌΠ΅ΡΠΎΠ΄ registerForPushNotifications Π² application(_:didFinishLaunchingWithOptions:), ΡΡΠΎΠ±Ρ Π½Π°ΡΠ΅ Π΄Π΅ΠΌΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΏΠΎΠΏΡΡΠ°Π»ΠΎΡΡ Π·Π°ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠΎΠ²Π°ΡΡΡΡ Π΄Π»Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ push-ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠΉ ΠΈ ΠΏΠΎΠ»ΡΡΠ°Π»ΠΎ ΠΈΡ Π² Π»ΡΠ±ΠΎΠ΅ Π²ΡΠ΅ΠΌΡ.
Π’Π΅ΠΏΠ΅ΡΡ ΡΠΎΠ±Π΅ΡΠΈΡΠ΅ (Build) ΠΈ Π·Π°ΠΏΡΡΡΠΈΡΠ΅ (Run) Π²Π°ΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅. ΠΠΎΠ³Π΄Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π·Π°ΠΏΡΡΡΠΈΠ»ΠΎΡΡ, Π²Ρ Π΄ΠΎΠ»ΠΆΠ½Ρ ΡΠ²ΠΈΠ΄Π΅ΡΡ ΠΎΠΊΠΎΡΠΊΠΎ, ΠΊΠΎΡΠΎΡΠΎΠ΅ Π±ΡΠ΄Π΅Ρ Π·Π°ΠΏΡΠ°ΡΠΈΠ²Π°ΡΡ ΡΠ°Π·ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ Π½Π° ΠΎΡΠΏΡΠ°Π²ΠΊΡ ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠΉ.

ΠΠ°ΠΆΠΌΠΈΡΠ΅ ΠΠ ΠΈ Π’Π-ΠΠΠΠΠ! ΠΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΡΠ΅ΠΏΠ΅ΡΡ ΠΌΠΎΠΆΠ΅Ρ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°ΡΡ ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΡ. ΠΡΠ»ΠΈΡΠ½ΠΎ! ΠΠΎ ΡΡΠΎ Π΅ΡΠ»ΠΈβ¦? Π§ΡΠΎ Π΄Π΅Π»Π°ΡΡ, Π΅ΡΠ»ΠΈ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΎΡΠΊΠ°Π·Π°Π» Π² ΡΠ°Π·ΡΠ΅ΡΠ΅Π½ΠΈΠΈ Π½Π° ΠΎΡΠΏΡΠ°Π²ΠΊΡ ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠΉ? ΠΠ»Ρ ΡΡΠΎΠ³ΠΎ Π΄Π°Π²Π°ΠΉΡΠ΅ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ ΠΌΠ΅ΡΠΎΠ΄, Π²Π½ΡΡΡΠΈ AppDelegate:
func getNotificationSettings() {
UNUserNotificationCenter.current().getNotificationSettings { (settings) in
print("Notification settings: \(settings)")
}
}
ΠΡΠΎΡ ΠΌΠ΅ΡΠΎΠ΄ ΠΎΡΠ»ΠΈΡΠ°Π΅ΡΡΡ ΠΎΡ Π½Π°ΡΠ΅Π³ΠΎ ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠ΅Π³ΠΎ ΠΌΠ΅ΡΠΎΠ΄Π° registerForPushNotifications. Π ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠ΅ΠΌ ΠΌΠ΅ΡΠΎΠ΄Π΅ Π²Ρ ΡΠΊΠ°Π·Π°Π»ΠΈ Π²Π°ΡΠΈ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ, Π² ΡΠΎ Π²ΡΠ΅ΠΌΡ ΠΊΠ°ΠΊ ΡΡΠΎΡ ΠΌΠ΅ΡΠΎΠ΄ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ, ΠΊΠΎΡΠΎΡΡΠ΅ Π±ΡΠ»ΠΈ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»Π΅Π½Ρ ΡΠ°ΠΌΠΈΠΌ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΌ.
ΠΡΠ΅Π½Ρ Π²Π°ΠΆΠ½ΠΎ, ΡΡΠΎΠ±Ρ ΠΌΠ΅ΡΠΎΠ΄ getNotificationSettings(completeHandler :) Π±ΡΠ» Π²ΡΠ·Π²Π°Π½ Π²Π½ΡΡΡΠΈ Π·Π°ΠΌΡΠΊΠ°Π½ΠΈΡ Π² ΠΌΠ΅ΡΠΎΠ΄Π΅ requestAuthorization, ΠΊΠΎΡΠΎΡΡΠΉ Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ ΠΊΠ°ΠΆΠ΄ΡΠΉ ΡΠ°Π·, ΠΊΠΎΠ³Π΄Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π·Π°Π²Π΅ΡΡΠ°Π΅Ρ Π·Π°ΠΏΡΡΠΊ.
ΠΡΠΎ Π½ΡΠΆΠ½ΠΎ Π΄Π»Ρ ΡΠΎΠ³ΠΎ, ΡΡΠΎΠ±Ρ Π² Π»ΡΠ±ΠΎΠ΅ Π²ΡΠ΅ΠΌΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΌΠΎΠ³ ΠΏΠ΅ΡΠ΅ΠΉΡΠΈ Π² ΡΠ°Π·Π΄Π΅Π» Β«ΠΠ°ΡΡΡΠΎΠΉΠΊΠΈΒ» Π² Π²Π°ΡΠ΅ΠΌ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ ΠΈ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡ ΡΠ°Π·ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ Π΄Π»Ρ ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠΉ.
ΠΠ°Π²Π°ΠΉΡΠ΅ ΡΠ΅Π°Π»ΠΈΠ·ΡΠ΅ΠΌ ΡΡΠΎ, Π΄ΠΎΠ±Π°Π²ΡΡΠ΅ ΠΌΠ΅ΡΠΎΠ΄ getNotificationSettings() Π² Π·Π°ΠΌΡΠΊΠ°Π½ΠΈΠ΅ ΠΌΠ΅ΡΠΎΠ΄Π° requestAuthorization, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½ΠΈΠΆΠ΅:
func registerForPushNotifications() {
UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .sound, .badge]) {
(granted, error) in
print("Permission granted: \(granted)")
guard granted else { return }
self.getNotificationSettings()
}
}
ΠΠ΅ΡΠ²ΡΠΉ ΡΠ°Π³ Π·Π°Π²Π΅ΡΡΠ΅Π½, ΠΈ ΡΠ΅ΠΏΠ΅ΡΡ Π½Π°ΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π³ΠΎΡΠΎΠ²ΠΎ Π·Π°ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠΎΠ²Π°ΡΡΡΡ Π΄Π»Ρ ΡΠ΄Π°Π»Π΅Π½Π½ΡΡ ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠΉ!
ΠΠ±Π½ΠΎΠ²ΠΈΡΠ΅ ΠΌΠ΅ΡΠΎΠ΄ getNotificationSettings() ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ:
func getNotificationSettings() {
UNUserNotificationCenter.current().getNotificationSettings { (settings) in
print("Notification settings: \(settings)")
guard settings.authorizationStatus == .authorized else { return }
UIApplication.shared.registerForRemoteNotifications()
}
}
ΠΠ΄Π΅ΡΡ Π²Ρ ΠΏΡΠΎΠ²Π΅ΡΡΠ΅ΡΠ΅, ΡΡΠΎ authorizationStatus ΡΠ°Π²Π΅Π½ .authorized, ΡΠΎ Π΅ΡΡΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²ΠΈΠ» ΡΠ°Π·ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ Π΄Π»Ρ ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠΉ, ΠΈ, Π΅ΡΠ»ΠΈ ΡΡΠΎ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ Π²Π΅ΡΠ½ΠΎΠ΅ (ΡΠΎ Π΅ΡΡΡ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ TRUE), ΡΠΎ Π²Ρ Π²ΡΠ·ΡΠ²Π°Π΅ΡΠ΅ UIApplication.shared.registerForRemoteNotifications().
ΠΠΎΠ±Π°Π²ΡΡΠ΅ ΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ Π΄Π²Π° ΠΌΠ΅ΡΠΎΠ΄Π° Π² ΠΊΠΎΠ½ΡΠ΅ AppDelegate; ΠΠ½ΠΈ Π±ΡΠ΄ΡΡ Π²ΡΠ·Π²Π°Π½Ρ Π΄Π»Ρ ΡΠΎΠ³ΠΎ, ΡΡΠΎΠ±Ρ ΡΠΎΠΎΠ±ΡΠΈΡΡ Π²Π°ΠΌ ΠΎ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ΅ registerForRemoteNotifications:
func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
let tokenParts = deviceToken.map { data -> String in
return String(format: "%02.2hhx", data)
}
let token = tokenParts.joined()
print("Device Token: \(token)")
}
func application(_ application: UIApplication,
didFailToRegisterForRemoteNotificationsWithError error: Error) {
print("Failed to register: \(error)")
}
ΠΠ°ΠΊ Π²ΠΈΠ΄Π½ΠΎ ΠΈΠ· Π½Π°Π·Π²Π°Π½ΠΈΡ, ΡΠΈΡΡΠ΅ΠΌΠ° Π²ΡΠ·ΡΠ²Π°Π΅Ρ application(_:didRegisterForRemoteNotificationsWithDeviceToken:), Π΅ΡΠ»ΠΈ ΡΠ΅Π³ΠΈΡΡΡΠ°ΡΠΈΡ ΠΏΡΠΎΡΠ»Π° ΡΡΠΏΠ΅ΡΠ½ΠΎ, ΠΈΠ»ΠΈ Π²ΡΠ·ΡΠ²Π°Π΅Ρ application(_:didFailToRegisterForRemoteNotificationsWithError:) Π² ΡΠ»ΡΡΠ°Π΅ ΠΎΡΠΈΠ±ΠΊΠΈ.
Π’Π΅ΠΊΡΡΠ°Ρ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ application(_:didRegisterForRemoteNotificationsWithDeviceToken:) Π²ΡΠ³Π»ΡΠ΄ΠΈΡ Π½Π΅ΠΏΠΎΠ½ΡΡΠ½ΠΎ, Π½ΠΎ ΠΎΠ½Π° ΠΏΡΠΎΡΡΠΎ ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ deviceToken ΠΈ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΡΠ΅Ρ Π΅Π΅ Π² ΡΡΡΠΎΠΊΡ.
Π’ΠΎ Π΅ΡΡΡ ΠΏΠΎΠ»ΡΡΠ΅Π½Π½ΡΠΉ Π½Π°Ρ ΡΠΎΠΊΠ΅Π½ Π΄Π΅Π²Π°ΠΉΡΠ° (deviceToken) ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠΎΠΌ ΡΡΠΎΠ³ΠΎ ΠΏΡΠΎΡΠ΅ΡΡΠ°. ΠΡΠΈΡΠ΅Π΄ΡΠΈΠΉ ΡΠΎΠΊΠ΅Π½ - ΡΡΠΎ ΡΠΎ, ΡΡΠΎ ΠΏΡΠΈΡΡΠ»Π°Π΅Ρ Π½Π°ΠΌ APNS, ΠΊΠΎΡΠΎΡΡΠΉ Π² ΡΠ²ΠΎΡ ΠΎΡΠ΅ΡΠ΅Π΄Ρ ΡΠ½ΠΈΠΊΠ°Π»ΡΠ½ΠΎ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΡΠΈΡΡΠ΅Ρ Π²Π°ΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π° ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΌ Π΄Π΅Π²Π°ΠΉΡΠ΅. ΠΡΠΈ ΠΎΡΠΏΡΠ°Π²ΠΊΠ΅ push-ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠΉ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ΡΠΎΠΊΠ΅Π½Ρ Π΄Π΅Π²Π°ΠΉΡΠ° ΠΊΠ°ΠΊ Β«Π°Π΄ΡΠ΅ΡΠ°Β», ΡΡΠΎΠ±Ρ Π΄ΠΎΡΡΠ°Π²ΠΈΡΡ ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΡ ΠΈΡΠΊΠ»ΡΡΠΈΡΠ΅Π»ΡΠ½ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π½Π° Π²Π°ΡΠ΅ΠΌ Π΄Π΅Π²Π°ΠΉΡΠ΅.
ΠΠ°ΠΌΠ΅ΡΠΊΠ°
Π‘ΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΏΡΠΈΡΠΈΠ½, ΠΏΠΎ ΠΊΠΎΡΠΎΡΡΠΌ ΡΠ΅Π³ΠΈΡΡΡΠ°ΡΠΈΡ ΠΌΠΎΠΆΠ΅Ρ Π·Π°Π²Π΅ΡΡΠΈΡΡΡΡ Π½Π΅ΡΠ΄Π°ΡΠ΅ΠΉ. Π Π±ΠΎΠ»ΡΡΠΈΠ½ΡΡΠ²Π΅ ΡΠ»ΡΡΠ°Π΅Π² ΡΡΠΎ ΡΠ²ΡΠ·Π°Π½ΠΎ Ρ ΡΠ΅ΠΌ, ΡΡΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Π½Π° ΡΠΈΠΌΡΠ»ΡΡΠΎΡΠ΅, ΠΈΠ»ΠΈ Ρ ΡΠ΅ΠΌ, ΡΡΠΎ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡΠ° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π½Π΅ Π±ΡΠ»Π° Π²ΡΠΏΠΎΠ»Π½Π΅Π½Π° Π΄ΠΎΠ»ΠΆΠ½ΡΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ. Π‘ΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΎΠ± ΠΎΡΠΈΠ±ΠΊΠ΅ ΠΎΠ±ΡΡΠ½ΠΎ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠ²Π½ΠΎΠ΅ ΠΈ ΡΠΊΠ°Π·ΡΠ²Π°Π΅Ρ Π½Π° ΠΎΡΠΈΠ±ΠΊΡ, ΠΊΠΎΡΠΎΡΡΡ Π²Ρ Π΄ΠΎΠΏΡΡΡΠΈΠ»ΠΈ.
ΠΠΎΡ ΠΎΠ½ Π½Π°Ρ ΡΠΎΠΊΠ΅Π½! ΠΠ°ΠΏΡΡΡΠΈΡΠ΅Β Π²Π°ΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅. Π£Π±Π΅Π΄ΠΈΡΠ΅ΡΡ, ΡΡΠΎ Π²Ρ ΡΠ°Π±ΠΎΡΠ°Π΅ΡΠ΅ Π½Π° ΡΠ΅Π°Π»ΡΠ½ΠΎΠΌ Π΄Π΅Π²Π°ΠΉΡΠ΅/ΡΡΡΡΠΎΠΉΡΡΠ²Π΅, Π·Π°ΡΠ΅ΠΌ Π²Ρ Π΄ΠΎΠ»ΠΆΠ½Ρ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΡΠΎΠΊΠ΅Π½ Π΄Π΅Π²Π°ΠΉΡΠ°/ΡΡΡΡΠΎΠΉΡΡΠ²Π° Π² ΠΎΠΊΠΎΡΠΊΠ΅ ΠΊΠΎΠ½ΡΠΎΠ»ΠΈ. ΠΠΎΡ ΠΊΠ°ΠΊ Π²ΡΠ³Π»ΡΠ΄ΠΈΡ ΠΌΠΎΠΉ ΡΠΎΠΊΠ΅Π½:

Π‘ΠΊΠΎΠΏΠΈΡΡΠΉΡΠ΅Β ΠΈ ΡΠΎΡ ΡΠ°Π½ΠΈΡΠ΅ ΡΡΠΎΡ ΡΠΎΠΊΠ΅Π½ Π² Π»ΡΠ±ΠΎΠΌ ΠΌΠ΅ΡΡΠ΅, Π³Π΄Π΅ Π²Π°ΠΌ ΡΠ΄ΠΎΠ±Π½ΠΎ.
ΠΠ΅ΡΠ΅Π΄ ΡΠ΅ΠΌ, ΠΊΠ°ΠΊ Π²Ρ ΡΠΆΠ΅ Π·Π°Ρ ΠΎΡΠΈΡΠ΅ ΠΎΡΠΏΡΠ°Π²ΠΈΡΡ push-ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠ΅, Π²Π°ΠΌ ΠΏΠΎΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΡΠΎΠ²Π΅ΡΡΠΈΡΡ Π΅ΡΠ΅ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ Π½Π°ΡΡΡΠΎΠ΅ΠΊ, ΠΏΠΎΡΡΠΎΠΌΡ Π΄Π°Π²Π°ΠΉΡΠ΅ ΠΏΠ΅ΡΠ΅ΠΉΠ΄Π΅ΠΌ Π² Apple Developer Member Center ΠΈ Π²ΠΎΠΉΠ΄Π΅ΠΌ Π² ΡΠΈΡΡΠ΅ΠΌΡ.
Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ SSL-ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°ΡΠ° ΠΈ ΡΠ°ΠΉΠ»Π° PEM
Π Π²Π°ΡΠ΅ΠΌ ΡΠ΅Π½ΡΡΠ΅ ΡΡΠ°ΡΡΠ½ΠΈΠΊΠΎΠ² (member center) ΠΏΠ΅ΡΠ΅ΠΉΠ΄ΠΈΡΠ΅ Π² Certificates,
IDs & Profiles -> Identifiers -> App IDs ΠΈ Π²ΡΠ±Π΅ΡΠΈΡΠ΅ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ (App ID) Π΄Π»Ρ Π²Π°ΡΠ΅Π³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ. Π ΡΠ°Π·Π΄Π΅Π»Π΅ Application ServiceΒ Push-ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΡ Π΄ΠΎΠ»ΠΆΠ½Ρ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°ΡΡΡΡ ΠΊΠ°ΠΊ Configurable (ΠΠ°ΡΡΡΠ°ΠΈΠ²Π°Π΅ΠΌΡΠ΅):

ΠΠ°ΠΆΠΌΠΈΡΠ΅ Edit (ΠΠ·ΠΌΠ΅Π½ΠΈΡΡ) ΠΈ ΠΏΡΠΎΠΊΡΡΡΠΈΡΠ΅ Π²Π½ΠΈΠ· Π΄ΠΎ Push Notifications:

Π Development SSL Certificate Π½Π°ΠΆΠΌΠΈΡΠ΅ Create Certificateβ¦ ΠΈ Π·Π°ΡΠ΅ΠΌ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΠ΅ ΡΠ°Π³ΠΈ Π΄Π»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ CSR (Certificate Signing Request). ΠΠΎΡΠ»Π΅ ΡΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Ρ Π²Π°Ρ ΡΠΆΠ΅ Π΅ΡΡΡ CSR, Π½Π°ΠΆΠΌΠΈΡΠ΅ continue ΠΈ ΡΠ»Π΅Π΄ΡΠΉΡΠ΅ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΡΠΌ Π΄Π»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ (Generate) ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°ΡΠ° Ρ ΠΏΠΎΠΌΠΎΡΡΡ CSR. Π Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΠΈ Π·Π°Π³ΡΡΠ·ΠΈΡΠ΅ ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°Ρ ΠΈ ΠΊΠ»ΠΈΠΊΠ½ΠΈΡΠ΅ Π½Π° Π½Π΅Π³ΠΎ Π΄Π²Π° ΡΠ°Π·Π°, Π² ΠΈΡΠΎΠ³Π΅ ΡΡΠΎ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ Π΅Π³ΠΎ Π² ΡΠ΅ΠΏΠΎΡΠΊΡ ΠΊΠ»ΡΡΠ΅ΠΉ (Keychain), Π² ΠΏΠ°ΡΠ΅ Ρ ΠΏΡΠΈΠ²Π°ΡΠ½ΡΠΌ ΠΊΠ»ΡΡΠΎΠΌ:

ΠΠ΅ΡΠ½ΡΠ²ΡΠΈΡΡ Π² ΡΠ΅Π½ΡΡ ΡΡΠ°ΡΡΠ½ΠΈΠΊΠ° (member center), Π²Π°Ρ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ (App ID), Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠ΅ΠΏΠ΅ΡΡ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°ΡΡ push-ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΡ Π² Enabled,Β ΡΡΠΎ Π³ΠΎΠ²ΠΎΡΠΈΡ ΠΎ ΡΠΎΠΌ, ΡΡΠΎ Ρ Π²Π°Ρ ΠΏΠΎΡΠ²ΠΈΠ»Π°ΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΡΠ΄Π΅Π»Π°ΡΡ Π²Π°ΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΡΒ push-ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΡΠΌΠΈ:

Π€ΡΡ ! ΠΡΠ»ΠΎ Π·Π°ΡΡΠ°ΡΠ΅Π½ΠΎ Π½Π΅ ΠΌΠ°Π»ΠΎ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ, Π½ΠΎ ΡΠΎΠ³Π»Π°ΡΠΈΡΠ΅ΡΡ, ΡΡΠΎ ΡΠΎΠ³ΠΎ ΡΡΠΎΠΈΠ»ΠΎ :] - Ρ Π½ΠΎΠ²ΡΠΌ ΡΠ°ΠΉΠ»ΠΎΠΌ Π²Π°ΡΠ΅Π³ΠΎ ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°ΡΠ°, Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΎΡΠΏΡΠ°Π²ΠΈΡΡ ΡΠ²ΠΎΠ΅ ΠΏΠ΅ΡΠ²ΠΎΠ΅ push-ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠ΅!
ΠΡΠΏΡΠ°Π²ΠΊΠ° Push-ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠΉ
ΠΡΠΏΡΠ°Π²ΠΊΠ° push-ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠΉ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Π° ΠΏΡΠΈ ΠΏΠΎΠΌΠΎΡΠΈ ΡΠ³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ SSL-ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°ΡΠ°, ΠΊΠΎΡΠΎΡΠ°Ρ Π΄Π°Π΅Ρ ΠΏΡΠ°Π²ΠΎ Π²Π°ΡΠ΅ΠΌΡ ΡΠ΅ΡΠ²Π΅ΡΡ Π·Π°ΡΠΈΡΠ΅Π½Π½ΠΎ ΡΠΎΠ΅Π΄ΠΈΠ½ΠΈΡΡΡΡ Ρ APNS, ΠΈ ΠΌΡ ΡΡΠΎ ΡΠΌΠΎΠΆΠ΅ΠΌ ΡΠ΄Π΅Π»Π°ΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΡΡΠΎ ΡΠΎΠ·Π΄Π°Π½Π½ΠΎΠ³ΠΎ Π½Π°ΡΠ΅Π³ΠΎ push-ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°ΡΠ°β¦ ΠΈ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Pusher.
ΠΠ°ΠΏΡΡΡΠΈΡΠ΅ Pusher. ΠΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΠΏΡΠΎΠ²Π΅ΡΠΈΡ Π½Π°Π»ΠΈΡΠΈΠ΅ push ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°ΡΠΎΠ² Π² ΡΠ΅ΠΏΠΎΡΠΊΠ΅ ΠΊΠ»ΡΡΠ΅ΠΉ (Keychain) ΠΈ ΠΎΡΠΎΠ±ΡΠ°Π·ΠΈΡ ΠΈΡ Π² ΡΠ°ΡΠΊΡΡΠ²ΡΠ΅ΠΌΡΡ ΡΠΏΠΈΡΠΊΠ΅. ΠΡΠΏΠΎΠ»Π½ΠΈΡΠ΅ ΡΠ»Π΅Π΄ΡΡΡΠ΅Π΅:
- ΠΡΠ±Π΅ΡΠΈΡΠ΅ Π²Π°Ρ push ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°Ρ ΠΈΠ· ΡΠ°ΡΠΊΡΡΠ²ΡΠ΅Π³ΠΎΡΡ ΡΠΏΠΈΡΠΊΠ°.
- ΠΡΡΠ°Π²ΡΡΠ΅ ΡΠΎΠΊΠ΅Π½ Π²Π°ΡΠ΅Π³ΠΎ Π΄Π΅Π²Π°ΠΉΡΠ° (device token) Π² ΠΏΠΎΠ»Π΅ Device push token.
- ΠΠ·ΠΌΠ΅Π½ΠΈΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΡΡ ΡΠ°ΡΡΡ Π½Π°:
{
"aps": {
"alert": "Breaking News!",
"sound": "default",
"link_url": "https://raywenderlich.com"
}
}
- ΠΠ° Π΄Π΅Π²Π°ΠΉΡΠ΅, Π½Π° ΠΊΠΎΡΠΎΡΠΎΠΌ ΡΠ°Π½Π΅Π΅ Π²Ρ ΡΠΆΠ΅ Π·Π°ΠΏΡΡΠΊΠ°Π»ΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ WenderCast, ΠΏΠ΅ΡΠ΅Π²Π΅Π΄ΠΈΡΠ΅ Π΅Π³ΠΎ Π² ΡΠΎΠ½ ΠΈΠ»ΠΈ Π·Π°Π±Π»ΠΎΠΊΠΈΡΡΠΉΡΠ΅, ΠΈΠ½Π°ΡΠ΅ push-ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠ΅ ΡΠ°Π±ΠΎΡΠ°ΡΡ Π½Π΅ Π±ΡΠ΄Π΅Ρ *
- ΠΠ°ΠΆΠΌΠΈΡΠ΅ Π½Π° ΠΊΠ½ΠΎΠΏΠΊΡ Push Π² ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ PusherΒ

ΠΡ Π΄ΠΎΠ»ΠΆΠ½Ρ ΡΠ²ΠΈΠ΄Π΅ΡΡ ΡΠ²ΠΎΠ΅ ΠΏΠ΅ΡΠ²ΠΎΠ΅ push-ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠ΅:

ΠΠ°ΠΌΠ΅ΡΠΊΠ°
ΠΡ Π½ΠΈΡΠ΅Π³ΠΎ Π½Π΅ ΡΠ²ΠΈΠ΄ΠΈΡΠ΅, Π΅ΡΠ»ΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π±ΡΠ΄Π΅Ρ ΠΎΡΠΊΡΡΡΠΎ ΠΈ ΡΠ°Π±ΠΎΡΠ°ΡΡ Π½Π° ΠΏΠ΅ΡΠ΅Π΄Π½Π΅ΠΌ ΠΏΠ»Π°Π½Π΅. Push-ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠ΅ Π±ΡΠ΄Π΅Ρ Π΄ΠΎΡΡΠ°Π²Π»Π΅Π½ΠΎ, Π½ΠΎ Π² ΡΡΠΎΡ ΠΌΠΎΠΌΠ΅Π½Ρ Π² ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ Π½ΠΈΡΠ΅Π³ΠΎ Π½Π΅Ρ, Π΄Π»Ρ ΡΠΎΠ³ΠΎ, ΡΡΠΎΠ±Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠ°ΡΡ Π΅Π³ΠΎ. ΠΠΎΡΡΠΎΠΌΡ ΠΏΡΠΎΡΡΠΎ Π·Π°ΠΊΡΠΎΠΉΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΈ ΠΏΠΎΠΏΡΠΎΠ±ΡΠΉΡΠ΅ ΠΎΡΠΏΡΠ°Π²ΠΈΡΡ ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠ΅ Π΅ΡΠ΅ ΡΠ°Π·.
Π§Π°ΡΡΠΎ Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡΡΠΈΠ΅ Π²ΠΎΠΏΡΠΎΡΡ
ΠΡΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΏΡΠΎΠ±Π»Π΅ΠΌ, ΠΊΠΎΡΠΎΡΡΠ΅ Ρ Π²Π°Ρ ΠΌΠΎΠ³ΡΡ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡΡΡ:
Π£ Π²Π°Ρ ΠΏΠΎΠ»ΡΡΠΈΠ»ΠΎΡΡ ΡΠ°ΠΊ, ΡΡΠΎ Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΡ ΠΏΠΎΠ»ΡΡΠ΅Π½Ρ, Π½ΠΎ Π½Π΅ Π²ΡΠ΅:Β Π΅ΡΠ»ΠΈ Π²Ρ ΠΎΡΠΏΡΠ°Π²ΠΈΠ»ΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ push-ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠΉ ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ ΠΈ ΠΏΠΎΠ»ΡΡΠΈΠ»ΠΈ Π½Π΅ Π²ΡΠ΅, Π½Π΅ ΠΏΠ΅ΡΠ΅ΠΆΠΈΠ²Π°ΠΉΡΠ΅! ΠΡΠΎ ΡΠ΄Π΅Π»Π°Π½ΠΎ ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΠΎ. APNS ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°Π΅Ρ ΠΎΡΠ΅ΡΠ΅Π΄Ρ QoS (Quality of Service) Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π΄Π΅Π²Π°ΠΉΡΠ° ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡΠ΅Π΅ push-ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΡ Π² ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ. Π Π°Π·ΠΌΠ΅Ρ ΡΡΠΎΠΉ ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ ΡΠ°Π²Π΅Π½ 1, ΠΏΠΎΡΡΠΎΠΌΡ, Π΅ΡΠ»ΠΈ Π²Ρ ΠΎΡΠΏΡΠ°Π²Π»ΡΠ΅ΡΠ΅ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠΉ, ΡΠΎ ΠΏΠΎΡΠ»Π΅Π΄Π½Π΅Π΅ ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠ΅ ΠΏΠ΅ΡΠ΅ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅Ρ ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠ΅Π΅.
ΠΡΠΎΠ±Π»Π΅ΠΌΠ° Ρ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ΠΌ ΠΊ ΡΠ»ΡΠΆΠ±Π΅ Push Notification: ΠΎΠ΄Π½Π° ΠΈΠ· ΡΠ°ΠΊΠΈΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌ ΠΌΠΎΠΆΠ΅Ρ Π·Π°ΠΊΠ»ΡΡΠ°ΡΡΡΡ Π² ΡΠΎΠΌ, ΡΡΠΎ ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ Π±ΡΠ°Π½Π΄ΠΌΠ°ΡΡΡ, ΠΊΠΎΡΠΎΡΡΠΉ Π±Π»ΠΎΠΊΠΈΡΡΠ΅Ρ ΠΏΠΎΡΡΡ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΠ΅ APNS. Π£Π±Π΅Π΄ΠΈΡΠ΅ΡΡ, ΡΡΠΎ ΡΡΠΈ ΠΏΠΎΡΡΡ Ρ Π²Π°Ρ ΡΠ°Π·Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½Ρ. ΠΡΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π² ΡΠΎΠΌ, ΡΡΠΎ ΠΏΡΠΈΠ²Π°ΡΠ½ΡΠΉ ΠΊΠ»ΡΡ ΠΈ ΡΠ°ΠΉΠ» CSR Π½Π΅Π²Π΅ΡΠ½Ρ. ΠΠΎΠΌΠ½ΠΈΡΠ΅, ΡΡΠΎ ΠΊΠ°ΠΆΠ΄ΡΠΉ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ (App ID) ΠΈΠΌΠ΅Π΅Ρ ΡΠ½ΠΈΠΊΠ°Π»ΡΠ½ΡΡ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°ΡΠΈΡ CSR ΠΈ ΠΏΡΠΈΠ²Π°ΡΠ½ΠΎΠ³ΠΎ ΠΊΠ»ΡΡΠ° (private key).
ΠΠ½Π°ΡΠΎΠΌΠΈΡ Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ Push Notification
ΠΡΠ΅ΠΆΠ΄Π΅ ΡΠ΅ΠΌ ΠΌΡ ΠΏΠ΅ΡΠ΅ΠΉΠ΄Π΅ΠΌ ΠΊ 3 Π·Π°Π΄Π°ΡΠ΅, ΠΏΠΎΡΠΌΠΎΡΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°ΡΠ΅Π»ΡΠ½ΠΎ Π½Π° push-ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠ΅, Π½Π° Π΅Π³ΠΎ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΡΡ ΡΠ°ΡΡΡ:
{
"aps": {
"alert": "Breaking News!",
"sound": "default",
"link_url": "https://raywenderlich.com"
}
}
ΠΠ»Ρ ΡΠ΅Ρ ΠΊΡΠΎ Π½Π΅ Π·Π½Π°ΠΊΠΎΠΌ Ρ JSON, Ρ Π½Π΅Π³ΠΎ Π΅ΡΡΡ Π±Π»ΠΎΠΊ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½Π½ΡΠΉ ΡΠΈΠ³ΡΡΠ½ΡΠΌΠΈ ΡΠΊΠΎΠ±ΠΊΠ°ΠΌΠΈ { }, ΠΈ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ Π² ΡΠ΅Π±Π΅ ΡΠ»ΠΎΠ²Π°ΡΡ, ΠΊΠΎΡΠΎΡΡΠΉ ΡΠΎΡΡΠΎΠΈΡ ΠΈΠ· ΠΏΠ°ΡΡ ΠΊΠ»ΡΡ-Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ (key/value) (Π²ΡΠ΅ ΡΠΎΡΠ½ΠΎ ΡΠ°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΈ Dictionary Π² Swift).
Π€ΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½Π°Ρ ΡΠ°ΡΡΡ ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΡΒ - ΡΡΠΎ ΡΠ»ΠΎΠ²Π°ΡΡ, ΠΊΠΎΡΠΎΡΡΠΉ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ Π² ΡΠ΅Π±Π΅ Ρ ΠΎΡΡ Π±Ρ ΠΎΠ΄ΠΈΠ½ ΡΠ»Π΅ΠΌΠ΅Π½Ρ (ΡΠΎ Π΅ΡΡΡ ΠΊΠ»ΡΡ-Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅), aps, Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΊΠΎΡΠΎΡΠΎΠΉ ΡΠΎΠΆΠ΅ ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠ»ΠΎΠ²Π°ΡΠ΅ΠΌ. Π ΡΠΊΠ°Π·Π°Π½Π½ΠΎΠΌ Π²ΡΡΠ΅ ΠΏΡΠΈΠΌΠ΅ΡΠ΅ aps ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ Π² ΡΠ΅Π±Π΅ ΠΏΠΎΠ»Ρ: alert, sound ΠΈ link_url. ΠΠΎΠ³Π΄Π° Π½Π°ΡΠ΅ push-ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠ΅ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΎ Π΄Π΅Π²Π°ΠΉΡΠΎΠΌ, ΠΎΠ½ΠΎ ΠΎΡΠΎΠ±ΡΠ°Π·ΠΈΡ Π²ΡΠΏΠ»ΡΠ²Π°ΡΡΠ΅Π΅ ΠΎΠΊΠΎΡΠΊΠΎ Ρ ΡΠ΅ΠΊΡΡΠΎΠΌ Β«Breaking News!Β» ΠΈ Π²ΠΎΡΠΏΡΠΎΠΈΠ·Π²Π΅Π΄Π΅Ρ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΠΉ Π·Π²ΡΠΊΠΎΠ²ΠΎΠΉ ΡΠΈΠ³Π½Π°Π».
link_url - ΡΡΠΎ ΠΎΠ±ΡΡΠ½ΠΎΠ΅ ΠΏΠΎΠ»Π΅. ΠΡ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π½Π°ΡΡΡΠΎΠΈΡΡ ΠΏΠΎ-Π΄ΡΡΠ³ΠΎΠΌΡ, Π΄ΠΎΠ±Π°Π²ΠΈΠ² ΠΈ Π΄ΡΡΠ³ΠΈΠ΅ ΠΏΠΎΠ»Ρ Π² ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΡΡ ΡΠ°ΡΡΡ ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΡ, ΠΊΠ°ΠΊ ΡΡΠΎ ΡΠ΄Π΅Π»Π°Π»ΠΈ ΠΌΡ, ΠΈ ΠΎΠ½ΠΈ Π±ΡΠ΄ΡΡ Π΄ΠΎΡΡΠ°Π²Π»Π΅Π½Ρ Π² Π²Π°ΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅. ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΌΡ Π΅ΡΠ΅ Π½Π΅ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°Π΅ΠΌ Π½Π°ΡΠ΅ ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠ΅Β Π² ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ, ΡΡΠ° ΠΏΠ°ΡΠ° βΠΊΠ»ΡΡ-Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅β Π² Π½Π°ΡΡΠΎΡΡΠΈΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ Π½ΠΈΡΠ΅Π³ΠΎ Π½Π΅ Π΄Π΅Π»Π°Π΅Ρ.
ΠΡΡΡ ΡΠ΅ΡΡΡ ΠΊΠ»ΡΡΠ΅ΠΉ, ΠΊΠΎΡΠΎΡΡΠ΅ Π²Ρ ΡΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ Π² ΡΠ»ΠΎΠ²Π°ΡΡ aps:
- alert. ΠΡΠΎ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΡΡΡΠΎΠΊΠ°, ΠΊΠ°ΠΊ ΠΈ Π² ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠ΅ΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅, ΠΈΠ»ΠΈ ΡΠ»ΠΎΠ²Π°ΡΡ. Π ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΡΠ»ΠΎΠ²Π°ΡΡ ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ ΠΎΡΠΎΠ±ΡΠ°Π·ΠΈΡΡ ΡΠ΅ΠΊΡΡ ΠΈΠ»ΠΈ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡ Π΄ΡΡΠ³ΠΈΠ΅ Π°ΡΠΏΠ΅ΠΊΡΡ ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΡ.
- badge. ΠΡΠΎ Π½ΠΎΠΌΠ΅Ρ, ΠΊΠΎΡΠΎΡΡΠΉ Π±ΡΠ΄Π΅Ρ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°ΡΡΡΡ Π² ΡΠ³Π»Ρ ΠΈΠΊΠΎΠ½ΠΊΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ. ΠΡ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΠ΄Π°Π»ΠΈΡΡ Π½ΠΎΠΌΠ΅Ρ, Π·Π°Π΄Π°Π² Π΅Π³ΠΎ Π½ΠΎΠΌΠ΅Ρ ΡΠ°Π²Π½ΡΠΌ 0.
- thread-id. ΠΡ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΡΠΎΡ ΠΊΠ»ΡΡ Π΄Π»Ρ Π³ΡΡΠΏΠΏΠΈΡΠΎΠ²ΠΊΠΈ ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠΉ.
- sound. Π£ΡΡΠ°Π½ΠΎΠ²ΠΈΠ² ΡΡΠΎΡ ΠΊΠ»ΡΡ, Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π²ΠΎΡΠΏΡΠΎΠΈΠ·Π²Π΅ΡΡΠΈ ΡΠ²ΠΎΠΈ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΠ΅ Π·Π²ΡΠΊΠΎΠ²ΡΠ΅ ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΡ, ΠΊΠΎΡΠΎΡΡΠ΅ Π΅ΡΡΡ Π² ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ, Π²ΠΌΠ΅ΡΡΠΎ Π·Π²ΡΠΊΠΎΠ²ΠΎΠ³ΠΎ ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΡ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ. ΠΠ°Π½Π½ΡΠ΅ Π·Π²ΡΠΊΠΎΠ²ΡΠ΅ ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΡ Π΄ΠΎΠ»ΠΆΠ½Ρ Π±ΡΡΡ Π½Π΅ Π±ΠΎΠ»Π΅Π΅ 30 ΡΠ΅ΠΊΡΠ½Π΄ ΠΈ ΠΈΠΌΠ΅ΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠΉ.
- content-available. Π£ΡΡΠ°Π½ΠΎΠ²ΠΈΠ² ΡΡΠΎΡ ΠΊΠ»ΡΡ Π½Π° 1, push-ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠ΅ Π±ΡΠ΄Π΅Ρ ΡΠΈΡ ΠΈΠΌ. ΠΡ ΡΡΠΎ ΡΠ°ΡΡΠΌΠΎΡΡΠΈΠΌ ΠΏΠΎΠ·ΠΆΠ΅ Π² ΡΠ°ΠΌΠΊΠ°Ρ Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡΡΠ΅Π½ΠΈΠ΅ ΠΏΠΎ push-ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΡΠΌ.
- category. ΠΡΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅Ρ ΠΊΠ°ΡΠ΅Π³ΠΎΡΠΈΡ ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΡ, ΠΊΠΎΡΠΎΡΠΎΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π΄Π»Ρ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΈΡ Π΄Π΅ΠΉΡΡΠ²ΠΈΠΉ Π² ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠΈ.ΠΡΠΎ ΡΠΎΠΆΠ΅ Π±ΡΠ΄Π΅Ρ ΡΠ°ΡΡΠΌΠΎΡΡΠ΅Π½ΠΎ Π² Π±Π»ΠΈΠΆΠ°ΠΉΡΠ΅Π΅ Π²ΡΠ΅ΠΌΡ.
ΠΡΠΎΠΌΠ΅ ΡΡΠΎΠ³ΠΎ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ ΡΡΠΎΠ»ΡΠΊΠΎ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΈΡ Π΄Π°Π½Π½ΡΡ , ΡΠΊΠΎΠ»ΡΠΊΠΎ Ρ ΠΎΡΠΈΡΠ΅, Π΅ΡΠ»ΠΈ ΠΏΠΎΠ»Π΅Π·Π½Π°Ρ Π½Π°Π³ΡΡΠ·ΠΊΠ° (payload) Π½Π΅ ΠΏΡΠ΅Π²ΡΡΠ°Π΅Ρ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΡΠΉ ΡΠ°Π·ΠΌΠ΅Ρ 4096 Π±Π°ΠΉΡ.
ΠΠΎΡΠ»Π΅ ΡΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Π²Π°ΠΌ ΡΠ΄Π°Π»ΠΎΡΡ ΡΠ΄Π΅Π»Π°ΡΡ ΠΎΡΠΏΡΠ°Π²ΠΊΡ push-ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΡ Π½Π° Π²Π°Ρ Π΄Π΅Π²Π°ΠΉΡ, Π΄Π°Π²Π°ΠΉΡΠ΅ ΠΏΠ΅ΡΠ΅ΠΉΠ΄ΠΈΡΠ΅ ΠΊ ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΌΡ ΡΠ°Π·Π΄Π΅Π»Ρ. :]
ΠΠ±ΡΠ°Π±ΠΎΡΠΊΠ° Push Notifications
ΠΠ°Π»Π΅Π΅ ΠΏΠΎ ΡΠ΅ΠΊΡΡΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ:
ActionΒ (Π΄Π΅ΠΉΡΡΠ²ΠΈΠ΅) β Π² ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄Π΅ Ρ Π°Π½Π³Π»ΠΈΠΉΡΠΊΠΎΠ³ΠΎ Β«Π΄Π΅ΠΉΡΡΠ²ΠΈΠ΅Β». Π Π½Π°ΡΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅ ΡΡΠΎ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ, ΡΡΠΎ Π΅ΡΠ»ΠΈ ΠΏΡΠΈΡΠ»ΠΎ ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠ΅, ΡΠΎ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡΠΎΠΈΠ·Π²Π΅ΡΡΠΈ Ρ Π½ΠΈΠΌ ΠΊΠ°ΠΊΠΈΠ΅-Π»ΠΈΠ±ΠΎ ΡΠΊΡΠ΅Π½Ρ (Π΄Π΅ΠΉΡΡΠ²ΠΈΡ), Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π½Π°ΠΆΠ°ΡΡ Π½Π° ΠΏΡΠΈΡΠ΅Π΄ΡΠ΅ΠΌ ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠΈ ΠΊΠ½ΠΎΠΏΠΊΡ ΠΈ ΠΏΠΎ Π½Π°ΠΆΠ°ΡΠΈΡ Π½Π° ΠΊΠ½ΠΎΠΏΠΊΡ, Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΏΡΠΎΠΈΠ·ΠΎΠΉΡΠΈ ΠΊΠ°ΠΊΠΎΠ΅-Π»ΠΈΠ±ΠΎ Π΄Π΅ΠΉΡΡΠ²ΠΈΠ΅, ΠΎΡΠΊΡΡΡΠΈΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΈΠ»ΠΈ ΠΎΡΠΏΡΠ°Π²ΠΊΠ° Π½Π°ΡΠ΅Π³ΠΎ ΠΠ°/ΠΠ΅Ρ, Π΅ΡΠ»ΠΈ ΠΎΠ½ΠΈ Π΅ΡΡΡ Π½Π° ΠΊΠ½ΠΎΠΏΠΊΠ°Ρ .
CustomΒ (ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΈΠΉ)Β β Π² ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄Π΅ Ρ Π°Π½Π³Π»ΠΈΠΉΡΠΊΠΎΠ³ΠΎ ΠΈΠ·Π³ΠΎΡΠΎΠ²Π»Π΅Π½Π½ΡΠΉ Π½Π° Π·Π°ΠΊΠ°Π·. Π Π½Π°ΡΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅ ΡΡΠΎ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ, ΡΡΠΎ ΠΌΡ ΡΠ°ΠΌΠΈ ΡΠΎΠ·Π΄Π°Π΅ΠΌ, Π½Π°ΡΡΡΠ°ΠΈΠ²Π°Π΅ΠΌ/ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΡΠ΅ΠΌ Π½Π°Ρ ΠΌΠ΅ΡΠΎΠ΄ ΠΈΠ»ΠΈ ΡΡΠΎ-Π»ΠΈΠ±ΠΎ Π΅ΡΠ΅ ΠΏΠΎ ΡΠ²ΠΎΠ΅ΠΌΡ βΠ²ΠΊΡΡΡβ.
Π ΡΡΠΎΠΌ ΡΠ°Π·Π΄Π΅Π»Π΅ Π²Ρ ΡΠ·Π½Π°Π΅ΡΠ΅, ΠΊΠ°ΠΊ ΡΠ°Π±ΠΎΡΠ°ΡΡ Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΠΌΠΈ Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠΌΠΈΒ Π² ΡΠ²ΠΎΠ΅ΠΌ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ, ΠΊΠΎΠ³Π΄Π° ΠΏΡΠΈΡ ΠΎΠ΄ΡΡ push-ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΡ ΠΈ/ΠΈΠ»ΠΈ ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΠΈ Π½Π°ΠΆΠΈΠΌΠ°ΡΡ Π½Π° Π½ΠΈΡ .
Π§ΡΠΎ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ, ΠΊΠΎΠ³Π΄Π° Π²Ρ ΠΏΠΎΠ»ΡΡΠ°Π΅ΡΠ΅ Push-ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠ΅?
ΠΠΎΠ³Π΄Π° Π²Π°ΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΏΠΎΠ»ΡΡΠ°Π΅Ρ push-ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠ΅, Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ ΠΎΠΏΡΠ΅Π΄Π»Π΅Π½Π½ΡΠΉ ΠΌΠ΅ΡΠΎΠ΄ Π² UIApplicationDelegate.
Π£Π²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠ΅ ΠΌΠΎΠ³ΡΡ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡΡΡ ΠΏΠΎ-ΡΠ°Π·Π½ΠΎΠΌΡ, Π²ΡΠ΅ Π·Π°Π²ΠΈΡΠΈΡ ΠΎΡ ΡΠΎΠ³ΠΎ, Π² ΠΊΠ°ΠΊΠΎΠΌ ΡΠ΅ΠΉΡΠ°Ρ ΡΠΎΡΡΠΎΡΠ½ΠΈΠΈ (Π·Π°ΠΊΡΡΡΠΎ ΠΈΠ»ΠΈ Π² ΡΠΎΠ½ΠΎΠ²ΠΎΠΌ ΡΠ΅ΠΆΠΈΠΌΠ΅) Π½Π°Ρ ΠΎΠ΄ΠΈΡΡΡ Π²Π°ΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΠΈ ΠΊΠ°ΠΊΠΎΠ³ΠΎ Π²ΠΈΠ΄Π° ΠΏΡΠΈΡΠ»ΠΎ ΠΏΠΎΠ»ΡΡΠ΅Π½Π½ΠΎΠ΅ ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠ΅ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²Π΅Π½Π½ΠΎ:
- ΠΡΠ»ΠΈ Π²Π°ΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π΅ Π·Π°ΠΏΡΡΠ΅Π½ΠΎ ΠΈ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Π·Π°ΠΏΡΡΠΊΠ°Π΅Ρ Π΅Π³ΠΎ, Π½Π°ΠΆΠ°Π² Π½Π° push-ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠ΅.Β Push-ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠ΅ ΠΏΠ΅ΡΠ΅Π΄Π°Π΅ΡΡΡ Π²Π°ΡΠ΅ΠΌΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π² launchOptions Π² ΠΌΠ΅ΡΠΎΠ΄Π΅ application(_:didFinishLaunchingWithOptions:).
- ΠΡΠ»ΠΈ Π²Π°ΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π·Π°ΠΏΡΡΠ΅Π½ΠΎ ΠΈ Π½Π°Ρ ΠΎΠ΄ΠΈΡΡΡ Π½Π° ΠΏΠ΅ΡΠ΅Π΄Π½Π΅ΠΌ ΠΏΠ»Π°Π½Π΅, ΠΈΠ»ΠΈ Π² ΡΠΎΠ½ΠΎΠ²ΠΎΠΌ ΡΠ΅ΠΆΠΈΠΌΠ΅, Π±ΡΠ΄Π΅Ρ Π²ΡΠ·Π²Π°Π½ ΠΌΠ΅ΡΠΎΠ΄ application(_:didReceiveRemoteNotification: fetchCompletionHandler:). ΠΡΠ»ΠΈ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΎΡΠΊΡΡΠ²Π°Π΅Ρ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, Π½Π°ΠΆΠ°Π² Π½Π° push-ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠ΅, ΡΡΠΎΡ ΠΌΠ΅ΡΠΎΠ΄ Π±ΡΠ΄Π΅Ρ Π²ΡΠ·Π²Π°Π½ Π΅ΡΠ΅ ΡΠ°Π·, ΡΠ°ΠΊ Π²Ρ ΡΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΎΠ±Π½ΠΎΠ²ΠΈΡΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ (UI) ΠΈ ΠΎΡΠΎΠ±ΡΠ°Π·ΠΈΡΡ Π°ΠΊΡΡΠ°Π»ΡΠ½ΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ.
Π ΠΏΠ΅ΡΠ²ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ WenderCast ΡΠΎΠ·Π΄Π°ΡΡ ΡΠ»Π΅ΠΌΠ΅Π½Ρ (ΡΡΠ΅ΠΉΠΊΡ) Π½ΠΎΠ²ΠΎΡΡΠ΅ΠΉ ΠΈ ΠΎΡΠΊΡΠΎΠ΅ΡΡΡ Π½Π΅ΠΏΠΎΡΡΠ΅Π΄ΡΡΠ²Π΅Π½Π½ΠΎ Π² ΡΠ°Π·Π΄Π΅Π»Π΅ Π½ΠΎΠ²ΠΎΡΡΠ΅ΠΉ. ΠΠΎΠ±Π°Π²ΡΡΠ΅ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ ΠΊΠΎΠ΄ Π² ΠΊΠΎΠ½ΡΠ΅ ΠΌΠ΅ΡΠΎΠ΄Π° application(_:didFinishLaunchingWithOptions:) ΠΏΠ΅ΡΠ΅Π΄ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠΎΠΌ return true:
// Check if launched from notification
// 1
if let notification = launchOptions?[.remoteNotification] as? [String: AnyObject] {
// 2
let aps = notification["aps"] as! [String: AnyObject]
_ = NewsItem.makeNewsItem(aps)
// 3
(window?.rootViewController as? UITabBarController)?.selectedIndex = 1
}
ΠΡΠΎΡ ΠΊΠΎΠ΄ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅Ρ ΡΡΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ:
- ΠΠ½ ΠΏΡΠΎΠ²Π΅ΡΡΠ΅Ρ, ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ Π»ΠΈ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π΄Π»Ρ UIApplicationLaunchOptionsKey.remoteNotification Π² launchOptions, ΠΈΒ Π΅ΡΠ»ΠΈ ΠΎΠ½ΠΎ ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ, ΡΠΎ ΠΌΡ ΠΏΠΎΠ»ΡΡΠ°Π΅ΠΌ Π΄ΠΎΡΡΡΠΏ ΠΊ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎΠΉ ΡΠ°ΡΡΠΈΒ push-ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΡ, ΠΊΠΎΡΠΎΡΠΎΠ΅Β Π²Ρ ΠΎΡΠΏΡΠ°Π²ΠΈΠ»ΠΈ.
- ΠΡΠ»ΠΈ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅, ΠΊΠΎΡΠΎΡΠΎΠ΅ ΠΌΡ ΠΏΠΎΠ»ΡΡΠΈΠ»ΠΈ Π²ΡΡΠ΅ ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ, ΡΠΎ Π²Ρ ΠΏΠ΅ΡΠ΅Ρ Π²Π°ΡΡΠ²Π°Π΅ΡΠ΅ ΡΠ»ΠΎΠ²Π°ΡΡ aps (notification["aps"]) ΠΈ ΠΏΠ΅ΡΠ΅Π΄Π°Π΅ΡΠ΅ Π΅Π³ΠΎ Π² ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ NewNewsItem(_ :), ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅Ρ ΡΠΎΠ±ΠΎΠΉ Π²ΡΠΏΠΎΠΌΠΎΠ³Π°ΡΠ΅Π»ΡΠ½ΡΠΉ ΠΌΠ΅ΡΠΎΠ΄, ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅ΠΌΡΠΉ Π΄Π»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ NewsItem (Π½ΠΎΠ²ΠΎΠΉ ΡΡΠ΅ΠΉΠΊΠΈ) ΠΈΠ· ΡΠ»ΠΎΠ²Π°ΡΡ ΠΈ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ ΡΠ°Π±Π»ΠΈΡΡ Π½ΠΎΠ²ΠΎΡΡΠ΅ΠΉ.
- Π Π½Π°ΠΊΠΎΠ½Π΅Ρ, ΠΎΠ½ ΠΈΠ·ΠΌΠ΅Π½ΡΠ΅Ρ Π²ΡΠ±ΡΠ°Π½Π½ΡΡ Π²ΠΊΠ»Π°Π΄ΠΊΡ ΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅ΡΠ° Π½Π° Π²ΠΊΠ»Π°Π΄ΠΊΡ 1, ΡΡΠΎ ΡΠ°Π·Π΄Π΅Π» Π½ΠΎΠ²ΠΎΡΡΠ΅ΠΉ.
Π§ΡΠΎΠ±Ρ ΠΏΡΠΎΠ²Π΅ΡΠΈΡΡ ΡΡΠΎ, Π²Π°ΠΌ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΡΡΠ΅Π΄Π°ΠΊΡΠΈΡΠΎΠ²Π°ΡΡ ΡΡ Π΅ΠΌΡ (Edit Scheme) WenderCast:

Π ΡΠ°Π·Π΄Π΅Π»Π΅ Run -> Info Π²ΡΠ±Π΅ΡΠΈΡΠ΅ Wait for executable to be launched:

ΠΡΠΎΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ Π·Π°ΡΡΠ°Π²ΠΈΡ ΠΎΡΠ»Π°Π΄ΡΠΈΠΊΠ° (debugger) ΠΆΠ΄Π°ΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΠΊΠΎΡΠΎΡΠΎΠ΅ Π±ΡΠ΄Π΅Ρ Π·Π°ΠΏΡΡΠ΅Π½ΠΎ Π² ΠΏΠ΅ΡΠ²ΡΠΉ ΡΠ°Π· ΠΏΠΎΡΠ»Π΅ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ, ΡΡΠΎΠ±Ρ ΠΏΡΠΈΡΠΎΠ΅Π΄ΠΈΠ½ΠΈΡΡΡΡ ΠΊ Π½Π΅ΠΌΡ.
ΠΠ°ΠΏΡΡΡΠΈΡΠ΅ Π²Π°ΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅. ΠΠ°ΠΊ ΡΠΎΠ»ΡΠΊΠΎ ΡΠ΄Π΅Π»Π°Π΅ΡΠ΅ ΡΡΠΎ, ΠΎΡΠΏΡΠ°Π²ΡΡΠ΅ Π΅ΡΠ΅ ΡΠ°Π· ΡΠ²Π΅ΠΆΠ΅Π½ΡΠΊΠΈΠ΅ Π½ΠΎΠ²ΠΎΡΡΠΈ (push-ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΡ). ΠΠ°ΠΆΠΌΠΈΡΠ΅ Π½Π° ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠ΅, ΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΎΡΠΊΡΡΡΡ Π²Π°ΡΡ ΠΎΡΠΏΡΠ°Π²Π»Π΅Π½Π½ΡΡ Π½ΠΎΠ²ΠΎΡΡΡ:

ΠΠ°ΠΌΠ΅ΡΠΊΠ°
ΠΡΠ»ΠΈ Π²Ρ ΠΏΠ΅ΡΠ΅ΡΡΠ°Π½Π΅ΡΠ΅ ΠΏΠΎΠ»ΡΡΠ°ΡΡ push-ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΡ, Π²Π΅ΡΠΎΡΡΠ½ΠΎ, ΡΠΎΠΊΠ΅Π½ Π²Π°ΡΠ΅Π³ΠΎ Π΄Π΅Π²Π°ΠΉΡΡ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ»ΡΡ. ΠΡΠΎ ΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠΎΠΈΠ·ΠΎΠΉΡΠΈ, Π΅ΡΠ»ΠΈ Π²Ρ ΡΠ΄Π°Π»ΠΈΠ»ΠΈ ΠΈΠ»ΠΈ ΠΏΠ΅ΡΠ΅ΡΡΡΠ°Π½ΠΎΠ²ΠΈΠ»ΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅. ΠΠ²Π°ΠΆΠ΄Ρ ΠΏΡΠΎΠ²Π΅ΡΡΡΠ΅ ΡΠΎΠΊΠ΅Π½ Π΄Π΅Π²Π°ΠΉΡΠ°, ΡΡΠΎΠ±Ρ ΡΠΎΡΠ½ΠΎ Π±ΡΡΡ ΡΠ²Π΅ΡΠ΅Π½Π½ΡΠΌ Π² Π΅Π³ΠΎ Π²Π΅ΡΠ½ΠΎΡΡΠΈ.
ΠΠ°Π²Π°ΠΉΡΠ΅ ΡΠ°Π·Π±Π΅ΡΠ΅ΠΌ Π΄ΡΡΠ³ΠΎΠΉ ΡΠ»ΡΡΠ°ΠΉ, Π΄ΠΎΠ±Π°Π²ΡΡΠ΅ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ ΠΌΠ΅ΡΠΎΠ΄ Π² AppDelegate:
func application(
_ application: UIApplication,
didReceiveRemoteNotification userInfo: [AnyHashable : Any],
fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
let aps = userInfo["aps"] as! [String: AnyObject]
_ = NewsItem.makeNewsItem(aps)
}
ΠΡΠΎΡ ΠΌΠ΅ΡΠΎΠ΄ Π½Π°ΠΏΡΡΠΌΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ Π²ΡΠΏΠΎΠΌΠΎΠ³Π°ΡΠ΅Π»ΡΠ½ΡΡ ΡΡΠ½ΠΊΡΠΈΡ Π΄Π»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ Π½ΠΎΠ²ΠΎΠ³ΠΎ NewsItem (Π½ΠΎΠ²ΠΎΠΉ ΡΡΠ΅ΠΉΠΊΠΈ). Π‘Π΅ΠΉΡΠ°Ρ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΎΠ±ΡΠ°ΡΠ½ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡ ΡΡ Π΅ΠΌΡ Π΄Π»Ρ Π·Π°ΠΏΡΡΠΊΠ° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π½Π° ΠΎΠΏΡΠΈΡ automatically (Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ), Π΅ΡΠ»ΠΈ ΠΊΠΎΠ½Π΅ΡΠ½ΠΎ Π²Π°ΠΌ ΡΡΠΎ Ρ ΠΎΡΠ΅ΡΡΡ.
ΠΠ°ΠΏΡΡΡΠΈΡΠ΅ Π²Π°ΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅. ΠΠ΅ΡΠΆΠΈΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΎΡΠΊΡΡΡΡΠΌ Π½Π° ΠΏΠ΅ΡΠ΅Π΄Π½Π΅ΠΌ ΠΏΠ»Π°Π½Π΅, ΠΈ ΡΡΠΎΠ±Ρ ΠΎΠ½ΠΎ Π±ΡΠ»ΠΎ Π² ΡΠ°Π·Π΄Π΅Π»Π΅ news (ΠΠΎΠ²ΠΎΡΡΠΈ). ΠΡΠΏΡΠ°Π²ΡΡΠ΅ Π΅ΡΠ΅ ΠΎΠ΄Π½ΠΎ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ Ρ ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠ΅ΠΌ ΠΎ Π½ΠΎΠ²ΠΎΡΡΡΡ ΠΈ ΠΏΠΎΡΠΌΠΎΡΡΠΈΡΠ΅, ΠΊΠ°ΠΊ ΡΡΠΎ Π²ΠΎΠ»ΡΠ΅Π±Π½ΡΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ ΠΎΠ½ΠΎ ΠΏΠΎΡΠ²ΠΈΡΡΡ feed:
feed - ΡΡΠΎ Π½ΠΎΠ²ΠΎΡΡΠΈ, ΡΠΎΡΠ½Π΅Π΅ Π½ΠΎΠ²ΠΎΡΡΠ½Π°Ρ Π»Π΅Π½ΡΠ°, Π² ΠΊΠΎΡΠΎΡΠΎΠΉ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°ΡΡΡΡ Π²ΡΠ΅ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ, Π½ΠΎΠ²ΡΠ΅ Π²ΠΈΠ΄Π΅ΠΎ, ΠΊΠΎΡΠΎΡΡΠ΅ Π½Π΅Π΄Π°Π²Π½ΠΎ Π·Π°Π»ΠΈΠ» ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ, ΡΠ΅ΠΊΡΡ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΎΠ½ Π½Π°ΠΏΠΈΡΠ°Π», ΠΊΠΎΠΌΡ ΠΏΠΎΡΡΠ°Π²ΠΈΠ» Π»Π°ΠΉΠΊ, ΡΡΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΠ» Π² ΠΏΠ»Π΅ΠΉΠ»ΠΈΡΡ ΠΈ Ρ.Π΄...

ΠΠΎΡ ΠΎΠ½ΠΎ! Π’Π΅ΠΏΠ΅ΡΡ ΠΈ ΡΠ°ΠΊΠΈΠΌ ΡΠΏΠΎΡΠΎΠ±ΠΎΠΌ Π²Π°ΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡ ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΠ΅ Π½ΠΎΠ²ΠΎΡΡΠΈ.
ΠΠ°ΠΆΠ½ΠΎ ΡΠ»Π΅Π΄ΡΡΡΠ΅Π΅: push-ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΡ ΠΌΠΎΠ³ΡΡ ΠΌΠ½ΠΎΠ³ΠΎ ΡΠ°Π· ΠΎΡΡΠ°ΡΡΡΡ ΠΏΡΠΎΠΏΡΡΠ΅Π½Π½ΡΠΌΠΈ. ΠΡΠΎ Π½ΠΎΡΠΌΠ°Π»ΡΠ½ΠΎ Π΄Π»Ρ Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ WenderCast, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π²Π΅ΡΡ ΡΠΏΠΈΡΠΎΠΊ Π½ΠΎΠ²ΠΎΡΡΠ΅ΠΉΒ Π·Π΄Π΅ΡΡ Π½Π΅ ΡΠ°ΠΌΠΎΠ΅ Π³Π»Π°Π²Π½ΠΎΠ΅, Π½ΠΎ Π² ΡΠ΅Π»ΠΎΠΌ Π²Ρ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ push-ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΡ ΠΊΠ°ΠΊ Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½ΡΠΉ ΡΠΏΠΎΡΠΎΠ± Π΄ΠΎΡΡΠ°Π²ΠΊΠΈ ΠΊΠΎΠ½ΡΠ΅Π½ΡΠ°.
ΠΠΌΠ΅ΡΡΠΎ ΡΡΠΎΠ³ΠΎ push-ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΡ Π΄ΠΎΠ»ΠΆΠ½Ρ ΡΠΈΠ³Π½Π°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ ΠΎ Π½Π°Π»ΠΈΡΠΈΠΈ Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΊΠΎΠ½ΡΠ΅Π½ΡΠ° ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π·Π°Π³ΡΡΠΆΠ°ΡΡ ΠΊΠΎΠ½ΡΠ΅Π½Ρ ΠΈΠ· ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ ΠΈΡΡΠΎΡΠ½ΠΈΠΊΠ° (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΈΠ· REST API). Π ΡΡΠΎΠΌ ΠΏΠ»Π°Π½Π΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ WenderCast Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΎ, ΡΠ°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ½ΠΎ Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ Π½Π°ΡΡΠΎΡΡΠ΅Π³ΠΎ ΡΠΎΠ·Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΡΠ΅ΡΠ²Π΅ΡΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ°.
Π£Π²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΡ Ρ Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠΌΠΈ
Π£Π²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΡ Ρ Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠΌΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ ΡΠ²ΠΎΠΈ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΠ΅ ΠΊΠ°ΡΡΠΎΠΌΠ½ΡΠ΅ ΠΊΠ½ΠΎΠΏΠΊΠΈ Π½Π° ΡΠ°ΠΌΠΎΠΌ ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠΈ. ΠΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΡΠ°Π½ΡΡΠ΅ Π²Ρ Π·Π°ΠΌΠ΅ΡΠ°Π»ΠΈ ΡΡΠΎ ΠΏΠΎ ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΡΠΌ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΏΡΠΈΡ ΠΎΠ΄ΡΡ ΠΏΠΎ ΡΠ»Π΅ΠΊΡΡΠΎΠ½Π½ΠΎΠΉ ΠΏΠΎΡΡΠ΅ ΠΈΠ»ΠΈ ΡΠ²ΠΈΡΠ°ΠΌ. ΠΠ½ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡ Π²Π°ΠΌ ΡΡΡ ΠΆΠ΅ Π΄Π°ΡΡ ΠΎΡΠ²Π΅Ρ, Π½Π°ΠΆΠ°Π² Β«ΠΎΡΠ²Π΅ΡΠΈΡΡΒ», ΠΈΠ»ΠΈ ΠΎΡΠΌΠ΅ΡΠΈΡΡ ΠΊΠ°ΠΊ Β«Π»ΡΠ±ΠΈΠΌΠΎΠ΅Β».
Π£Π²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΡ Ρ Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠΌΠΈ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΡΡΡΡ Π²Π½ΡΡΡΠΈ Π²Π°ΡΠ΅Π³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, ΠΊΠΎΠ³Π΄Π° Π²Ρ ΡΠ΅Π³ΠΈΡΡΡΠΈΡΡΠ΅ΡΠ΅ΡΡ Π΄Π»Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠΉ Ρ ΠΏΠΎΠΌΠΎΡΡΡ categories. ΠΠ°ΠΆΠ΄Π°Ρ ΠΊΠ°ΡΠ΅Π³ΠΎΡΠΈΡ (categories) ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠΉ ΠΌΠΎΠΆΠ΅Ρ ΠΈΠΌΠ΅ΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΏΡΠ΅Π΄ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½Π½ΡΡ ΠΊΠ°ΡΡΠΎΠΌΠ½ΡΡ ΡΠΊΡΠ΅Π½ΠΎΠ² (Π΄Π΅ΠΉΡΡΠ²ΠΈΠΉ).
ΠΠΎΡΠ»Π΅ ΡΠ΅Π³ΠΈΡΡΡΠ°ΡΠΈΠΈ Π² Π²Π°ΡΠ΅ΠΌ ΡΠ΅ΡΠ²Π΅ΡΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ ΠΊΠ°ΡΠ΅Π³ΠΎΡΠΈΡ (categories) Π΄Π»Ρ push-ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠΉ.
ΠΠ΅ΠΉΡΡΠ²ΠΈΡ ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠΉ Π±ΡΠ΄ΡΡ Π΄ΠΎΡΡΡΠΏΠ½Ρ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΏΡΠΈ Π΅Π³ΠΎ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΠΈ.
ΠΠ»Ρ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ WenderCast ΠΌΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΠ»ΠΈ ΠΊΠ°ΡΠ΅Π³ΠΎΡΠΈΡ Β«NewsΒ» (ΠΠΎΠ²ΠΎΡΡΠΈ) Ρ Π½Π°ΡΠΈΠΌΠΈ Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠΌΠΈ ΠΏΠΎΠ΄ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ Β«ViewΒ», ΠΊΠΎΡΠΎΡΡΠ΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΠΌ Π½Π°ΠΏΡΡΠΌΡΡ, ΠΏΠΎ ΠΆΠ΅Π»Π°Π½ΠΈΡ ΠΏΡΠΎΡΠΌΠ°ΡΡΠΈΠ²Π°ΡΡ Π² ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ Π½ΠΎΠ²ΠΎΡΡΠ½ΡΠ΅ ΡΡΠ°ΡΡΠΈ.
ΠΡΠ°ΠΊ, Π·Π°ΠΌΠ΅Π½ΠΈΠΌ registerForPushNotifications() Π² AppDelegate ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ:
func registerForPushNotifications() {
UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .sound, .badge]) {
(granted, error) in
print("Permission granted: \(granted)")
guard granted else { return }
// 1
let viewAction = UNNotificationAction(identifier: viewActionIdentifier,
title: "View",
options: [.foreground])
// 2
let newsCategory = UNNotificationCategory(identifier: newsCategoryIdentifier,
actions: [viewAction],
intentIdentifiers: [],
options: [])
// 3
UNUserNotificationCenter.current().setNotificationCategories([newsCategory])
self.getNotificationSettings()
}
}
Π§ΡΠΎ Π½Π°Ρ Π½ΠΎΠ²ΡΠΉ ΠΊΠΎΠ΄ Π΄Π΅Π»Π°Π΅Ρ :
- ΠΠ΄Π΅ΡΡ Π²Ρ ΡΠΎΠ·Π΄Π°Π΅ΡΠ΅ Π½ΠΎΠ²ΠΎΠ΅ ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠ΅ Ρ ΠΊΠ½ΠΎΠΏΠΊΠΎΠΉ ΠΏΠΎΠ΄ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ Β«ViewΒ», ΠΊΠΎΡΠΎΡΠΎΠ΅ Π±ΡΠ΄Π΅Ρ ΠΎΡΠΊΡΡΠ²Π°ΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π° ΠΏΠ΅ΡΠ΅Π΄Π½ΠΈΠΉ ΠΏΠ»Π°Π½Π΅ ΠΏΡΠΈ Π΅Π³ΠΎ Π·Π°ΠΏΡΡΠΊΠ΅. ΠΠ°Ρ ΡΠΎΠ·Π΄Π°Π½Π½ΡΠΉ ΡΠΊΡΠ½ ΠΈΠΌΠ΅Π΅Ρ ΡΠ½ΠΈΠΊΠ°Π»ΡΠ½ΡΠΉ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π΄Π»Ρ ΠΎΡΠ»ΠΈΡΠΈΡ Π΅Π³ΠΎ ΠΎΡ Π΄ΡΡΠ³ΠΈΡ Π΄Π΅ΠΉΡΡΠ²ΠΈΠΉ.
- ΠΠ°ΡΠ΅ΠΌ Π²Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅ΡΠ΅ ΠΊΠ°ΡΠ΅Π³ΠΎΡΠΈΡ Π½ΠΎΠ²ΠΎΡΡΠ΅ΠΉ, ΠΊΠΎΡΠΎΡΠ°Ρ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ Π΄Π΅ΠΉΡΡΠ²ΠΈΠΉ (let viewAction). ΠΠ½ ΡΠ°ΠΊΠΆΠ΅ ΠΈΠΌΠ΅Π΅Ρ ΡΠ²ΠΎΠΉ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ, ΠΊΠΎΡΠΎΡΡΠΉ Π΄ΠΎΠ»ΠΆΠ½Π°Β ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΡ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½Π°Ρ ΡΠ°ΡΡΡ ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΡ, ΡΡΠΎΠ±Ρ ΡΠΊΠ°Π·Π°ΡΡ, ΡΡΠΎ push-ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠ΅ ΠΎΡΠ½ΠΎΡΠΈΡΡΡ ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΊ ΡΡΠΎΠΉ ΠΊΠ°ΡΠ΅Π³ΠΎΡΠΈΠΈ.
- Π Π½Π°ΠΊΠΎΠ½Π΅Ρ, Π²ΡΠ·ΡΠ²Π°Ρ setNotificationCategories(_ :), Π²Ρ ΡΠ΅Π³ΠΈΡΡΡΠΈΡΡΠ΅ΡΠ΅ Π½ΠΎΠ²ΠΎΠ΅ ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠ΅, ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠ΅Π΅ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ.
ΠΠ°ΠΏΡΡΡΠΈΡΠ΅ Π²Π°ΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΡΡΠΎΠ±Ρ Π·Π°ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠΎΠ²Π°ΡΡ Π½Π°ΡΠΈ Π½ΠΎΠ²ΡΠ΅ ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΡ.
ΠΠ΅ΡΠ΅Π²Π΅Π΄ΠΈΡΠ΅ Π²Π°ΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π² ΡΠΎΠ½ΠΎΠ²ΡΠΉ ΡΠ΅ΠΆΠΈΠΌ, Π° Π·Π°ΡΠ΅ΠΌ ΠΎΡΠΏΡΠ°Π²ΡΡΠ΅ ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠ΅ ΡΠΎ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΡΠΌ ΡΠ΅ΡΠ΅Π· ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Pusher:
{
"aps": {
"alert": "Breaking News!",
"sound": "default",
"link_url": "https://raywenderlich.com",
"category": "NEWS_CATEGORY"
}
}
ΠΡΠ»ΠΈ Π²ΡΠ΅ ΠΏΡΠΎΡΠ»ΠΎ Ρ ΠΎΡΠΎΡΠΎ, ΡΠΎ Π²Ρ ΡΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΠ²ΠΈΠ΄Π΅ΡΡ ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠ΅ ΠΈ ΠΎΡΠΊΡΡΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΡΠ΅ΡΠ΅Π· Π½Π°ΠΆΠ°ΡΠΈΠ΅ Π½Π° ΡΠΊΡΠ½-ΠΊΠ½ΠΎΠΏΠΊΡ Β«ViewΒ»:

ΠΡΠ»ΠΈΡΠ½ΠΎ! ΠΠ°ΠΆΠ°ΡΠΈΠ΅ Π½Π° ΡΡΡ ΠΊΠ½ΠΎΠΏΠΊΡ Π·Π°ΠΏΡΡΡΠΈΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ WenderCast, Π½ΠΎ Π½ΠΈΡΠ΅Π³ΠΎ Π½Π΅ ΠΎΡΠΎΠ±ΡΠ°Π·ΠΈΡ. Π§ΡΠΎΠ±Ρ ΠΎΡΠΎΠ±ΡΠ°Π·ΠΈΡΡ ΡΡΡ Π½ΠΎΠ²ΠΎΡΡΡ, Π²Π°ΠΌ Π½ΡΠΆΠ½ΠΎ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ Π΅ΡΠ΅ ΠΎΠ΄ΠΈΠ½ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ ΡΠΎΠ±ΡΡΠΈΠΉ Π² Π½Π°ΡΠ΅ΠΌ Π΄Π΅Π»Π΅Π³Π°ΡΠ΅.
ΠΠ±ΡΠ°Π±ΠΎΡΠΊΠ° Π΄Π΅ΠΉΡΡΠ²ΠΈΠΉΒ ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠΉ
ΠΠ°ΠΆΠ΄ΡΠΉ ΡΠ°Π·, ΠΊΠΎΠ³Π΄Π° ΡΡΠ°Π±Π°ΡΡΠ²Π°Π΅Ρ Π΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ Π½Π° ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠΈ, UNUserNotificationCenter ΠΎΡΠΏΡΠ°Π²Π»ΡΠ΅Ρ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ Π΄Π΅Π»Π΅Π³Π°ΡΡ. ΠΠ°Π²Π°ΠΉΡΠ΅ Π²Π΅ΡΠ½Π΅ΠΌΡΡ Π² AppDelegate.swiftΒ ΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ ΡΠ»Π΅Π΄ΡΡΡΠ΅Π΅ ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΠ΅ Π² ΠΊΠΎΠ½ΡΠ΅ ΡΠ°ΠΉΠ»Π° AppDelegate.swift:
extension AppDelegate: UNUserNotificationCenterDelegate {
func userNotificationCenter(_ center: UNUserNotificationCenter,
didReceive response: UNNotificationResponse,
withCompletionHandler completionHandler: @escaping () -> Void) {
// 1
let userInfo = response.notification.request.content.userInfo
let aps = userInfo["aps"] as! [String: AnyObject]
// 2
if let newsItem = NewsItem.makeNewsItem(aps) {
(window?.rootViewController as? UITabBarController)?.selectedIndex = 1
// 3
if response.actionIdentifier == viewActionIdentifier,
let url = URL(string: newsItem.link) {
let safari = SFSafariViewController(url: url)
window?.rootViewController?.present(safari, animated: true, completion: nil)
}
}
// 4
completionHandler()
}
}
ΠΠ΄Π΅ΡΡ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ callback, ΠΊΠΎΡΠΎΡΡΠΉ Π²Ρ ΠΏΠΎΠ»ΡΡΠ°Π΅ΡΠ΅, ΠΊΠΎΠ³Π΄Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π·Π°ΠΏΡΡΠΊΠ°Π΅ΡΡΡ ΡΠ΅ΡΠ΅Π· ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΈΠ΅ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ. ΠΠΎΠΆΠ΅Ρ ΠΏΠΎΠΊΠ°Π·Π°ΡΡΡΡ, ΡΡΠΎ ΡΡΡ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ ΠΌΠ½ΠΎΠ³ΠΎ ΡΠ΅Π³ΠΎ, Π½ΠΎ Π½Π° ΡΠ°ΠΌΠΎΠΌ Π΄Π΅Π»Π΅ ΡΡΠΎ Π½Π΅ ΡΠ°ΠΊ:
- ΠΡ ΠΏΠΎΠ»ΡΡΠ°Π΅ΡΠ΅ aps ΡΠ»ΠΎΠ²Π°ΡΡ.
- ΠΠ°Π»Π΅Π΅ ΡΠΎΠ·Π΄Π°ΡΡΠ΅ NewsItem (Π½ΠΎΠ²ΡΡ ΡΡΠ΅ΠΉΠΊΡ) ΠΈΠ· ΡΠ»ΠΎΠ²Π°ΡΡ ΠΈ ΠΏΠ΅ΡΠ΅Ρ ΠΎΠ΄ΠΈΡΠ΅ Π² ΡΠ°Π·Π΄Π΅Π» Β«NewsΒ».
- ΠΡΠΎΠ²Π΅ΡΡΠ΅ΡΠ΅ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΠ΅ΡΠ΅Π΄Π°Π΅ΡΡΡ ΠΊΠ°ΠΊ identifier (actionIdentifier). ΠΡΠ»ΠΈ ΡΡΠΎ Π΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ Β«View» и ΡΡΡΠ»ΠΊΠ° ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΡΠΌ URL-Π°Π΄ΡΠ΅ΡΠΎΠΌ, ΠΎΠ½Π° ΠΎΡΠΎΠ±ΡΠ°Π·ΠΈΡ ΡΡΡΠ»ΠΊΡ Π² SFSafariViewController.
- Π Π² Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΠΈ Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ Π·Π°Π²Π΅ΡΡΠ°ΡΡΠΈΠΉ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ (completionHandler()), ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΠ΅ΡΠ΅Π΄Π°Π΅ΡΡΡ Π½Π°ΠΌ ΡΠΈΡΡΠ΅ΠΌΠΎΠΉ ΠΏΠΎΡΠ»Π΅ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΡΠΊΡΠ΅Π½Π°.
ΠΡΡΡ Π΅ΡΠ΅ ΠΎΠ΄ΠΈΠ½ ΠΌΠΎΠΌΠ΅Π½Ρ: Π²Ρ Π΄ΠΎΠ»ΠΆΠ½Ρ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ Π΄Π΅Π»Π΅Π³Π°Ρ Π½Π° UNUserNotificationCenter. ΠΠΎΠ±Π°Π²ΡΡΠ΅ ΡΡΡ ΡΡΡΠΎΠΊΡ Π² Π½Π°ΡΠ°Π»Π΅ ΠΌΠ΅ΡΠΎΠ΄Π° application(_:didFinishLaunchingWithOptions:):
UNUserNotificationCenter.current().delegate = self
ΠΠ°ΠΏΡΡΡΠΈΡΠ΅ Π²Π°ΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅. ΠΠ°ΠΊΡΠΎΠΉΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π΅ΡΠ΅ ΡΠ°Π·, ΠΈ Π΄Π°Π²Π°ΠΉΡΠ΅ ΡΠΆΠ΅ ΠΎΡΠΏΡΠ°Π²ΠΈΠΌ Π΄ΡΡΠ³ΠΎΠ΅ ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠ΅ ΠΎ Π½ΠΎΠ²ΠΎΡΡΡΡ ΡΠΎ ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΉ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎΠΉ ΡΠ°ΡΡΡΡ:
{
"aps": {
"alert": "New Posts!",
"sound": "default",
"link_url": "https://raywenderlich.com",
"category": "NEWS_CATEGORY"
}
}
ΠΠ°ΠΆΠΌΠΈΡΠ΅ Π½Π° ΡΠΊΡΠ½, ΠΈ Π²Ρ ΡΠ²ΠΈΠ΄ΠΈΡΠ΅, ΡΡΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ WenderCast ΠΎΡΠΊΡΠΎΠ΅ΡΡΡ Π² Safari View Controller ΡΡΠ°Π·Ρ ΠΏΠΎΡΠ»Π΅ Π·Π°ΠΏΡΡΠΊΠ° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ:

ΠΠΎΠ·Π΄ΡΠ°Π²Π»ΡΡ, Π²Ρ ΡΠΎΠ»ΡΠΊΠΎ ΡΡΠΎ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π»ΠΈ ΡΠΊΡΠ½-ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠ΅! ΠΡΠΏΡΠ°Π²ΡΡΠ΅ Π΅ΡΠ΅ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΈ ΠΏΠΎΠΏΡΠΎΠ±ΡΠΉΡΠ΅ ΠΎΡΠΊΡΡΡΡ ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠ΅ ΡΠ°Π·Π½ΡΠΌΠΈ ΡΠΏΠΎΡΠΎΠ±Π°ΠΌΠΈ, ΡΡΠΎΠ±Ρ ΠΏΠΎΠ΄ΡΠΎΠ±Π½Π΅Π΅ ΡΠ²ΠΈΠ΄Π΅ΡΡ, ΠΊΠ°ΠΊ ΠΎΠ½ΠΎ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ.
Π’ΠΈΡ ΠΈΠ΅ Push-ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΡ
Π’ΠΈΡ ΠΈΠ΅ push-ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΡ ΠΌΠΎΠ³ΡΡ βΡΠ°Π·Π±ΡΠ΄ΠΈΡΡβ Π²Π°ΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ βΠ±Π΅ΡΡΡΠΌΠ½ΠΎβ, ΡΠΎ Π΅ΡΡΡ Π·Π°ΠΏΡΡΡΠΈΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π² ΡΠΎΠ½ΠΎΠ²ΠΎΠΌ ΡΠ΅ΠΆΠΈΠΌΠ΅ ΠΈ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡ Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ Π·Π°Π΄Π°ΡΠΈ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ WenderCast ΠΌΠΎΠΆΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΡΡ ΡΡΠ½ΠΊΡΠΈΡ Π΄Π»Ρ βΡΠΈΡ ΠΎΠ³ΠΎβ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ ΡΠΏΠΈΡΠΊΠ° ΠΏΠΎΠ΄ΠΊΠ°ΡΡΠΎΠ².
ΠΠ°ΠΊ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΠ΅Π±Π΅ ΠΏΡΠ΅Π΄ΡΡΠ°Π²ΠΈΡΡ, Π² ΠΏΠ°ΡΠ΅ Ρ Π²Π°ΡΠΈΠΌ ΡΠ΅ΡΠ²Π΅ΡΠ½ΡΠΌ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠΌ ΡΡΠΎ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π΄Π°ΠΆΠ΅ ΠΎΡΠ΅Π½Ρ ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎ. ΠΠ°ΡΠ΅ΠΌΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π½Π΅ Π½ΡΠΆΠ½ΠΎ Π±ΡΠ΄Π΅Ρ ΠΏΠΎΡΡΠΎΡΠ½Π½ΠΎ Π·Π°ΠΏΡΠ°ΡΠΈΠ²Π°ΡΡ Π΄Π°Π½Π½ΡΠ΅ - Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΠ°ΠΌΠΈ ΠΎΡΠΏΡΠ°Π²ΠΈΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ βΡΠΈΡ ΠΎΠ΅β push-ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠ΅, Π΅ΡΠ»ΠΈ Ρ Π²Π°Ρ ΠΏΠΎΡΠ²ΠΈΠ»ΠΈΡΡ Π½ΠΎΠ²ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅.

ΠΠ»Ρ Π½Π°ΡΠ°Π»Π° ΠΏΠ΅ΡΠ΅ΠΉΠ΄ΠΈΡΠ΅ Π² App Settings -> CapabilitesΒ ΠΈ Π²ΠΊΠ»ΡΡΠΈΡΠ΅ Background Modes (ΡΠΎΠ½ΠΎΠ²ΡΠΉ ΡΠ΅ΠΆΠΈΠΌ) Π΄Π»Ρ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ WenderCast. Π ΠΏΡΠΎΠ²Π΅ΡΡΡΠ΅ ΠΏΠΎΡΠ»Π΅Π΄Π½ΡΡ ΠΎΠΏΡΠΈΡ, Remote Notifications:
Π’Π΅ΠΏΠ΅ΡΡ Π²Π°ΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π±ΡΠ΄Π΅Ρ βΠΏΡΠΎΡΡΠΏΠ°ΡΡΡΡβ Π² ΡΠΎΠ½ΠΎΠ²ΠΎΠΌ ΡΠ΅ΠΆΠΈΠΌΠ΅, ΠΊΠΎΠ³Π΄Π° ΠΎΠ½ΠΎ ΠΏΠΎΠ»ΡΡΠΈΡ ΠΎΠ΄Π½ΠΎ ΠΈΠ· ΡΡΠΈΡ push-ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠΉ.
Π AppDelegate, Π·Π°ΠΌΠ΅Π½ΠΈΡΠ΅ application(_:didReceiveRemoteNotification:), Π½Π° ΡΠ»Π΅Π΄ΡΡΡΠ΅Π΅:
func application(
_ application: UIApplication,
didReceiveRemoteNotification userInfo: [AnyHashable : Any],
fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
let aps = userInfo["aps"] as! [String: AnyObject]
// 1
if aps["content-available"] as? Int == 1 {
let podcastStore = PodcastStore.sharedStore
// Refresh Podcast
// 2
podcastStore.refreshItems { didLoadNewItems in
// 3
completionHandler(didLoadNewItems ? .newData : .noData)
}
} else {
// News
// 4
_ = NewsItem.makeNewsItem(aps)
completionHandler(.newData)
}
}
ΠΡΠ°ΠΊ, Π΄Π°Π²Π°ΠΉΡΠ΅ ΡΠ°ΡΡΠΌΠΎΡΡΠΈΠΌ:
- ΠΡΠΎΠ²Π΅ΡΡΡΠ΅, ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ΠΎ Π»ΠΈ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ content-available ΡΠ°Π²Π½ΠΎΠ΅ 1, ΡΡΠΎΠ±Ρ ΠΌΡ ΠΏΠΎΠ½ΠΈΠΌΠ°Π»ΠΈ, ΡΠ²Π»ΡΠ΅ΡΡΡ Π»ΠΈ ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠ΅ βΡΠΈΡ ΠΈΠΌβ.
- ΠΠ΄Π΅ΡΡ ΠΎΠ±Π½ΠΎΠ²Π»ΡΠ΅ΡΡΡ ΡΠΏΠΈΡΠΎΠΊ ΠΏΠΎΠ΄ΠΊΠ°ΡΡΠΎΠ², ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅Ρ ΡΠΎΠ±ΠΎΠΉ ΡΠ΅ΡΠ΅Π²ΠΎΠΉ Π·Π°ΠΏΡΠΎΡ ΠΈΠ· ΡΡΠΎΠ³ΠΎ ΡΠ»Π΅Π΄ΡΠ΅Ρ ΡΠΎ, ΡΡΠΎ ΠΎΠ½ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Π°ΡΠΈΠ½Ρ ΡΠΎΠ½Π½ΠΎ.
- ΠΠΎΠ³Π΄Π° ΡΠΏΠΈΡΠΎΠΊ ΠΎΠ±Π½ΠΎΠ²ΠΈΠ»ΡΡ, Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ Π·Π°Π²Π΅ΡΡΠ°ΡΡΠΈΠΉ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ (completionHandler) ΠΈ ΡΠΎΠΎΠ±ΡΠ°Π΅Ρ ΡΠΈΡΡΠ΅ΠΌΠ΅, Π±ΡΠ»ΠΈ Π»ΠΈ Π·Π°Π³ΡΡΠΆΠ΅Π½Ρ Π½ΠΎΠ²ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅.
- ΠΡΠ»ΠΈ ΠΊ Π½Π°ΠΌ ΠΏΡΠΈΡΠ»ΠΎ Π½Π΅ ΡΠΈΡ ΠΎΠ΅ ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠ΅ (ΠΏΡΠ΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, ΡΡΠΎ ΡΠ°ΠΊ ΠΈ ΡΠ»ΡΡΠΈΠ»ΠΎΡΡ), ΡΠΎ ΡΠΎΠ³Π΄Π° ΠΏΡΠΎΡΡΠΎ ΡΠΎΠ·Π΄Π°Π΅ΠΌ Π΅ΡΠ΅ ΠΎΠ΄ΠΈΠ½ Π½ΠΎΠ²ΠΎΡΡΠ½ΠΎΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ (ΡΡΠ΅ΠΉΠΊΡ).
ΠΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎ Π²ΡΠ·ΡΠ²Π°ΠΉΡΠ΅ Π·Π°Π²Π΅ΡΡΠ°ΡΡΠΈΠΉ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ (completionHandler) Π² Π»ΡΠ±ΠΎΠΌ ΠΈΠ· ΠΏΠΎΠ»ΡΡΠ΅Π½Π½ΡΡ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠΎΠ² (Π² Π½Π°ΡΠ΅ΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅ ΡΡΠΎ Π»ΠΈΠ±ΠΎ ΡΠ°Π³ 3 ΠΈΠ»ΠΈ ΡΠ°Π³ 4). Π‘ΠΈΡΡΠ΅ΠΌΠ° ΡΠ»Π΅Π΄ΠΈΡ Π·Π° ΠΏΠΎΡΡΠ΅Π±Π»Π΅Π½ΠΈΠ΅ΠΌ ΡΠ½Π΅ΡΠ³ΠΈΠΈ ΠΈ Π²ΡΠ΅ΠΌΠ΅Π½Π΅ΠΌ, ΠΊΠΎΡΠΎΡΠΎΠ΅ Π²Π°ΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ Π² ΡΠΎΠ½ΠΎΠ²ΠΎΠΌ ΡΠ΅ΠΆΠΈΠΌΠ΅, ΠΈ ΠΏΡΠΈ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΏΡΠΎΡΡΠΎ Π·Π°ΠΊΡΡΡΠΎ.
ΠΠΎΡ ΠΈ Π²ΡΠ΅. Π§ΡΠΎΠ±Ρ ΠΏΡΠΎΠ²Π΅ΡΠΈΡΡ βΠ±Π΅ΡΡΡΠΌΠ½ΡΠ΅β ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΡ, ΠΏΠ΅ΡΠ΅Π΄Π°ΠΉΡΠ΅ ΡΠ»Π΅Π΄ΡΡΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΡΡ ΡΠ°ΡΡΡΒ (payload)Β ΡΠ΅ΡΠ΅Π· ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Pusher:
{
"aps": {
"content-available": 1
}
}
ΠΡΠ»ΠΈ Π²ΡΠ΅ ΠΏΡΠΎΡΠ»ΠΎ ΡΡΠΏΠ΅ΡΠ½ΠΎ, Π½ΠΈΡΠ΅Π³ΠΎ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΏΡΠΎΠΈΠ·ΠΎΠΉΡΠΈ, ΡΠΎ Π΅ΡΡΡ Π²Ρ Π½ΠΈ ΡΠ΅Π³ΠΎ Π½Π΅ ΡΠ²ΠΈΠ΄ΠΈΡΠ΅! Π§ΡΠΎΠ±Ρ ΡΠ²ΠΈΠ΄Π΅ΡΡ, ΠΊΠ°ΠΊ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ ΠΊΠΎΠ΄, Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π·Π°Π½ΠΎΠ²ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡ ΡΡ Π΅ΠΌΡ Π½Π° βWait for executable to be launchedβ ΠΈ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΠ΅ ΠΊΠΎΠ½ΡΡΠΎΠ»ΡΠ½ΡΡ ΡΠΎΡΠΊΡ Π² application(_:didReceiveRemoteNotification: fetchCompletionHandler:), ΡΡΠΎΠ±Ρ ΡΠ±Π΅Π΄ΠΈΡΡΡΡ, ΡΡΠΎ ΠΎΠ½Π° Π·Π°ΠΏΡΡΠ΅Π½Π°.
ΠΠΎΠ·Π΄ΡΠ°Π²Π»ΡΡ! ΠΡ Π·Π°Π²Π΅ΡΡΠΈΠ»ΠΈ Π΄Π°Π½Π½ΡΠΉ ΡΡΠΎΠΊ ΠΏΠΎ push-ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΡΠΌ ΠΈ ΡΠ΄Π΅Π»Π°Π»ΠΈ WenderCast ΠΏΠΎΠ»Π½ΠΎΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΡΠΌ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ Ρ push-ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΡΠΌΠΈ! ΠΠΎΠ½Π΅ΡΠ½ΡΠΉ ΠΏΡΠΎΠ΅ΠΊΡ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΠΊΠ°ΡΠ°ΡΡ Π·Π΄Π΅ΡΡ. ΠΠΎΠΌΠ½ΠΈΡΠ΅, ΡΡΠΎ Π²Π°ΠΌ Π²ΡΠ΅ ΡΠ°Π²Π½ΠΎ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ ΠΏΠ°ΠΊΠ΅ΡΠ° (bundle ID) ΠΈ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°ΡΡ, ΡΡΠΎΠ±Ρ Π²ΡΠ΅ Π·Π°ΡΠ°Π±ΠΎΡΠ°Π»ΠΎ (ΠΊΠ°ΠΊ ΠΌΡ ΡΡΠΎ ΡΠ΄Π΅Π»Π°Π»ΠΈ Π² ΡΠ°Π·Π΄Π΅Π»Π΅ Enabling the Push Notification Service).
ΠΠ΅ΡΠΌΠΎΡΡΡ Π½Π° ΡΠΎ, ΡΡΠΎ Π² Π½Π°ΡΠΈ Π΄Π½ΠΈ push-ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΡ ΡΠ²Π»ΡΡΡΡΡ ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ· Π²Π°ΠΆΠ½ΡΡ ΠΌΠΎΠΌΠ΅Π½ΡΠΎΠ² Π² ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡΡ , ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΠΌ Π΄ΠΎΠ²ΠΎΠ»ΡΠ½ΠΎ ΡΠ°ΡΡΠΎ ΠΎΡΠΊΠ»ΠΎΠ½ΡΡΡ ΡΠ°Π·ΡΠ΅ΡΠ΅Π½ΠΈΡ Π΄Π»Ρ Π½ΠΈΡ , Π΅ΡΠ»ΠΈ Π²Π°ΡΠΈ ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΡ Π±ΡΠ΄ΡΡ ΠΏΡΠΈΡ ΠΎΠ΄ΠΈΡΡ ΡΠ»ΠΈΡΠΊΠΎΠΌ ΡΠ°ΡΡΠΎ. ΠΠΎ Ρ ΠΏΡΠΎΠ΄ΡΠΌΠ°Π½Π½ΡΠΌ Π΄ΠΈΠ·Π°ΠΉΠ½ΠΎΠΌ, push-ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΡ Π²ΡΠ΅ ΠΆΠ΅ ΠΏΠΎΠΌΠΎΠ³Π°ΡΡ Π·Π°Π²Π»Π΅ΡΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ Π² Π²Π°ΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΡΠ½ΠΎΠ²Π° ΠΈ ΡΠ½ΠΎΠ²Π°! :]
Π ΡΡΠΎ Π΄Π°Π»ΡΡΠ΅?
ΠΠ°Π»ΡΡΠ΅, Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠΈΡΡ ΠΈΠ·ΡΡΠ°ΡΡ Π½Π°ΡΠΈ ΡΡΡΠΎΡΠΈΠ°Π»Ρ ΠΏΠΎ ΠΌΠ΅ΡΠ΅ ΠΈΡ ΠΏΠΎΡΠ²Π»Π΅Π½ΠΈΡ, Π° ΡΠ°ΠΊΠΆΠ΅, ΠΏΠ°ΡΠ°Π»Π»Π΅Π»ΡΠ½ΠΎ ΡΠΈΡΠ°ΡΡ ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄ ΠΎΡΠΈΡΠΈΠ°Π»ΡΠ½ΠΎΠΉΒ ΠΊΠ½ΠΈΠ³ΠΈ ΠΏΠΎ ΡΠ·ΡΠΊΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ Swift. Π, Π΄Π»Ρ Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎΠ³ΠΎ ΠΈΠ·ΡΡΠ΅Π½ΠΈΡ ΡΠ·ΡΠΊΠ°, Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΏΡΠΎΠΉΡΠΈΒ Π½Π°ΡΠΈ ΠΊΡΡΡΡ!
Π£ΡΠΎΠΊ ΠΏΠΎΠ΄Π³ΠΎΡΠΎΠ²ΠΈΠ»: ΠΡΠΎΡΠ²ΠΈΡΡΠΊΠΎΠ² ΠΠ°Π΄ΠΈΠΌ