Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Modeler   Code  
»áÔ±   
 
   
 
 
     
   
 ¶©ÔÄ
  ¾èÖú
iOS ¿ª·¢ÖУ¬ÔõÑùÓúà Notifications£¿
 
×÷Õߣº¹ÊØ·µÀ³¤  À´Ô´£ºjianshu ·¢²¼ÓÚ£º 2017-4-28
  2704  次浏览      27
 

ǰÑÔ

ÔÚ iOS ¿ª·¢ÖУ¬ÓÐÕâÑùÒ»¸ö³¡¾°£ºÄ³¼þÖØÒªµÄÊÂÇ鱨ÐëÁ¢¿ÌÈÃÓû§ÖªµÀ£¬ÉõÖÁ²»Ï§ÒÔ´ò¶ÏÓû§µ±Ç°²Ù×÷Ϊ´ú¼ÛÀ´Ç¿µ÷Õâ·ÝÖØÒªÐÔ¡£Õâ¾ÍÊÇ֪ͨ£¨Notifiations£©¡£Ä¿Ç°³£ÓõĿò¼ÜΪ UserNotifications£¬ËüÖ÷ÒªÓÃÀ´ÔÚËøÆÁºÍÓ¦ÓýçÃæÍ¨¹ýµ¯´°À´ÏÔʾ֪ͨ¡£ÁíÒ»¸ö¿ò¼ÜÊÇ Notification Center £¬ÒÔËüʵÏֵĿç object ֪ͨÒÔ¼°Ô­ÉúµÄ KVO(Key-Value-Observing) ÊÇ iOS Öй۲ìÕßģʽµÄÖ÷ҪʵÏÖÊֶΡ£

±¾ÎÄÄÚÈÝ£º

UserNotifications ½éÉÜ

±¾µØÍ¨Öª£¨Local Notifications£©

Ô¶³Ì֪ͨ£¨Remote Notifications£©

¹Û²ìÕßģʽ£¨Observer Pattern£©

UserNotifications ½éÉÜ

UserNotifications ÊÇ iOS 10 ¸Õ¸ÕÒýÈëµÄȫпò¼Ü¡£ÓëÒÔÍù°æ±¾µÄ±¾µØÍ¨ÖªºÍÔ¶³Ì֪ͨ·Ö±ð´¦Àí²»Í¬£¬Õâ´ÎÆ»¹û°ÑÁ½ÕßµÄ API ͳһ¡£´Ó´ËÒÔºó£¬ÎÞÂÛ´¦Àí±¾µØÍ¨Öª»¹ÊÇÔ¶³Ì֪ͨ£¬¶¼ÊÇÓà UserNotifications ¿ò¼Ü¡£

UserNotifications µÄÁ÷³ÌҲʮ·Ö¼òµ¥£¬Ö÷Òª·ÖÒÔÏ 4 ²½£º

UserNotifications Á÷³Ì

×¢²á

ͨ¹ýµ÷Óà requestAuthorization Õâ¸ö·½·¨£¬Í¨ÖªÖÐÐÄ»áÏòÓû§·¢ËÍ֪ͨÐí¿ÉÇëÇó¡£ÔÚµ¯³öµÄ Alert Öеã»÷ͬÒ⣬¼´¿ÉÍê³É×¢²á¡£

´´½¨

Èç¹ûÊDZ¾µØÍÆËÍ£¬ÔòÔÚ AppDelegate ÖÐÉèÖÃÍÆËͲÎÊý£»Èç¹ûÊÇÔ¶³ÌÍÆËÍ£¬ÔòÎÞÐèÉèÖòÎÊý£¬ÍÆË͵ÄÄÚÈݺʹ¥·¢Ê±¼ä¶¼ÔÚÔ¶³Ì·þÎñÆ÷¶ËÅäÖá£

ÍÆËÍ

ÕâÒ»²½¾ÍÊÇϵͳ»òÕßÔ¶³Ì·þÎñÆ÷ÍÆËÍ֪ͨ¡£°éËæ×ÅÒ»ÉùÇå´àµÄÏìÉù£¨»ò×Ô¶¨ÒåµÄÉùÒô£©£¬Í¨Öª¶ÔÓ¦µÄUIÏÔʾµ½ÊÖ»ú½çÃæµÄ¹ý³Ì¡£

ÏìÓ¦

µ±Óû§¿´µ½Í¨Öªºó£¬µã»÷½øÈ¥»áÓÐÏàÓ¦µÄÏìӦѡÏî¡£ÈçÏÂͼ£º

ÀýÈç Instagram Õâ¸ö App £¬Óû§¿´µ½ËüµÄ֪ͨºóÓÐ3¸öÑ¡ÏһÊÇ Like , µã»÷Ö®ºó¾ÍÊǸøÄãÅóÓѵÄÕÕÆ¬µãÔÞ£»ÁíÒ»¸öÊÇ Quick Reply£¬µã»÷Ö®ºó¿ÉÒÔÆÀÂÛÕÕÆ¬£»×îºóÊÇ View Post£¬µã»÷Ö®ºóÊǽøÈë Instagram Ö÷ App ½øÐÐÕÕÆ¬ä¯ÀÀ¡£Óû§²»Í¬µÄÑ¡Ôñ¾ö¶¨ÁËÖ®ºóµÄ²Ù×÷£¬±ÊÕß³ÆÕâ¸ö¹ý³ÌÊÇ¶Ô Notification µÄÏìÓ¦¡£

±¾µØÍ¨Öª

ÒòΪ֪ͨÊÇÕë¶ÔÕû¸ö App ¼¶±ðµÄ¹¦ÄÜ£¬ËùÒÔÒ»°ãÔÚ AppDelegate ÖÐÍê³É×¢²áºÍ´´½¨µÄ¹ý³Ì¡£´úÂëÈçÏ£º

/// ×¢²á
UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .sound, .badge]) { accepted, error in
if !accepted {
print("Notification access denied.")
}
}

/// ´´½¨
func scheduleNotification(at date: Date) {
/// ´¥·¢»úÖÆ
let calendar = Calendar(identifier: .gregorian)
let components = calendar.dateComponents(in: .current, from: date)
let newComponents = DateComponents(calendar: calendar, timeZone: .current, month: components.month, day: components.day, hour: components.hour, minute: components.minute)
let trigger = UNCalendarNotificationTrigger(dateMatching: newComponents, repeats: false)

/// ֪ͨÄÚÈÝ
let content = UNMutableNotificationContent()
content.title = "Tutorial Reminder"
content.body = "Just a reminder to read your tutorial over at Soapyigu's Swift30Projects!"
content.sound = UNNotificationSound.default()

/// ´«Èë²ÎÊý
let request = UNNotificationRequest(identifier: "textNotification", content: content, trigger: trigger)

/// ½«´´½¨ºÃµÄ֪ͨ´«Èë֪ͨÖÐÐÄ
UNUserNotificationCenter.current().removeAllPendingNotificationRequests()
UNUserNotificationCenter.current().add(request) { error in
if let error = error {
print("Uh oh! We had an error: \(error)")
}
}
}

ÔÚ´´½¨¹ý³ÌÖУ¬ÓÐÒÔϼ¸µãÖµµÃ×¢Ò⣺

´¥·¢»úÖÆ¡£Èç¹ûÊÇʱ¼ä´¥·¢£¬¾ÍÓà UNCalendarNotificationTrigger£»Èç¹ûÊǵص㴥·¢£¬¾ÍÓà UNLocation?Notification?Trigger¡£

֪ͨÄÚÈÝ¡£³ýÁ˱êÌ⣨title£©¡¢ÄÚÈÝ£¨body£©¡¢ÉùÒô£¨sound£©Í⣬»¹¿ÉÒÔÌí¼Ó¸±±êÌ⣨subTitle£©ÉõÖÁÊÇͼƬ¡£Ìí¼ÓͼƬµÄʾÀý´úÂëÈçÏ£º

/// ½«Í¼Æ¬Ìí¼Óµ½Í¨ÖªÖÐ
if let path = Bundle.main.path(forResource: "Swift", ofType: "png") {

/// ͨ¹ý±¾µØÍ¼Æ¬ Swift.png µÄ·¾¶´´½¨ URL
let url = URL(fileURLWithPath: path)

do {
let attachment = try UNNotificationAttachment(identifier: "Swift", url: url, options: nil)

/// ÉèÖÃÄÚÈݵĸ½¼þ£¬½«Í¼Æ¬´«Èë
/// Äã¿ÉÒÔ´«¶à¸öͼƬ½øÈ룬µ«Ö»»áÏÔʾµÚÒ»¸öͼƬ
/// µ±È»ÄãÒ²¿ÉÒÔ¸ù¾Ý²»Í¬Çé¿öÏÔʾ²»Í¬Í¼Æ¬
content.attachments = [attachment]
} catch {
print("The attachment was not loaded.")
}
}

Identifier¡£Ò»¸ö App ¿ÉÄÜÓжàÖÖ±¾µØÍ¨Öª£¬ËüÃÇÖ®¼äÊÇͨ¹ý Identifier ½øÐÐÇø·ÖµÄ¡£

½«´´½¨ºÃµÄ֪ͨ´«Èë֪ͨÖÐÐÄ¡£¶à¸ö Notifications Ö®¼äÓÐÏȺó˳Ðò£¬ËüÃÇÅųɶÓÁÐÔÚ֪ͨÖÐÐÄÖС£ÕâÀïÎÒÃÇΪÁË·½±ãÑÝʾ£¬É¾³ýÁËÒÔǰËùÓеÄ֪ͨ¡£

Íê³ÉÁË×¢²áºÍ´´½¨£¬ÎÒÃÇÖ»ÒªÔÚºÏÊʵÄʱ¼äÈÃÏµÍ³ÍÆËÍ֪ͨ¼´¿É¡£´úÂëÖбíÏÖΪÔÚij¸öʱ¼äµãµ÷ÓÃscheduleNotification(date)¡£Ö®ºóÎÒÃǾͿÉÒÔ¿´µ½ÏàÓ¦µÄ֪ͨµ¯³ö£º

Ò»°ãÇé¿öÏÂÓû§»áµã»÷ֱ֪ͨ½Ó½øÈë App ²é¿´¡£¼ÙÈçҪʵÏÖÔÚ֪ͨ³öÏÖʱ¿ìËÙ²Ù×÷£¬±ÈÈç¹ý10·ÖÖÓÔÙÌáÐÑÎÒÕâÑùµÄÑ¡ÏÎÒÃÇÓÖ¸ÃÔõô×öÄØ£¿ÕâʱºòÎÒÃÇÒýÈëUNNotificationActionºÍUNNotificationCategory¡£

UNNotificationAction: ÏìӦ֪ͨµÄµ¥¸ö¾ßÌå²Ù×÷¡£ÀýÈçÖ±½Ó¸øÏà¹ØÍÆËÍÐÅÏ¢µãÔÞ¡£

UNNotificationCategory: ÏìÓ¦²Ù×÷¶ÔÓ¦µÄÀà±ð¡£Ï൱ÓÚÊǶà¸ö UNNotificationAction ¹¹³ÉµÄȺ×飬±íÃ÷Ò»ÀàÏìÓ¦²Ù×÷¡£

ÏÂÃæÒ»¶Î´úÂë¾ÍÊÇ´´Á¢ÁËÒ»¸ö "Remind me later" µÄ UNNotificationAction ÏìÓ¦²Ù×÷£¬²¢½«Æä¼ÓÈëµ½ "normal" µÄ

UNNotificationCategory Àà±ðÖ®ÖС£

let action = UNNotificationAction(identifier: "remindLater", title: "Remind me later", options: [])
let category = UNNotificationCategory(identifier: "normal", actions: [action], intentIdentifiers: [], options: [])
UNUserNotificationCenter.current().setNotificationCategories([category])

ÓÐÁËÉÏÃæ´úÂ룬µ±Óû§µã»÷֪ͨ£¬ÎÒÃǾÍÄÜ¿´µ½ÏàÓ¦µÄ¿ì½Ý²Ù×÷¡£ÄÇôÓû§µã»÷ ¡°Remind me later¡± £¬ÎÒÃǸÃÈçºÎÔÚ App ÖÐÉèÖöÔÓ¦µÄ²Ù×÷£¬ÈÃϵͳÔÚ10·ÖÖÓºóÔÙ´ÎÍÆËÍÏìÓ¦Í¨ÖªÄØ£¿

ºÜ¼òµ¥£¬ÎÒÃÇÖ»ÒªÔÚUNUserNotificationCenterDelegate ЭÒéÖÐʵÏÖuserNotificationCenter(_:didReceive:withCompletionHandler:)

¡£µ±Óû§µã»÷֪ͨѡÏîʱ£¬Õâ¸ö·½·¨×Ô¶¯±»µ÷Óá£ÕâÀïÎÒÃÇͨ¹ý identifier À´ÅжϾßÌåÊÇÄÄÒ»¸öÑ¡Ïî±»µã»÷£¬ÔÙµ÷ÓöÔÓ¦ÏìÓ¦·½·¨¼´¿É¡£

extension AppDelegate: UNUserNotificationCenterDelegate {
func userNotificationCenter
(_ center: UNUserNotificationCenter, didReceive response:
UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
if response.actionIdentifier == "remindLater" {
let newDate = Date(timeInterval: 600, since: Date())
scheduleNotification(at: newDate)
}
}
}

Ô¶³Ì֪ͨ

ÔÙ½Ó´¥Ô¶³Ì´úÂëµÄ¾ßÌåʵÏÖ֮ǰ£¬ÎÒÃÇÏÈÀ´¿´¿´Ô¶³Ì֪ͨµÄÔ­Àí£º

Ô¶³Ì֪ͨ

App Ïò iOS ϵͳÉêÇëÍÆËÍȨÏÞ

iOS ϵͳÏò APNs(Apple Push Notification Service) ÇëÇóÊÖ»ú device token£¬²¢¸æËß App£¬ÄܽÓÊÜÍÆË͵Ä֪ͨ¡£

App ½«ÊÖ»úµÄ device token ´«¸øºó¶Ë

ºó¶ËÏò APNs ÍÆËÍ֪ͨ

APNs ½«ÏìÓ¦Í¨ÖªÍÆË͸øÏìÓ¦ÊÖ»ú

´ÓÒÔÉÏÁ÷³ÌÎÒÃÇ¿ÉÒÔ¿´³ö£¬APNs ÔÚÕâÀïÆô¶¯Á˼à¹ÜÕߺÍÍйÜÕßµÄ×÷Óã¬ÎÞÂÛÊÇÇëÇó»¹ÊÇÍÆËͶ¼Òª¾­¹ý APNs¡£Ò²¾ÍÊÇ˵£¬ËùÓеÄÍÆËͶ¼±ØÐë°´ÕÕ APNs µÄÓÎÏ·¹æÔòÀ´¡£

ÓÐÈ˵½ÕâÀïÒªÎÊÁË£¬ËùÓÐÍÆËͶ¼Ö¸Íû APNs£¬ÄÇÁ÷Á¿ÄÇô´ó£¬APNs ±ÀÁËÔõô°ì£¿

ÕâȷʵÊÇÕâ¸öϵͳµÄÒ»¸ö±×¶Ë£¬¾ÍÊÇñîºÏ¶ÈÌ«¸ß£¬¹ýÓÚÖ¸Íû APNs ºÜÈÝÒ×Ôì³Éµ¥µã¹ÊÕÏ¡£ËùÒÔ£¬Æ»¹ûÔÚ iOS 10 ÒÔǰ£¬¶ÔÓÚÔ¶³Ì֪ͨµÄÄÚÈÝ£¬×öÁËÒÔÏÂÏÞÖÆ£º

In iOS 8 and later, the maximum size allowed for a notification payload is 2 kilobytes; Apple Push Notification service refuses any notification that exceeds this limit. (Prior to iOS 8 and in OS X, the maximum payload size is 256 bytes.)

¾ÍÊÇ˵£¬×î¶à´« 2 KB ֪ͨ¡£ÕâÑù¼´Ê¹ 1 ÃëÖÓÄÚÓÐ 100 Íò¸öÔ¶³ÌÍÆËÍͬʱ·¢Éú£¬Ò²¾Í 2 GB¡£Õâ¶ÔÓÚÒ»¸ö´ó¹«Ë¾À´ËµºÁÎÞѹÁ¦¡£

ºóÀ´ÔÚ iOS 10 ÖУ¬Æ»¹ûÒýÈëÁË Notification Content Extension ºÍ Notification Service Extension£¬Õâʱºò¾Í¿ÉÒÔÐÞ¸ÄÔ­À´µÄ notification ÄÚÈÝÁË£¬±ÈÈçÌí¼Ó¶àýÌåÎļþÖ®Àà¡£½²ÕâÁ½¸ö extension µÄÎÄÕÂÌ«¶à£¬±ÊÕßÕâÀï²»×÷׸Êö£¬Ö»ÌṩÒÔÏÂÔ­ÀíͼһÕÅ¡£

ÏÂÃæÎÒÃÇÀ´¿´Ï¾ßÌåÔõôʵÏÖ¡£Ô¶³ÌÍÆËÍÓë±¾µØÍÆËͲ»Í¬ÔÚÓÚ£¬ÔÚ×¢²á֪ͨǰ£¬ÏÈÒªÉèÖà App ʹÆäÔÊÐíÔ¶³Ì֪ͨ¡£¾ßÌå×ö·¨¾ÍÊÇÈ¥ App Settings -> Capabilities -> Push Notifications£¬´ò¿ª Push Notificaitons¡£

½ÓמÍÊÇÀϲ½Öè×¢²á¡£×¢ÒⲻͬµÄÊÇÕâ´ÎҪ˵Ã÷ÊÇÔ¶³Ì֪ͨ¡£´úÂëÈçÏ£º

UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .sound, .badge]) { accepted, error in
if !accepted {
print("Notification access denied.")
}
}
/// ×¢²áÔ¶³Ì֪ͨ£¬´Ë´¦Óë±¾µØÍ¨Öª²»Í¬
application.registerForRemoteNotifications()

Ô¶³Ì֪ͨµÄÄÚÈÝÓÉÔ¶³Ì·þÎñÆ÷¾ö¶¨£¬±¾µØÎÞÐè´´½¨¡£·þÎñÆ÷¶ËÐèÒªÒÔϼ¸¸ö¹Ø¼üÊý¾ÝÀ´È·È϶ÔÖ¸¶¨µÄÊÖ»ú½øÐÐÍÆËÍ£º

Device Token: APNs ÓÃÀ´È·ÈϾ¿¾¹ÊÇÄĄ̈»úÆ÷£¬Äĸö AppµÄ²ÎÊý¡£Ëü¿ÉÒÔͨ¹ýÒÔÏ´úÂë»ñÈ¡¡£

func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {  
/// ½« device token ת»¯Îª×Ö·û´®
let deviceTokenString = deviceToken.reduce("", {$0 + String(format: "%02X", $1)})
/// ½« device token ´òÓ¡µ½ console ÀïÃæ
print("APNs device token: \(deviceTokenString)
}

¿ª·¢ App µÄÕýÈ·×ö·¨ÊÇ°Ñ Device Token ·¢Ë͵½·þÎñÆ÷¶Ë£¬ÕâÀïΪÁËÑÝʾ·½±ã£¬¾ÍÖ±½Ó´òÓ¡³öÀ´ÁË¡£Device Token ´ó¸Å³¤ÏÂÃæÕâÑù£º

5311839E985FA01B56E7AD74334C0137F7D6AF71A22745D0FB50DED665E0E882

Key ID: ºǫ́·þÎñÆ÷·¢ËÍ֪ͨʱ£¬ APNs ¶ÔÆäµÄÈÏÖ¤ºÅÂë¡£ËüÐèÒªÄãÈ¥¿ª·¢ÕßÖÐÐÄ×¢²á APNs Auth Key¡£Ëü»á²úÉúÒ»¸ö .p8 Îļþ£¬Key ID ¾ÍÔÚÆäÖС£

APNs Auth Key

Team ID: Äã Apple ID ¶ÔÓ¦µÄºÅÂë¡£¿ÉÒÔÔÚ App Settings -> Bundle Identifier ÀïÕÒµ½¡£

ÕâÑù·þÎñÆ÷¾Í¿ÉÒÔÏòÄãµÄÊÖ»ú·¢ËÍ֪ͨÁË¡£¼ÓÈëÏìÓ¦²Ù×÷£¬Í¬ÑùÊǽèÖúUNNotificationActionºÍUNNotificationCategory £¬²¢µ÷ÓÃuserNotificationCenter(_:didReceive:withCompletionHandler:)£¬Óë±¾µØÍÆË͵ÄÏìÓ¦´¦ÀíÊÇһģһÑùµÄ¡£

¹Û²ìÕßģʽ

¹Û²ìÕßģʽÊÇÉè¼ÆÄ£Ê½ÖеÄÒ»ÖÖ£¬¾ÍÊÇ˵һ¸ö¶ÔÏóµ±×ÔÉíijЩ״̬·¢Éú±ä»¯µÄʱºò£¬×ÔÉí·¢ÉúÏàÓ¦²Ù×÷»ò֪ͨ¸øÁíÒ»¸ö¶ÔÏó¡£¶ÔÏóÖ®¼äÎÞÐèÓÐÖ±½Ó»ò¼ä½ÓµÄ¹ØÏµ¡£ÕâÖÖÉè¼ÆÄ£Ê½µÄ×î´óµÄºÃ´¦ÊÇÔÚÓÚ½âñî¡£ÒòΪÁ½¸ö¶ÔÏó¿ÉÒԷֱ𵥶ÀÉè¼Æ£¬Ö»ÐèÔÚÌØ¶¨Çé¿öÏÂ֪ͨ¶Ô·½¼´¿É¡£

ÏÂÃæÇë¿´Ò»µÀÃæÊÔÌ⣺Çë×ÔÐÐÉè¼Æ Swift µÄ Notification API£¬Ê¹ÆäÄܹ»ÊµÏÖ iOS ÖеĹ۲ìÕßģʽ¡£

Äõ½ÕâµÀÌâÄ¿£¬ÎÒÃÇÊ×ÏÈÒª·ÖÎö Notification API ¶ÔÓÚ¹Û²ìÕßÄ£Ð͵ÄʹÓó¡¾°£¬Î޷ǾÍÊÇÁ½ÖÖ£º¿ç object ֪ͨ£¬ÒÔ¼° KVO£¨Key-Value-Observing£©¡£

¿ç object ֪ͨÒÔ¼° NotificationCenter Éè¼Æ

Ê×ÏÈÎÒÃÇÀ´¿´¿ç object ֪ͨ¡£Ò»¸ö×î¼òµ¥µÄÓ¦Óó¡¾°£¬µ±Ò»¸ö ViewController ³õʼ»¯Ê±£¬ËüҪ֪ͨ Network ²¿·ÖÈ¥ÏÂÔØÏàÓ¦µÄͼƬÒÔÌî³ä¶ÔÓ¦µÄ UIImageView¡£ËùÒÔÁ÷³ÌÈçÏ£º

Network ×¢²á¹Û²ì ViewController ³õʼ»¯ÐÐΪ

ViewController ·¢Éú³õʼ»¯ÐÐΪ£¬²¢·¢³öÏàӦ֪ͨ

Network µÃµ½Í¨Öª£¬¹Û²ìµ½ ViewController ÐÐΪµÄ·¢Éú

Network ¸ù¾Ý֪ͨ£¬µ÷Óà downloadImage ·½·¨

¸ù¾ÝÒÔÉÏÁ÷³Ì£¬ÎÒÃÇ·¢ÏÖÕâÖÖÂß¼­ÊÇ objects Ö®¼äµÄÐźŴ«µÝºÍ½ÓÊÕ¹ý³Ì¡£±È½ÏºÃµÄÉè¼Æ·½·¨Êǵ¥¶ÀÉè¼ÆÒ»¸ö Notification Àà±ð£¬ËüÏ൱ÓÚÊÇÒ»¸ö֪ͨµ÷¶ÈÖÐÐÄ£¬´¦ÀíÈÎÒâ objects Ö®¼äµÄ֪ͨ£¬¶ø²»Ó°Ïì objects ±¾ÉíµÄÆäËû²Ù×÷¡£ËùÒÔÎÒÃÇÉè¼Æ³öÁË NotificationCenter Õâ¸öÀà±ð£¬ËüÓÐÕâÁ½¸ö²Ù×÷£º

class NotificationCenter {

/* ×¢²á¹Û²ì
* observer£ºËµÃ÷Ë­Êǹ۲ìÕߣ¬´ËÀýÖÐÊÇ Network
* selector£ºÍ¨Öª·¢Éúºó¹Û²ìÕßµ÷Ó÷½·¨£¬´ËÀýÖÐΪ func downloadImage(url)
* notificationName£ºÍ¨ÖªÃû³Æ£¬ÓÃÀ´Ê¶±ð¾ßÌå֪ͨ
* object£ºÐÅÏ¢·¢ËÍÕߣ¬Èç¹ûΪ nil Ôò±íʾÈκη¢ËÍÕßÐÅÏ¢¶¼½ÓÊÜ£¬´ËÀýÖÐΪ ViewController
*/
func add(observer: Any, selector: Selector, notificationName: String, object: Any?)

/* ·¢ËÍ֪ͨ
* notificationName£ºÍ¨ÖªÃû³Æ£¬ÓÃÀ´Ê¶±ð¾ßÌå֪ͨ£¬ÓëÉÏÃæµÄ×¢²á¹Û²ì¶ÔÓ¦
* object£ºÐÅÏ¢·¢ËÍÕߣ¬´ËÀýÖÐΪ ViewController
* userInfo£ºÌṩ¸ø¹Û²ìÕßµÄÐÅÏ¢£¬´ËÀýÖÐΪÐèÒªÏÂÔØÍ¼Æ¬µÄ URL£¬ÒÔ¼°¶ÔÓ¦µÄImageView
*/
func post(notificationName: String, object: Any? , userInfo:[AnyHashable : Any]? = nil)
}

ÓÉÓÚÊÇ¿ç object Ö®¼äµÄ֪ͨ£¬ËùÒÔ¿ÉÖª´ËÀà֪ͨ¾ßÓÐÒ»°ãÐÔ£¬¹Ê¶ø NotificationCenter Éè¼ÆÎªµ¥Àý±È½ÏºÃ£º

class var default: NotificationCenter { get }

×îºó»¹Òª×¢ÒâÒ»¸öÎÊÌ⣬¾ÍÊǵ±¹Û²ìÕß±»»ØÊÕµÄʱºò£¬ÎÒÃÇÒ»¶¨Òª³·Ïú¹Û²ì£¬·ñÔò»á·¢Éú֪ͨ·¢ÏòÒ»¸ö nil ÀàµÄÇé¿ö£¬µ¼Ö App ±ÀÀ£¡£ÓÚÊÇÎÒÃÇÕâÑùÉè¼Æ£º

func remove(observer: Any)

È»ºó½«ËüÌí¼ÓÔÚÀà deinit ÖУº

deinit {
remove(observer: self)
}

Ã²ËÆÎÒÃÇÒѾ­Éè¼ÆºÃÁËÕë¶Ô¿ç object µÄ×î¼òµ¥ API¡£¶ÔÕÕһϠApple ¹Ù·½µÄ NotificationCenter API£¬·¢ÏÖȷʵҲÊÇÕâ¸ö˼·¡£²»¹ýËûÃÇÉè¼ÆµÄ¸üÈ«Ãæ¿É¿¿£¬ÕâÀï´ó¼Ò¿ÉÒÔ×ÔÐбȽϡ£

KVO

ÎÒÃÇÀ´¿´µÚ¶þ¸öÇé¿ö£¬¾ÍÊÇ KVO -- ¼üÖµ¹Û²ì¡£

¹ËÃû˼Ò壬¼üÖµ¹Û²ì¾ÍÊÇ˵µ±Ä³¸öÊôÐÔ·¢Éú±ä»¯£¬Æä¶ÔÓ¦µÄÖµÒ²·¢Éú±ä»¯¡£ËüÒ»°ãÓÃÓÚµ¥¸ö object ÄÚ²¿µÄÇé¿ö¡£¾Ù¸ö¾ßÌåµÄÀý×Ó£¬ViewController Ò»¿ªÊ¼ UIImageView ûÓÐͼƬµÄʱºò£¬ÎÒÃÇÓà activityIndicator ÏÔʾ¼ÓÔØ×´Ì¬£¬µ± Network ÏÂÔØºÃͼƬ²¢¸ø UIImageView ¸³ÖµÖ®ºó£¬ÎÒÃÇÍ£Ö¹ activityIndicator µÄ¼ÓÔØ×´Ì¬¡£Ò²¾ÍÊÇ˵ÎÒÃǹ۲ì image Õâ¸öÊôÐÔ£¬µ±ËüÓÉ nil ±ä³É·Ç nil ʱ£¬³ÌÐò×÷³ö¹Ø±Õ activityIndicator ¶¯»­µÄÏàÓ¦²Ù×÷

ËùÒÔ»ù±¾Á÷³ÌÈçÏ£º

ViewController ¸ø UIImageView Ìí¼Ó activityIndicator£¬Æô¶¯¶¯»­Ð§¹û

ViewController ¹Û²ì UIImageView µÄ image ÊôÐÔ

ViewController ͨ¹ýÉÏÃæÌáµ½µÄ¿ç object ֪ͨ£¬´Ó Network ÀïÏÂÔØ image£¬²¢¸ø UIImageView ¸³Öµ

ViewController ¹Û²ìµ½ UIImageView µÄ image ÊôÐÔÒѾ­±»¸³Öµ£¬ËùÒÔÆô¶¯ÏàÓ¦·½·¨£¬¹Ø±Õ activityIndicator µÄ¶¯»­

ÕâÀïÎÒÃÇ¿ÉÒÔ¿´³öÀ´£¬ÕâÊÇÕë¶Ôµ¥¸ö object µÄij¸öÊôÐԱ仯¶øÉè¼Æ³öÀ´µÄ֪ͨ¿ò¼Ü¡£ËùÒÔÎÒÃDz»·ÁÓà extension µÄÐÎʽ¶Ô NSObject Ìí¼Ó֪ͨ·½·¨¡£

extension NSObject {
/* ×¢²á¹Û²ì
* observer£ºËµÃ÷Ë­Êǹ۲ìÕߣ¬´ËÀýÖÐÊÇ UIImageView
* property: Ö¸³ö±»¹Û²ìµÄÊôÐÔ£¬´ËÀýÖÐÊÇ UIImageView ÖÐµÄ image
* options£ºÍ¨ÖªÖÐÓ¦¸Ã´«µÝµÄÐÅÏ¢£¬±ÈÈç UIImageView ÖÐÐ嵀 image ÐÅÏ¢
*/
func add?Observer(observer: NSObject, property: String, ?options: ObservingOptions)

/* ÏìÓ¦¹Û²ì
* property: Ö¸³ö±»¹Û²ìµÄÊôÐÔ£¬´ËÀýÖÐÊÇ UIImageView ÖÐµÄ image
* object: ¹Û²ìÊôÐÔ¶ÔÓ¦µÄ object£¬´ËÀýÖÐÊÇ UIImageView
* change: ±íÃ÷ÊôÐÔµÄÏàÓ¦±ä»¯£¬Èç¹û±íʾÈκα仯¶¼¿ÉÒÔ½ÓÊÜ£¬¿ÉÒÔ´«Èë nil
*/
func observeValue(forProperty property: String,
ofObject object: Any,
change: [NSKeyValueChangeKey : Any]?)
}

ͬÊDz»ÒªÍü¼Ç deinit µÄʱºò removeObserver£¬·ÀÖ¹ App ±ÀÀ£¡£¶Ô±È Apple ¹Ù·½µÄ addObserver API ºÍ observeValue API£¬ÎÒÃÇ·¢ÏÖÆ»¹û»¹ÒýÈëÁËÒ»¸ö²ÎÊýcontextÀ´¸ü¼ÓÁé»îµÄ´¦Àí֪ͨ¹Û²ì»úÖÆ¡£Äã¿ÉÒÔ¶¨Ò岻ͬµÄ context ²¢¸ù¾ÝÕâЩ context À´¶ÔÊôÐԱ仯×ö³ö´¦Àí¡£±ÈÈçÏÂÃæÕâÑù£º

let myContext = UnsafePointer<()>()

observee.addObserver(observer, forKeyPath: ¡­, options: nil, context: myContext)

override func observeValueForKeyPath(keyPath: String!, ofObject object: AnyObject!, change: [NSObject : AnyObject]!, context: UnsafePointer<()>) {
if context == myContext {
¡­
} else {
super.observeValueForKeyPath(keyPath, ofObject: object, change: change, context: context)
}
}

×ܽá

iOS 10ÖÐÆ»¹ûµÄ±¾µØÍÆËͺÍÔ¶³ÌÍÆËÍ API ´ïµ½Á˸߶Èͳһ£¬¶¼Ê¹Óà UserNotifications Õâ¸ö¿ò¼ÜÀ´ÊµÏÖ£¬Ñ§Ï°ÇúÏß´ó·ùϽµ¡£¹¦ÄÜÒ²µÃµ½ÁË´ó·ù¶ÈÀ©Õ¹£¬¶àýÌåÎļþÌí¼Ó¡¢À©Õ¹°ü¡¢·ÖÀà±ðÏìÓ¦¡¢3D Touch ¶¼Ê¹µÃÍÆË͹¦Äܸü¼ÓÁé»î¡£

ÖÁÓÚÆ»¹û×Ô¼ºÉè¼ÆµÄ KVO ºÍ NotificationCenter »úÖÆ£¬±ÊÕßÈÏΪÓкܴóµÄ¾ÖÏÞÐÔ¡£ÒòΪ¶ÔÓ¦µÄ֪ͨºÍÏàÓ¦´úÂë¶ÎÖ®¼äÓÐÒ»¶¨¾àÀ룬´úÂëÁ¿ºÜ´óµÄʱºò·Ç³£ÈÝÒ×ÕÒ²»µ½¶ÔÓ¦µÄÏàÓ¦¡£Í¬Ê±ÕâÖÖ¹Û²ìÕßģʽÓÖÄÑÒÔ²âÊÔ£¬´úÂëά»¤ºÍÖÊÁ¿ºÜÄѵõ½±£Ö¤¡£ÕýÊÇÒòΪÕâЩԭÒò£¬ÏìӦʽ±à³Ì²ÅÈÕ½¥ÐËÆð£¬´ó¼Ò²»·ÁÈ¥¿´¿´ RxSwift ºÍ ReactCocoa£¬Æä¶ÔÓ¦µÄ MVVM ¼Ü¹¹Ò²ÔÚϵͳ½âñîÉÏÒªÓÅÓÚÔ­ÉúµÄ MVC¡£

 

   
2704 ´Îä¯ÀÀ       27
 
Ïà¹ØÎÄÕÂ

ÊÖ»úÈí¼þ²âÊÔÓÃÀýÉè¼ÆÊµ¼ù
ÊÖ»ú¿Í»§¶ËUI²âÊÔ·ÖÎö
iPhoneÏûÏ¢ÍÆËÍ»úÖÆÊµÏÖÓë̽ÌÖ
AndroidÊÖ»ú¿ª·¢£¨Ò»£©
 
Ïà¹ØÎĵµ

Android_UI¹Ù·½Éè¼Æ½Ì³Ì
ÊÖ»ú¿ª·¢Æ½Ì¨½éÉÜ
androidÅÄÕÕ¼°ÉÏ´«¹¦ÄÜ
Android½²ÒåÖÇÄÜÊÖ»ú¿ª·¢
Ïà¹Ø¿Î³Ì

Android¸ß¼¶Òƶ¯Ó¦ÓóÌÐò
Androidϵͳ¿ª·¢
AndroidÓ¦Óÿª·¢
ÊÖ»úÈí¼þ²âÊÔ
×îл¼Æ»®
DeepSeekÔÚÈí¼þ²âÊÔÓ¦ÓÃʵ¼ù 4-12[ÔÚÏß]
DeepSeek´óÄ£ÐÍÓ¦Óÿª·¢Êµ¼ù 4-19[ÔÚÏß]
UAF¼Ü¹¹ÌåϵÓëʵ¼ù 4-11[±±¾©]
AIÖÇÄÜ»¯Èí¼þ²âÊÔ·½·¨Óëʵ¼ù 5-23[ÉϺ£]
»ùÓÚ UML ºÍEA½øÐзÖÎöÉè¼Æ 4-26[±±¾©]
ÒµÎñ¼Ü¹¹Éè¼ÆÓ뽨ģ 4-18[±±¾©]

androidÈË»ú½çÃæÖ¸ÄÏ
AndroidÊÖ»ú¿ª·¢£¨Ò»£©
AndroidÊÖ»ú¿ª·¢£¨¶þ£©
AndroidÊÖ»ú¿ª·¢£¨Èý£©
AndroidÊÖ»ú¿ª·¢£¨ËÄ£©
iPhoneÏûÏ¢ÍÆËÍ»úÖÆÊµÏÖ̽ÌÖ
ÊÖ»úÈí¼þ²âÊÔÓÃÀýÉè¼ÆÊµ¼ù
ÊÖ»ú¿Í»§¶ËUI²âÊÔ·ÖÎö
ÊÖ»úÈí¼þ×Ô¶¯»¯²âÊÔÑо¿±¨¸æ


Android¸ß¼¶Òƶ¯Ó¦ÓóÌÐò
AndroidÓ¦Óÿª·¢
Androidϵͳ¿ª·¢
ÊÖ»úÈí¼þ²âÊÔ
ǶÈëʽÈí¼þ²âÊÔ
AndroidÈí¡¢Ó²¡¢ÔÆÕûºÏ


ÁìÏÈIT¹«Ë¾ android¿ª·¢Æ½Ì¨×î¼Ñʵ¼ù
±±¾© Android¿ª·¢¼¼Êõ½ø½×
ijÐÂÄÜÔ´ÁìÓòÆóÒµ Android¿ª·¢¼¼Êõ
ijº½Ì칫˾ Android¡¢IOSÓ¦ÓÃÈí¼þ¿ª·¢
°¢¶û¿¨ÌØ LinuxÄÚºËÇý¶¯
°¬Ä¬Éú ǶÈëʽÈí¼þ¼Ü¹¹Éè¼Æ
Î÷ÃÅ×Ó Ç¶Èëʽ¼Ü¹¹Éè¼Æ