iOS消息推送, 遠程通知

jopen 10年前發布 | 56K 次閱讀 IOS iOS開發 移動開發

消息推送

/* 要開發測試消息機制的程序,必須用真機測試

推送消息的類型 UIRemoteNotificationTypeNone 不接收推送消息 UIRemoteNotificationTypeBadge 接收圖標數字 UIRemoteNotificationTypeSound 接收音頻 UIRemoteNotificationTypeAlert 接收消息文字 UIRemoteNotificationTypeNewsstandContentAvailability 接收訂閱消息

要想監聽到注冊的deviceToken需要在蘋果的開發者中心,進行一些設置工作才可以。 */

  • (BOOL)application:(UIApplication )application didFinishLaunchingWithOptions:(NSDictionary )launchOptions { // 設置應用程序能夠接收APNS推送的消息 [application registerForRemoteNotificationTypes:UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound];

    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; self.window.backgroundColor = [UIColor whiteColor]; [self.window makeKeyAndVisible];

    return YES; }

pragma mark - 獲取DeviceToken

  • (void)application:(UIApplication )application didRegisterForRemoteNotificationsWithDeviceToken:(NSData )deviceToken { NSLog(@"%@", deviceToken); // 1. 從系統偏好取之前的token NSData *oldToken = [[NSUserDefaults standardUserDefaults]objectForKey:@"deviceToken"]; // 2. 新舊token進行比較 if (![oldToken isEqualToData:deviceToken]) {

      // 3. 如果不一致,保存token到系統偏好
      [[NSUserDefaults standardUserDefaults]setObject:deviceToken forKey:@"deviceToken"];
    
      // 4. 使用post請求傳輸新舊token至服務器
      // 1) url
      // 具體的URL地址以及POST請求中的參數和格式,是由公司的后端程序員提供的
      // 2) request POST body(包含新舊token的數據)
      // 3) connection 的異步
    

    } }

遠程通知

/* 遠程消息推送必須在真機上運行! /

  • (BOOL)application:(UIApplication )application didFinishLaunchingWithOptions:(NSDictionary )launchOptions { // 需要告訴蘋果的服務器,當前應用程序需要接收遠程通知 [application registerForRemoteNotificationTypes:UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound];

    return YES; }

pragma mark - 獲取到設備的代號(令牌)

// 接收到蘋果返回的設備代號

  • (void)application:(UIApplication )application didRegisterForRemoteNotificationsWithDeviceToken:(NSData )deviceToken { // 第一次運行獲取到DeviceToken時間會比較長! NSLog(@"%@", deviceToken);

    // 將deviceToken轉換成字符串,以便后續使用 NSString *token = [deviceToken description]; NSLog(@"description %@", token);

    // ======================================================= // 如果DeviceToken發生變化,需要通知服務器 // 每次都記錄住從服務器獲取到得DeviceToken // 再次獲取時進行比對 // 從偏好設置取出當前保存的Token NSString *oldToken = [[NSUserDefaults standardUserDefaults] objectForKey:@"DeviceToken"];

    // 當Token發生變化時,提交給服務器保存新的Token // if (![oldToken isEqualToString:token]) { //
    // // 將deviceToken通過Post請求,提交給自己的服務器即可! // // 發送Post請求 // NSURL url = [NSURL URLWithString:@"公司后臺服務器的網址"]; // NSMutableURLRequest request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:10.f]; //
    // request.HTTPMethod = @"POST"; // request.HTTPBody = @"轉換后的設備ID以及其他信息[之前的Token]"; //
    // // SQL: update t_deviceTable set token = newToken where token = oldToken; //
    // // 同步:必須執行完才能繼續 // // 異步:直接交給其他線程工作,不干擾主線程工作,用戶也感覺不到延遲 // [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse response, NSData data, NSError *connectionError) { // // 偷偷的將用戶信息傳送到公司的服務器 // }]; // }

    // 將Token保存至系統偏好 [[NSUserDefaults standardUserDefaults] setObject:token forKey:@"DeviceToken"]; }</pre>

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!