English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
1. 소개
지역 알림과 원격 알림으로 나뉩니다2종류입니다. 앱이 열리지 않았거나 핸드폰이 잠겨져도 사용자에게 알림을 주는 것입니다. 이들은 모두 등록되어야 하며, 등록 후 시스템은 사용자에게 동의 여부를 묻는 팝업을 표시합니다. 동의하면 정상적으로 사용할 수 있으며, 사용자가 동의하지 않으면 다음으로 프로그램을 열 때 팝업이 표시되지 않습니다. 팝업은 총 세 가지 유형이 있습니다:
UIUserNotificationTypeBadge:앱 아이콘 오른쪽 상단에 정보 알림
UIUserNotificationTypeSound:알림 음을 재생합니다
UIUserNotificationTypeAlert:알림 팝업
2. 지역 알림
1 등록 및 처리
코드는 다음과 같습니다:
/// 일반적으로 프로그램이 시작될 때 알림을 등록하고, 프로그램이 종료되면 알림을 클릭하면 이 프로그램이 호출됩니다 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { if ([[UIDevice currentDevice].systemVersion floatValue] >= 8.0) { // iOS8 UIUserNotificationSettings *setting = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge | UIUserNotificationTypeAlert | UIUserNotificationTypeSound categories:nil]; [application registerUserNotificationSettings:setting]; } if (launchOptions[UIApplicationLaunchOptionsLocalNotificationKey]) { // 이곳에 처리 코드를 추가합니다 } return YES; } /// 프로그램이 종료되지 않았다면(전면이나 배후에 있을 때), 알림을 클릭하면 이 프로그램이 호출됩니다 - (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification { // 이곳에 처리 코드를 추가합니다 }
보면 알 수 있듯이, 처리 코드는 두 가지 방법이 있습니다, 하나는
- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification;
또 하나는
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions;
프로그램이 종료되지 않았다면, 즉 전면이나 배후에 있을 때는 전자를 호출합니다; 프로그램이 종료되면 후자를 호출합니다.
2 알림을 전송합니다
코드는 다음과 같습니다:
- (IBAction)addLocalNotification { // 1.지역 알림을 생성합니다. UILocalNotification *localNote = [[UILocalNotification alloc] init]; // 1.1. 알림 발생 시간 설정 localNote.fireDate = [NSDate dateWithTimeIntervalSinceNow:5]; // 1.2. 알림 내용 설정 localNote.alertBody = @"이것은 푸시 알림입니다 이것은 푸시 알림입니다"; // 1.3. 잠금 화면에서, 글자 아래에 표시되는 텍스트 설정 localNote.alertAction = @"제발!!!!!"; localNote.hasAction = YES; // 1.4. 알림을 통해 시작하는 이미지 설정 localNote.alertLaunchImage = @"../문서/IMG_0024.jpg"; // 1.5. 도착하는 소리 설정 localNote.soundName = UILocalNotificationDefaultSoundName; // 1.6. 애플리케이션 아이콘 상단 오른쪽에 표시되는 숫자 설정 localNote.applicationIconBadgeNumber = 999; // 1.7. 추가 정보 설정 localNote.userInfo = @{@"qq" : @"704711253", @"msg" : @"success"}; // 2. 알림 실행 [[UIApplication sharedApplication] scheduleLocalNotification:localNote]; }
효과는 다음과 같습니다:
3 알림 취소
// 모든 로컬 알림을 취소합니다
[application cancelAllLocalNotifications];
3. 원격 푸시
안드로이드에서 우리가 구현한 푸시 서비스와 달리, 애플은 장치에 대한 통제가 매우 엄격합니다. 메시지 푸시의 흐름은 반드시 APNs(Apple Push Notification service)를 통해 진행해야 합니다.
일반적으로 프로그램이 백그라운드로 이동하면 코드(오디오, VoIP 등 백그라운드에서 실행 가능한 것들)를 실행할 수 없습니다. 또는 프로그램이 종료되면, 그 프로그램과 해당 애플리케이션의 백그라운드 서버와의 연결이 끊어지고, 서버에서 보내는 정보를 받을 수 없습니다. 하지만 각 장치가 인터넷에 연결되면 항상 애플의 APNs 서버와 장기 연결(지속적인 IP 연결)을 수립합니다. 이렇게 되면 애플의 APNs 서버를 통해 우리의 서버도 장치와 간접적으로 연결할 수 있습니다. 그림은 다음과 같습니다:
사용 방법:
1 백그라운드 모드를 선택하세요 -> 원격 알림, 주로 iOS7이후, 애플이 배경 실행을 지원하면, 이곳을 열면 원격 푸시를 받았을 때 배경에서도 일부 처리를 할 수 있습니다. 다음 그림을 참고하세요:
2 원격 푸시 등록은 로컬 푸시와 다릅니다. iOS8.0 전후에도 다릅니다. 코드는 아래와 같습니다.
또한, 첫 번째로 푸시를 사용할 때, 이렇게 생각할 수도 있습니다: didFinishLaunchingWithOptions는 프로그램이 언제든지 열릴 때마다 호출됩니다. 따라서 등록 함수가 언제든지 호출되고, 사용자에게 "푸시 알림을 허용하시겠습니까?"와 같은 창이 언제든지 나타날까요? 사실, 이 창은 프로그램을 처음으로 열릴 때만 나타나고, 사용자가 허용하든 불허하든 애플은 사용자의 선택을 기억하며, 등록 함수가 여러 번 호출되면 사용자에게 큰 영향을 미치지 않습니다.
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // iOS8이후와 이전에 대한 차이를 구분해야 합니다. if ([[UIDevice currentDevice].systemVersion floatValue] >= 8.0) { UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge | UIUserNotificationTypeAlert | UIUserNotificationTypeSound categories:nil]; [[UIApplication sharedApplication] registerUserNotificationSettings:settings]; } else { [application registerForRemoteNotificationTypes:UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeBadge | UIUserNotificationTypeSound]; } return YES; } /// 이 함수가 존재하는 의미는 사용자가 설정에서 알림을 끊었을 때, 프로그램이 시작될 때 이 함수가 호출되고, 사용자 설정을 가져올 수 있다는 것입니다. - (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings { [application registerForRemoteNotifications]; }
3 registration이 실패하면, 예를 들어 인증서가 없는 경우 등, 호출됩니다:}}
/// registration failed call - (void)application:(UIApplication *application didFailToRegisterForRemoteNotificationsWithError:(NSError * NSLog(@"remote notification registration failed: %@ }
4 deviceToken 가져오기
사용자가 동의하면, 애플은 애플리케이션의 bundleID와 모바일 UDID를 기반으로 deviceToken을 생성하고, application의 didregister 메서드를 호출하여 devicetoken을 반환합니다. 프로그램은 devicetoken을 애플리케이션의 서버에 보내야 하며, 서버는 이를 저장해야 합니다(多点登录이 허용된 경우 여러 개의 devicetoken을 저장할 수 있습니다). deviceToken도 변할 수 있습니다: "If the user restores backup data to a new device or computer, or reinstalls the operating system, the device token changes" 따라서 항상 서버(provider)에 전달해야 합니다.
/// 사용자가 동의하면, 이 프로그램이 호출되어 시스템의 deviceToken을 가져오며, deviceToken을 서버에 저장해야 합니다. 이 함수는 프로그램이 매번 시작될 때 호출됩니다(사용자가 알림을 허용한 경우). - (void)application:(UIApplication *application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *deviceToken { NSLog(@"deviceToken = %@",deviceToken); }
5 사용자가 알림을 클릭했습니다
기본적으로 프로그램이 열립니다. 처리 코드는 세 가지 함수로 나뉘며, iOS7그리고 이전, 그리고 프로그램이 배경 상태인지 여부
5.1 iOS7그리고 이후
이 함수는 프로그램이 종료되었든 배경 상태였든, 사용자가 알림을 클릭하면 호출됩니다. 따라서 iOS7그러면 didFinishLaunchingWithOptions에서 처리할 필요가 없으며, 아래 함수에서만 처리하면 됩니다. 이 때 didFinishLaunchingWithOptions 함수에서 중복 처리를 피해야 합니다.
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler { // userInfo }
주의: 첫 번째 단계에서 백그라운드 실행을 열고 사용자가 알림을 클릭하지 않더라도 다음 작업을 수행할 수 있습니다:
- (void)application:(UIApplication*)application didReceiveRemoteNotification:(NSDictionary*)userInfo fetchCompletionHandler:(void(^)(UIBackgroundFetchResult))completionHandler
5.2 iOS7이전
사용자가 알림을 클릭하면, 프로그램이 종료되었을 때 첫 번째 함수가 호출되고, 프로그램이 백그라운드 상태일 때 두 번째 함수가 호출됩니다. 따라서 두 함수는 함께 사용되어야 합니다
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // 빠른 푸시 알림 메시지를 가져옵니다 NSDictionary *userInfo = launchOptions[UIApplicationLaunchOptionsRemoteNotificationKey]; if (userInfo) { // 푸시 메시지가 있으면, 푸시 메시지를 처리합니다 } return YES; } /// iOS3그 뒤에야 있으며, 프로그램이 백그라운드 상태일 때 사용자가 알림을 클릭하면 호출됩니다. 따라서 didFinishLaunchingWithOptions와 함께 사용해야 합니다 - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo { // userInfo }
실제로 iOS와 호환하려면7이전에는 세 가지 함수를 동시에 사용할 수 있었고, 모두 나열하면 시스템이 자동으로 적합한 호출을 선택했습니다
6 함수 호출의 요약:
처음으로 설치한 후 실행됩니다:
didRegisterForRemoteNotificationsWithDeviceToken 함수가 호출되었습니다
시스템이 사용자에게 Notifications를 수신할 것인지 동의하겠는가를 묻습니다
사용자가 동의하든 거부하든, didRegisterUserNotificationSettings 함수가 호출됩니다
앱이 처음으로 실행되지 않았을 때:
notifications가 거부 상태일 때: didRegisterUserNotificationSettings 함수가 호출됩니다
notifications가 허용 상태일 때
didRegisterForRemoteNotificationsWithDeviceToken 함수가 호출되었습니다
didRegisterUserNotificationSettings이 호출됨
앱이 실행 중에 사용자가 notifications 설정을 변경할 때:
거부에서 허용으로 변경됨: didRegisterForRemoteNotificationsWithDeviceToken이 호출됨
허용에서 거부로 변경됨: 아무 일도 일어나지 않음
7 서버에서 푸시하는 형식
{ "aps" : { // 必须有 "alert" : "string" "body" : "string" "badge" : number "sound" : "string" }, "NotiId" : 20150821, // 사용자 정의 키 값 }
8 푸시 크기 제한
서버가 사용하는 API에 따라서, 원격 알림 부하의 크기는 다릅니다. HTTP를 사용할 때,/2 provider API를 사용할 때, 부하 크기는 최대4kB; legacy binary interface를 사용할 때, 부하 크기는 최대2kB. 부하 크기가 지정된 부하 크기를 초과하면, APNs는 이 알림을 전송하지 않습니다.
9 전체는 다음과 같습니다. (위쪽으로 푸시를 예로 들어 설명합니다):
10 마지막으로, 인증서를 신청해야 합니다. 이 부분은 자세히 설명하지 않을 것입니다.-_-
이 문서는 《iOS 푸시 교본》에 정리되었습니다. 배우고 읽어 주시기 바랍니다.
이것이 이 문서의 전체 내용입니다. 여러분의 학습에 도움이 되길 바라며, 많이 지지해 주시기를 바랍니다.
성명서: 이 문서의 내용은 인터넷에서 가져왔으며, 저작권자에게 소유되며, 인터넷 사용자가 자발적으로 기여하고 자체로 업로드한 내용입니다. 이 사이트는 소유권을 가지지 않으며, 인공 편집 처리를 하지 않았으며, 관련 법적 책임도 부담하지 않습니다. 저작권 문제가 의심되는 내용이 있으면, notice#w로 이메일을 보내 주시기 바랍니다.3codebox.com(메일을 보내는 경우, #을 @으로 변경하십시오. 신고하시고 관련 증거를 제공하시면, 실제로 확인되면 이 사이트는 즉시 의심스러운 저작권 내용을 삭제합니다.