iOS 애플리케이션에서 즉각적인 알림을 제공하도록 APN 설정

본문은 처음으로 Applozic Blog에 발표되었다.

소개하다.


지금은 저녁 8시인데 하루 종일 일했더니 피곤해.음식을 주문하고 싶지만 다음 시간에 마케팅 전화 영상이 필요합니다.너는 몰래 너의 아이폰을 검사하지 않고 음식이 언제 꺼내져 배달되는지 어떻게 알았니?
알림 푸시!
핸드폰의 최신 기술을 통해 두려움이 뭔지 아세요?
APNs(Apple Push Notification Service)를 사용하면 어플리케이션이 실행되지 않은 경우에도 원격 알림(밀어넣기 알림)을 보낼 수 있습니다.

APN은 어떻게 작동합니까?


원격 알림 제공은 다음 주요 구성 요소와 관련됩니다.
  • 조직의 서버(공급자 서버라고 함)
  • 애플 푸시 알림 서비스(APNs) 설정
  • 사용자 장비
  • 당신의 응용 프로그램(사용자 장치에서 실행)

  • 원격 알림은 귀사의 서버에서 시작합니다.사용자에게 어떤 알림을 보낼 것인지, 언제 보낼 것인지 결정할 수 있습니다.알림을 보내야 할 때, 알림 데이터와 사용자 장치의 유일한 식별자를 포함하는 요청을 생성합니다.그런 다음 사용자의 장치에 알림을 전달하는 APNs에 요청을 전달합니다.알림을 받으면 사용자 장치의 운영체제는 모든 사용자의 상호작용을 처리하고 알림을 응용 프로그램에 보냅니다.
    공급자 서버를 설정하고 사용자 장치의 알림을 처리하기 위해 프로그램을 설정합니다.애플은 사용자에게 알림을 보내는 것을 포함해 둘 사이의 모든 것을 관리한다.서버와 통신하고 필요한 정보를 제공할 수 있는 프로그램을 사용자 장치에서 실행해야 합니다.

    APN은 무엇을 제공합니까?


    APNs는 응용 프로그램이 서버에서 알림을 전송하고 최상의 사용자 체험으로 알림을 보낼 수 있도록 하는 메커니즘을 제공합니다.
  • APNs는 사용자 장치에 대한 인증, 암호화 및 지속적인 IP 연결을 관리합니다.
  • APNs를 사용하면 공중에서 분실/도난/손상된 장치를 원격으로 잠그거나 지울 수 있습니다.
  • APN은 현재 오프라인 장치에 대한 알림을 저장할 수 있습니다.그런 다음 장치가 온라인 상태일 때 APNs는 저장된 알림을 전달합니다.
  • APN은 동일한 애플리케이션에 대한 알림을 병합하여 즉시 표시할 수 있습니다.
  • 알림을 푸시하는 용도는 무엇입니까?

  • '알림'이라는 문자메시지를 표시하여 응용 프로그램의 새로운 내용을 주의하도록 알립니다.
  • 알림음 재생.
  • 응용 프로그램 아이콘에 새 항목이 있음을 알리는 배지 번호를 설정합니다.
  • 어플리케이션을 열지 않고도 수행할 수 있는 작업을 제공합니다.
  • 디스플레이 미디어 액세서리
  • 이런 행동이 더 많아!
  • 이제 우리는 응용 프로그램에서 APN을 어떻게 사용하는지 잘 알고 있으며, 그것들을 어떻게 설정하는지 잘 알고 있습니다.

    채팅 애플리케이션에서 APN 설정


    이 자습서에서는 응용 프로그램에 APN을 설정하는 방법과 원격 알림 서비스를 통합하는 방법을 학습합니다.이 자습서에서는 Applozic's iOS SDK 제품을 사용합니다.Delldocumentation at GitHub에 따라 통합 프로세스의 처음 두 단계를 완료하십시오.

  • Initial Setup 및 가입frameworkspermissions.

  • Registering a user 신청 가능
  • 어플리케이션을 구성하고 APNs에 등록


    APNs 인증서 생성


    애플이 사용자 장치에 푸시 알림을 보내려면 애플 개발자 계정에 APNs 인증서를 만들어야 합니다.
  • 이것link을 방문하여 애플 푸시 알림 서비스 SSL(샌드박스), 즉 개발 인증서를 만듭니다.
  • 이것link을 방문하여 애플 전송 알림 서비스 SSL(샌드박스와 생산)을 만들고 인증서를 나누어 줍니다.
  • Note: Supported format for APNs certificate is .p12


    인증서를 만든 후 인증서를 다운로드하고 내보낼 수 있습니다.p12 사용Keychain Access in Mac. 인증서 개발 및 배달 암호 파일

    APNs 인증서 업로드


    APNs 개발 및 릴리즈 인증서를 업로드하려면 Applozic console push notification section로 이동합니다.다음 화면 캡처가 콘솔에 표시됩니다.
    콘솔 대시보드의 푸시 알림 화면

    애플리케이션에 기능 추가

  • Xcode 프로젝트의 서명과 기능 옵션에 (+기능)을 누르면'푸시 알림'
  • 을 추가합니다
  • 다음 클릭(+기능) 백그라운드 모드를 추가하여 백그라운드 모드에서 옵션을 활성화합니다
  • .
  • 백그라운드 추출
  • 원격 알림
  • 이러한 기능을 추가하면 화면이 다음과 같이 표시됩니다.

    프로젝트의 Appdelegate 파일에서 푸시 알림을 구성합니다.


    Appdelegate 파일에 다음 가져오기 추가
    #import <Applozic/Applozic.h>
    #import <UserNotifications/UserNotifications.h>
    

    알림 처리 시 어플리케이션 시작 클릭 및 APN에 대한 원격 알림 등록


    AppDelegate에 다음 코드를 추가합니다.m클래스, 이 함수는 프로그램이 시작된 후에 호출되어 알림을 등록합니다.
    // UNUserNotificationCenterDelegate are required for APNs call backs please add this delegate to your AppDelegate file 
    @interface AppDelegate () <UNUserNotificationCenterDelegate>
    
    @end
    
    
    // didFinishLaunchingWithOptions method of your app
    
    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
    {
        // checks whether app version is updated/changed then makes server call setting VERSION_CODE
        [ALRegisterUserClientService isAppUpdated];
    
        // Register APNs and Push kit
        [self registerForNotification];
    
        // Register for Applozic notification tap actions and network change notifications
        ALAppLocalNotifications *localNotification = [ALAppLocalNotifications appLocalNotificationHandler];
        [localNotification dataConnectionNotificationHandler];
    
        ALPushNotificationHandler *pushNotificationHandler = [ALPushNotificationHandler shared];
        [pushNotificationHandler dataConnectionNotificationHandler];
    
        // Override point for customization after application launch.
        NSLog(@"launchOptions: %@", launchOptions);
        if (launchOptions != nil) {
            NSDictionary *dictionary = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
            if (dictionary != nil) {
                NSLog(@"Launched from push notification: %@", dictionary);
                ALPushNotificationService *pushNotificationService = [[ALPushNotificationService alloc] init];
                BOOL applozicProcessed = [pushNotificationService processPushNotification:dictionary updateUI:[NSNumber numberWithInt:APP_STATE_INACTIVE]];
    
                //IF not a appplozic notification, process it
                if (!applozicProcessed) {
                    //Note: notification for app
                }
            }
        }
    
        return YES;
    }
    
    // Register APNs
    
    -(void)registerForNotification
    {
        UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
        center.delegate = self;
        [center requestAuthorizationWithOptions:(UNAuthorizationOptionSound | UNAuthorizationOptionAlert | UNAuthorizationOptionBadge) completionHandler:^(BOOL granted, NSError * _Nullable error)
         {
            if(!error)
            {
                dispatch_async(dispatch_get_main_queue(), ^ {
                    [[UIApplication sharedApplication] registerForRemoteNotifications];  // required to get the app to do anything at all about push notifications
                    NSLog(@"Push registration success." );
                });
            }
            else
            {
                NSLog(@"Push registration FAILED" );
                NSLog(@"ERROR: %@ - %@", error.localizedFailureReason, error.localizedDescription );
                NSLog(@"SUGGESTIONS: %@ - %@", error.localizedRecoveryOptions, error.localizedRecoverySuggestion );
            }
        }];
    }
    

    APNs 장치 토큰을 Applozic 서버에 전송


    Appdelegate 파일에 다음 코드를 추가합니다.만약 이 방법 중 하나가 이미 존재한다면, 아래의 방법에서 관련 코드를 복사해서 붙일 수 있습니다.
    // APNs device token sending to Applozic
    
    - (void)application:(UIApplication*)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData*)
    deviceToken {
    
        const unsigned *tokenBytes = [deviceToken bytes];
        NSString *hexToken = [NSString stringWithFormat:@"%08x%08x%08x%08x%08x%08x%08x%08x",
                              ntohl(tokenBytes[0]), ntohl(tokenBytes[1]), ntohl(tokenBytes[2]),
                              ntohl(tokenBytes[3]), ntohl(tokenBytes[4]), ntohl(tokenBytes[5]),
                              ntohl(tokenBytes[6]), ntohl(tokenBytes[7])];
    
        NSString *apnDeviceToken = hexToken;
        NSLog(@"apnDeviceToken: %@", hexToken);
    
        if (![[ALUserDefaultsHandler getApnDeviceToken] isEqualToString:apnDeviceToken]) {
            ALRegisterUserClientService *registerUserClientService = [[ALRegisterUserClientService alloc] init];
            [registerUserClientService updateApnDeviceTokenWithCompletion
             :apnDeviceToken withCompletion:^(ALRegistrationResponse
                                              *rResponse, NSError *error) {
    
                if (error) {
                    NSLog(@"%@",error);
                    return;
                }
                NSLog(@"Registration response%@", rResponse);
            }];
        }
    }
    

    푸시 알림 수신


    애플리케이션은 알림을 받은 후 Applozic 프로세서에 채팅 알림 처리를 전달합니다.
    // UNUserNotificationCenter delegates for chat
    - (void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification*)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions options))completionHandler {
        ALPushNotificationService *pushNotificationService = [[ALPushNotificationService                                                    alloc] init];
        NSDictionary *userInfo = notification.request.content.userInfo;
        NSLog(@"APNS willPresentNotification for userInfo: %@", userInfo);
    
        if ([pushNotificationService isApplozicNotification:userInfo]) {
            [pushNotificationService notificationArrivedToApplication:[UIApplication sharedApplication] withDictionary:userInfo];
            completionHandler(UNNotificationPresentationOptionNone);
            return;
        }
        completionHandler(UNNotificationPresentationOptionAlert|UNNotificationPresentationOptionBadge|UNNotificationPresentationOptionSound);
    }
    
    - (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(nonnull UNNotificationResponse* )response withCompletionHandler:(nonnull void (^)(void))completionHandler {
    
    
        ALPushNotificationService *pushNotificationService = [[ALPushNotificationService
                                                               alloc] init];
        NSDictionary *userInfo =  response.notification.request.content.userInfo;
        NSLog(@"APNS didReceiveNotificationResponse for userInfo: %@", userInfo);
    
        if ([pushNotificationService isApplozicNotification:userInfo]) {
            [pushNotificationService notificationArrivedToApplication:[UIApplication sharedApplication] withDictionary:userInfo];
            completionHandler();
            return;
        }
        completionHandler();
    }
    
    -(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(nonnull void (^)(UIBackgroundFetchResult))completionHandler{
    
        NSLog(@"RECEIVED_NOTIFICATION_WITH_COMPLETION :: %@", userInfo);
        ALPushNotificationService *pushNotificationService = [[ALPushNotificationService alloc] init];
        if ([pushNotificationService isApplozicNotification:userInfo]) {
            [pushNotificationService notificationArrivedToApplication:application withDictionary:userInfo];
            completionHandler(UIBackgroundFetchResultNewData);
            return;
        }
        completionHandler(UIBackgroundFetchResultNewData);
    }
    
    - (void)applicationWillTerminate:(UIApplication *)application {
        // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
    
        [[ALDBHandler sharedInstance] saveContext];
    }
    
    - (void)applicationWillEnterForeground:(UIApplication *)application {
        // Called as part of the transition from the background to the inactive state; here you can undo any of the changes made on entering the background.
    
        NSLog(@"APP_ENTER_IN_FOREGROUND");
        [application setApplicationIconBadgeNumber:0];
    }
    

    결론


    본고는 먼저 APN의 작업 원리와 우리 응용 프로그램에서 어떻게 사용하는지 소개한다.또한 APN 설정 요구 사항과 애플리케이션에 대한 원격 알림의 다양한 사용 사례에 대해서도 알아봤습니다.
    그런 다음 Applozic의 iOS SDK를 사용하여 애플리케이션을 구성하고 APNs에 등록합니다.응용 프로그램에 원격 알림과 백엔드 가져오기 기능을 추가했습니다.
    마지막으로, 우리는 몇 가지 코드 세션을 소개했는데, 이 코드 세션들은 응용 프로그램에서 전송 알림의 발송과 수신을 설정할 수 있도록 합니다.
    이 강좌가 끝나면 iOS의 푸시 알림 생태계와 응용 프로그램에서 APN을 활용하는 방법에 대해 잘 알고 있어야 합니다.
    아래의 댓글에 당신의 피드백과 의문을 남겨 주십시오!

    좋은 웹페이지 즐겨찾기