IOS 8でリモート通知用のデバイストークンを取得するにはどうすればよいですか? iOS <8ではdidRegisterForRemoteNotificationsWithDeviceToken
のメソッドAppDelegate
を使用し、デバイストークンを返しました。しかし、iOS 8ではそうではありません。
あなたはそれを行う方法を知っているでしょう。
最初:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
このようなコードを追加
if ([application respondsToSelector:@selector(registerUserNotificationSettings:)]) {
#ifdef __IPHONE_8_0
UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeAlert
| UIUserNotificationTypeBadge
| UIUserNotificationTypeSound) categories:nil];
[application registerUserNotificationSettings:settings];
#endif
} else {
UIRemoteNotificationType myTypes = UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound;
[application registerForRemoteNotificationTypes:myTypes];
}
Xcode 5とXcode 6の両方を使用しない場合、このコードを試してください
if ([application respondsToSelector:@selector(registerUserNotificationSettings:)]) {
UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:(UIRemoteNotificationTypeBadge
|UIRemoteNotificationTypeSound
|UIRemoteNotificationTypeAlert) categories:nil];
[application registerUserNotificationSettings:settings];
} else {
UIRemoteNotificationType myTypes = UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound;
[application registerForRemoteNotificationTypes:myTypes];
}
(@ zeiteisen @dmurのリマインドをありがとう)
第二:
この機能を追加
#ifdef __IPHONE_8_0
- (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings
{
//register to receive notifications
[application registerForRemoteNotifications];
}
- (void)application:(UIApplication *)application handleActionWithIdentifier:(NSString *)identifier forRemoteNotification:(NSDictionary *)userInfo completionHandler:(void(^)())completionHandler
{
//handle the actions
if ([identifier isEqualToString:@"declineAction"]){
}
else if ([identifier isEqualToString:@"answerAction"]){
}
}
#endif
そして、あなたはdeviceTokenを
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
それでも動作しない場合は、この関数を使用し、NSLog error
-(void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error
IOS 8に登録し、古いバージョンを引き続きサポートする方法
UIApplication *application = [UIApplication sharedApplication];
if ([application respondsToSelector:@selector(registerUserNotificationSettings:)]) {
UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeBadge
|UIUserNotificationTypeSound
|UIUserNotificationTypeAlert) categories:nil];
[application registerUserNotificationSettings:settings];
} else {
UIRemoteNotificationType myTypes = UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound;
[application registerForRemoteNotificationTypes:myTypes];
}
アプリのデリゲートに追加します
- (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings {
[application registerForRemoteNotifications];
}
iOS8は、許可を求めずにサイレント通知を受信できます。 - (void)registerForRemoteNotifications
を呼び出します。この後、application:didRegisterForRemoteNotificationsWithDeviceToken:
が呼び出されます
注:トークンを使用したコールバックは、以下の機能を使用してアプリケーションがユーザー通知に正常に登録された場合、またはアプリのバックグラウンド更新が有効になっている場合にのみ呼び出されます。
通知タイプが有効になっている場合は、アプリの設定を確認してください。そうでない場合、デバイストークンは取得されません。
これで、サイレント通知を取得できます
aps {
content-available: 1
}
通知ペイロード
ただし、表示される通知には引き続き許可が必要です。コール
UIUserNotificationType types = UIUserNotificationTypeSound | UIUserNotificationTypeBadge | UIUserNotificationTypeAlert;
UIUserNotificationSettings *notificationSettings = [UIUserNotificationSettings settingsForTypes:types categories:nil];
[application registerUserNotificationSettings:notificationSettings];
このコードは許可を求める必要があります。
これで、プッシュ通知を受け取る準備ができました。
私の場合、iOS 7およびiOS 8のプッシュ通知アクセスを要求するために必要な更新を行いましたが、iOS 8ユーザーがアクセスを許可する場合の新しいコールバックを実装していませんでした。このメソッドをアプリのデリゲートに追加する必要がありました。
- (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings {
[application registerForRemoteNotifications];
}
Madaoの答え( https://stackoverflow.com/a/24488562/859742 )は正しいですが...
UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:(UIRemoteNotificationTypeBadge
もっと「正しい」はずです
UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert) categories:nil];
これらのフラグには同じビットマスク値があり、そのため両方が機能しますが、UIUserNotificationSettings
にはUIUserNotificationType
ではなくUIRemoteNotificationType
が必要です。
それとは別に、私は電話します
[application registerUserNotificationSettings:settings];
AppDelegate
メソッド(付与された権利に応じて)で、
- (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings
Xamarin.iOSを使用してモバイルアプリケーションを構築している場合、このコードスニペットを使用してプッシュ通知登録を要求できます。
if (UIDevice.CurrentDevice.CheckSystemVersion(8,0))
{
UIUserNotificationType userNotificationTypes = UIUserNotificationType.Alert | UIUserNotificationType.Badge | UIUserNotificationType.Sound;
UIUserNotificationSettings settings = UIUserNotificationSettings.GetSettingsForTypes(userNotificationTypes, null);
UIApplication.SharedApplication.RegisterUserNotificationSettings(settings);
}
else
{
UIRemoteNotificationType notificationTypes = UIRemoteNotificationType.Alert | UIRemoteNotificationType.Badge | UIRemoteNotificationType.Sound;
UIApplication.SharedApplication.RegisterForRemoteNotificationTypes(notificationTypes);
}
また、APNSサーバーから返されるデバイストークンを取得するには、DidRegisterUserNotificationSettings
メソッドをオーバーライドする必要があります。
public override void DidRegisterUserNotificationSettings(UIApplication application, UIUserNotificationSettings notificationSettings)
{
application.RegisterForRemoteNotifications();
}
UIUserNotificationType types = UIUserNotificationTypeBadge |
UIUserNotificationTypeSound | UIUserNotificationTypeAlert;
UIUserNotificationSettings *mySettings =
[UIUserNotificationSettings settingsForTypes:types categories:nil];
[[UIApplication sharedApplication] registerUserNotificationSettings:mySettings];
[application registerForRemoteNotifications];
私はこのアプローチで後方互換性を維持するためのより良い方法を考えています、それは私の場合、あなたのために働くことを願っています。また、理解しやすいです。
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0)
{
[[UIApplication sharedApplication] registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeSound | UIUserNotificationTypeAlert | UIUserNotificationTypeBadge) categories:nil]];
[[UIApplication sharedApplication] registerForRemoteNotifications];
}
else
{
[[UIApplication sharedApplication] registerForRemoteNotificationTypes:
(UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert)];
}