iOSリモートプッシュとプッシュ処理
4291 ワード
APNS(Apple Push Notification Service)は、アップル社が提供するメッセージプッシュサービスです.その原理は、第三者アプリケーションがユーザーにプッシュする情報をアップルサーバーにプッシュし、アップルサーバーは統一的なシステムインタフェースを通じてこれらの情報をユーザーの携帯電話にプッシュすることである.もしこれに対して理解を惜しまない友达がこの文章を参照することができるならば:一歩一歩あなたにiosのプッシュを教えます
本稿では,App側でプッシュ情報をどのように処理するかに重点を置く.主にいくつかの重要な関数について説明しますが、これらの関数はAppDelegateクラスにあります.
iOSの开発を行ったことがある人はこの関数に対してすべて熟知して、これはプログラムがスタートを终えて、そして间もなく运行する时に呼び出したので、通常いくつかの初期化の仕事はこの関数の中で処理することができます.同様に,プッシュに関する初期化操作もこの部分で完了する必要がある.この部分の仕事は主に2つの部分に分けられる:プッシュタイプの登録:
に表示されます.しかし,ユーザがプッシュ通知をクリックしてもプログラムが起動されていない場合,このとき以上の2つの関数はいずれもユーザのプッシュ通知を受信できないため,この場合は
デバイス側がプッシュメッセージを受信できるようにするには、デバイスのtokenをアップルのサーバに送信する必要があります.このtokenはデバイスの識別コードに相当し、各アップルのデバイスには唯一のtokenがあります.アップルのサーバはこのtokenを通じて対応するデバイスを見つけ、対応するメッセージを送信します.この2つの関数はtokenの転送に成功したり失敗したりした後に呼び出され、ユーザーは対応する関数の中で対応する処理をします.
いずれも、現在のプログラムがフロントにあるかバックグラウンドにあるかにかかわらず、プログラムが実行中にプッシュメッセージを受信する処理関数です.アップルの公式文書によると、
このようなプッシュメッセージ(すなわち、プログラムが起動されてプッシュメッセージが受信される)を処理する場合、現在のプッシュメッセージが現在のプログラムがフロントで実行されているときに受信されたのか、それともプログラムがバックグラウンドで実行されているのか、ユーザがシステムメッセージ通知欄をクリックしてプログラムに入ったときに受信されたのかという問題が通常発生する.これは実は簡単で、次のコードで解決できます.
userInfoの構造については、アップルの公式構造を参照してください.
すなわちkey apsは,そのプッシュメッセージの具体的な情報である辞書に対応している.具体的には、私たちが登録したプッシュタイプと関係があります.残りのkeyはユーザーがカスタマイズしたものです.
本稿では,App側でプッシュ情報をどのように処理するかに重点を置く.主にいくつかの重要な関数について説明しますが、これらの関数はAppDelegateクラスにあります.
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
iOSの开発を行ったことがある人はこの関数に対してすべて熟知して、これはプログラムがスタートを终えて、そして间もなく运行する时に呼び出したので、通常いくつかの初期化の仕事はこの関数の中で処理することができます.同様に,プッシュに関する初期化操作もこの部分で完了する必要がある.この部分の仕事は主に2つの部分に分けられる:プッシュタイプの登録:
[[UIApplication sharedApplication] registerForRemoteNotificationTypes: UIRemoteNotificationTypeBadge |UIRemoteNotificationTypeSound | UIRemoteNotificationAlert];
この行のコードはシステムに教えて、このプログラムが登録したプッシュメッセージのタイプ、通常badge、音声とalert通知を含む.プロセッサが起動していないときのプッシュメッセージ:プログラムが実行中であるか、プログラムがバックグラウンドにある場合、このときのプッシュメッセージの処理は-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
または:-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
です.に表示されます.しかし,ユーザがプッシュ通知をクリックしてもプログラムが起動されていない場合,このとき以上の2つの関数はいずれもユーザのプッシュ通知を受信できないため,この場合は
application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary*) launchOptions
関数で処理する必要がある.プッシュメッセージに関する情報はlaunchOptionsという辞書に格納されています.具体的には、次のコードを参照してください. NSDictionary* pushInfo = [launchOptions objectForKey:@"UIApplicationLaunchOptionsRemoteNotificationKey"];
if (pushInfo)
{
NSDictionary *apsInfo = [pushInfo objectForKey:@"aps"];
if(apsInfo)
{
//your code here
}
}
- (void)application:(UIApplication *)applicationdidRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
- (void)application:(UIApplication *)applicationdidFailToRegisterForRemoteNotificationsWithError:(NSError *)error
デバイス側がプッシュメッセージを受信できるようにするには、デバイスのtokenをアップルのサーバに送信する必要があります.このtokenはデバイスの識別コードに相当し、各アップルのデバイスには唯一のtokenがあります.アップルのサーバはこのtokenを通じて対応するデバイスを見つけ、対応するメッセージを送信します.この2つの関数はtokenの転送に成功したり失敗したりした後に呼び出され、ユーザーは対応する関数の中で対応する処理をします.
-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
いずれも、現在のプログラムがフロントにあるかバックグラウンドにあるかにかかわらず、プログラムが実行中にプッシュメッセージを受信する処理関数です.アップルの公式文書によると、
-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
を使用することをお勧めします.また、-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^ )(UIBackgroundFetchResult))completionHandler
にはもう一つの役割があります.アップルが提供した文書によれば,システムは30 sの時間を与えてプッシュされたメッセージを処理し,その後CompletionHandlerブロックを実行する.このようなプッシュメッセージ(すなわち、プログラムが起動されてプッシュメッセージが受信される)を処理する場合、現在のプッシュメッセージが現在のプログラムがフロントで実行されているときに受信されたのか、それともプログラムがバックグラウンドで実行されているのか、ユーザがシステムメッセージ通知欄をクリックしてプログラムに入ったときに受信されたのかという問題が通常発生する.これは実は簡単で、次のコードで解決できます.
void application:(UIApplication*)application didReceiveRemoteNotification:NSDictionary)userInfo fetchCompletionHandler:((^)UIBackgroundFetchResult)completionHandler{
if (application.applicationState == UIApplicationStateActive) {
NSLog(@" ");
} else if (application.applicationState == UIApplicationStateInactive) {
//
NSLog(@" ");
}
####
}
userInfoの構造については、アップルの公式構造を参照してください.
{
"aps" : {
"alert" : "You got your emails.",
"badge" : 9,
"sound" : "bingbong.aiff"
},
"acme1" : "bar",
"acme2" : 42
}
すなわちkey apsは,そのプッシュメッセージの具体的な情報である辞書に対応している.具体的には、私たちが登録したプッシュタイプと関係があります.残りのkeyはユーザーがカスタマイズしたものです.