Π’ΡƒΡ‚ΠΎΡ€ΠΈΠ°Π»Ρ‹
28 июля 2017
Π’ΡƒΡ‚ΠΎΡ€ΠΈΠ°Π»Ρ‹
28 июля 2017
Push Notifications

Π—Π°ΠΌΠ΅Ρ‚ΠΊΠ°

Π”Π°Π½Π½ΠΎΠ΅ ΡƒΡ‡Π΅Π±Π½ΠΎΠ΅ пособиС ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ хотя Π±Ρ‹ 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
}

Π­Ρ‚ΠΎΡ‚ ΠΊΠΎΠ΄ выполняСт Ρ‚Ρ€ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ:

  1. Он провСряСт, сущСствуСт Π»ΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ для UIApplicationLaunchOptionsKey.remoteNotification Π² launchOptions, и Ссли ΠΎΠ½ΠΎ сущСствуСт, Ρ‚ΠΎ ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ доступ ΠΊ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠΉ части push-увСдомлСния, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅Β Π²Ρ‹ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΠ»ΠΈ.
  2. Если Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ Π²Ρ‹ΡˆΠ΅ сущСствуСт, Ρ‚ΠΎ Π²Ρ‹ ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚Π΅ ΡΠ»ΠΎΠ²Π°Ρ€ΡŒ aps (notification["aps"]) ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚Π΅ Π΅Π³ΠΎ Π² созданиС NewNewsItem(_ :), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ прСдставляСт собой Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄, прСдоставляСмый для создания NewsItem (Π½ΠΎΠ²ΠΎΠΉ ячСйки) ΠΈΠ· словаря ΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ новостСй.
  3. И Π½Π°ΠΊΠΎΠ½Π΅Ρ†, ΠΎΠ½ измСняСт Π²Ρ‹Π±Ρ€Π°Π½Π½ΡƒΡŽ Π²ΠΊΠ»Π°Π΄ΠΊΡƒ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Π° Π½Π° Π²ΠΊΠ»Π°Π΄ΠΊΡƒ 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()
  }
}

Π§Ρ‚ΠΎ наш Π½ΠΎΠ²Ρ‹ΠΉ ΠΊΠΎΠ΄ Π΄Π΅Π»Π°Π΅Ρ‚ :

  1. Π—Π΄Π΅ΡΡŒ Π²Ρ‹ создаСтС Π½ΠΎΠ²ΠΎΠ΅ ΡƒΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠ΅ с ΠΊΠ½ΠΎΠΏΠΊΠΎΠΉ ΠΏΠΎΠ΄ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ Β«ViewΒ», ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Ρ‚ΡŒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π° ΠΏΠ΅Ρ€Π΅Π΄Π½ΠΈΠΉ ΠΏΠ»Π°Π½Π΅ ΠΏΡ€ΠΈ Π΅Π³ΠΎ запускС. Наш созданный экшн ΠΈΠΌΠ΅Π΅Ρ‚ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для отличия Π΅Π³ΠΎ ΠΎΡ‚ Π΄Ρ€ΡƒΠ³ΠΈΡ… дСйствий.
  2. Π—Π°Ρ‚Π΅ΠΌ Π²Ρ‹ опрСдСляСтС ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΡŽ новостСй, которая содСрТит ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ дСйствий (let viewAction). Он Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΠΌΠ΅Π΅Ρ‚ свой ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π΄ΠΎΠ»ΠΆΠ½Π°Β ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Π°Ρ Ρ‡Π°ΡΡ‚ΡŒ увСдомлСния, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ push-ΡƒΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠ΅ относится ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΊ этой ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΈ.
  3. И Π½Π°ΠΊΠΎΠ½Π΅Ρ†, вызывая 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, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚Π΅, ΠΊΠΎΠ³Π΄Π° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ запускаСтся Ρ‡Π΅Ρ€Π΅Π· ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠ΅ дСйствия. ΠœΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ Ρ‚ΡƒΡ‚ происходит ΠΌΠ½ΠΎΠ³ΠΎ Ρ‡Π΅Π³ΠΎ, Π½ΠΎ Π½Π° самом Π΄Π΅Π»Π΅ это Π½Π΅ Ρ‚Π°ΠΊ:

  1. Π’Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚Π΅ aps ΡΠ»ΠΎΠ²Π°Ρ€ΡŒ.
  2. Π”Π°Π»Π΅Π΅ создаётС NewsItem (Π½ΠΎΠ²ΡƒΡŽ ячСйку) ΠΈΠ· словаря ΠΈ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚Π΅ Π² Ρ€Π°Π·Π΄Π΅Π» Β«NewsΒ».
  3. ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡΠ΅Ρ‚Π΅ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ дСйствия, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ пСрСдаСтся ΠΊΠ°ΠΊ identifier (actionIdentifier). Если это дСйствиС Β«View»  ΠΈ ссылка являСтся ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Ρ‹ΠΌ URL-адрСсом, ΠΎΠ½Π° ΠΎΡ‚ΠΎΠ±Ρ€Π°Π·ΠΈΡ‚ ссылку Π² SFSafariViewController.
  4. И Π² Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠΈ вызываСтся Π·Π°Π²Π΅Ρ€ΡˆΠ°ΡŽΡ‰ΠΈΠΉ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ (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)
  }
}

Π˜Ρ‚Π°ΠΊ, Π΄Π°Π²Π°ΠΉΡ‚Π΅ рассмотрим:

  1. ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅, установлСно Π»ΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ content-available Ρ€Π°Π²Π½ΠΎΠ΅ 1, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΌΡ‹ ΠΏΠΎΠ½ΠΈΠΌΠ°Π»ΠΈ, являСтся Π»ΠΈ ΡƒΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠ΅ β€œΡ‚ΠΈΡ…ΠΈΠΌβ€.
  2. Π—Π΄Π΅ΡΡŒ обновляСтся список подкастов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ прСдставляСт собой сСтСвой запрос ΠΈΠ· этого слСдуСт Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ асинхронно.
  3. Когда список обновился, вызываСтся Π·Π°Π²Π΅Ρ€ΡˆΠ°ΡŽΡ‰ΠΈΠΉ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ (completionHandler) ΠΈ сообщаСт систСмС, Π±Ρ‹Π»ΠΈ Π»ΠΈ Π·Π°Π³Ρ€ΡƒΠΆΠ΅Π½Ρ‹ Π½ΠΎΠ²Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅.
  4. Если ΠΊ Π½Π°ΠΌ ΠΏΡ€ΠΈΡˆΠ»ΠΎ Π½Π΅ Ρ‚ΠΈΡ…ΠΎΠ΅ ΡƒΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠ΅ (ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊ ΠΈ ΡΠ»ΡƒΡ‡ΠΈΠ»ΠΎΡΡŒ), Ρ‚ΠΎ Ρ‚ΠΎΠ³Π΄Π° просто создаСм Π΅Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ новостной элСмСнт (ячСйку).

ΠžΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π²Ρ‹Π·Ρ‹Π²Π°ΠΉΡ‚Π΅ Π·Π°Π²Π΅Ρ€ΡˆΠ°ΡŽΡ‰ΠΈΠΉ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ (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. И, для Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎΠ³ΠΎ изучСния языка, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΡ€ΠΎΠΉΡ‚ΠΈΒ Π½Π°ΡˆΠΈ курсы!

Π£Ρ€ΠΎΠΊ ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΈΠ»: ΠŸΡ€ΠΎΡΠ²ΠΈΡ€ΡΠΊΠΎΠ² Π’Π°Π΄ΠΈΠΌ

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ ΡƒΡ€ΠΎΠΊΠ°.


ΠžΡ†Π΅Π½ΠΈΡ‚Π΅ ΡΡ‚Π°Ρ‚ΡŒΡŽ
0
0
0
0
0

Π§Ρ‚ΠΎΠ±Ρ‹ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ, Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·ΡƒΠΉΡ‚Π΅ΡΡŒ
Π’ΠΎΠΉΡ‚ΠΈ
Π‘Π΅Π·ΡƒΠΌΠΎΠ²Π° Π’ΠΈΠΎΠ»Π°
ΠŸΠΈΡˆΠ΅Ρ‚ ΠΈ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ΠΈΡ‚ ΡΡ‚Π°Ρ‚ΡŒΠΈ для SwiftBook