web-dev-qa-db-ja.com

リモート通知iOS 8

IOS 8でリモート通知用のデバイストークンを取得するにはどうすればよいですか? iOS <8ではdidRegisterForRemoteNotificationsWithDeviceTokenのメソッドAppDelegateを使用し、デバイストークンを返しました。しかし、iOS 8ではそうではありません。

76
quang thang

UIApplication.hのコードを読みます。

あなたはそれを行う方法を知っているでしょう。

最初:

- (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
180
Madao

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];

このコードは許可を求める必要があります。

これで、プッシュ通知を受け取る準備ができました。

75
zeiteisen

私の場合、iOS 7およびiOS 8のプッシュ通知アクセスを要求するために必要な更新を行いましたが、iOS 8ユーザーがアクセスを許可する場合の新しいコールバックを実装していませんでした。このメソッドをアプリのデリゲートに追加する必要がありました。

- (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings {
    [application registerForRemoteNotifications];
}
15
Kyle Clegg

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
1
Ilker Baltaci

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();
}
1
UIUserNotificationType types = UIUserNotificationTypeBadge |
    UIUserNotificationTypeSound | UIUserNotificationTypeAlert;

    UIUserNotificationSettings *mySettings =
    [UIUserNotificationSettings settingsForTypes:types categories:nil];

    [[UIApplication sharedApplication] registerUserNotificationSettings:mySettings];

    [application registerForRemoteNotifications];
0
Dev_Tandel

私はこのアプローチで後方互換性を維持するためのより良い方法を考えています、それは私の場合、あなたのために働くことを願っています。また、理解しやすいです。

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)];
    }