8

Q1。アプリの開始時にこれを行う必要がありますか?または、アプリの任意の時点で許可/禁止のプロンプトをトリガーできますか?

Q2。ユーザーが「はい/いいえ」をクリックしたかどうかを確認する方法はありますか?(折り返し電話?)

Q3。ユーザーが(前のセッションで)[いいえ]をクリックした場合、プロンプトは実際に起動しますか?または、電話の設定に移動してそこで有効にするようにユーザーに指示する必要がありますか?

理由は、「通知」というセクションがあり、特定の通知の受信を有効/無効にできるアプリがあるので、このセクションにいるときだけ、有効にするように促したいのです。アプリの起動。

4

4 に答える 4

22

A1:いいえ、アプリの起動時にある必要はありません。コード内のどこからでもregisterForRemoteNotificationTypesを呼び出すことができます。

[[UIApplication sharedApplication] registerForRemoteNotificationTypes:(UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound)];

プッシュ通知の登録の成功/失敗時に呼び出される次のデリゲートメソッド(デリゲート内)を処理する必要があります。

// Delegation methods
- (void)application:(UIApplication *)app didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)devToken {
    const void *devTokenBytes = [devToken bytes];
    self.registered = YES;
    [self sendProviderDeviceToken:devTokenBytes]; // this will send token to your server's database
}

- (void)application:(UIApplication *)app didFailToRegisterForRemoteNotificationsWithError:(NSError *)err {
    NSLog(@"Error in registration. Error: %@", err);
}

A2:はい、できます。考えられるシナリオは2つあります。アプリケーションが実行されていない場合は、didFinishLaunchingWithOptionsでプッシュ通知を処理します。この場合、ユーザーがメッセージアラートで[開く]を選択するか、バナーをクリックすると(ユーザーの設定によって異なります)、アプリケーションが自動的に起動し、プッシュ通知で渡されたユーザーパラメーターを処理できます。

 /* Push notification received when app is not running */
 NSDictionary *params = [[launchOptions objectForKey:@"UIApplicationLaunchOptionsRemoteNotificationKey"] objectForKey:@"appsInfo"];

    if (params) {
        // Use params and do your stuffs
    }

アプリケーションがすでに実行されている場合、プッシュ通知はapplication:didReceiveRemoteNotification:デリゲートメソッドに配信されます。このメソッドでは、プッシュ通知でメッセージをUIAlertViewに表示し、alertViewデリゲートの[OK]/[キャンセル]ボタンのクリックを標準的な方法で処理できます。

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {
    NSDictionary *apsInfo = [userInfo objectForKey:@"apsinfo"]; // This appsInfo set by your server while sending push

    NSString *alert = [apsInfo objectForKey:@"alert"];

    UIApplicationState state = [application applicationState];

    if (state == UIApplicationStateActive) {
        application.applicationIconBadgeNumber = 0;

        AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);

        UIAlertView *alertview = [[UIAlertView alloc] initWithTitle:@"Push Notification"
                                                            message:alert
                                                           delegate:self
                                                  cancelButtonTitle:@"NO"
                                                  otherButtonTitles:@"YES"];
        [alertview show];
        [alertview release];

    } else {
        [self setTabs:contentsInfo];
     }
}


- (void)alertView:(UIAlertView *)alertView willDismissWithButtonIndex:(NSInteger)buttonIndex {
    if (buttonIndex != [alertView cancelButtonIndex]) {
     // User pressed YES, do your stuffs
     }
}

A3:ユーザーがアプリからのプッシュ通知の受け入れを拒否した場合、そのdidFailToRegisterForRemoteNotificationsWithErrorが発生するため、そのユーザーにプッシュ通知を送信するためにサーバー上に必要なユーザーのdevTokenを取得できません。ユーザーが最初に承諾したが、後でプッシュ通知を無効にするように設定を変更した場合、Appleサーバーはそのユーザーにプッシュ通知を送信しません。この場合、そのユーザーのUDIDはフィードバックサービスに表示されます。理想的には、サーバーはそのユーザーのUDIDをデータベースから削除し、今後そのユーザーへのプッシュ通知の送信を停止する必要があります。無効なプッシュ通知を送信し続けると、Appleサーバーがサイレントに接続を切断し、プッシュ通知を送信できなくなる可能性があります。

実装の詳細については、Appleプッシュ通知のドキュメントを参照してください

于 2012-10-28T23:12:07.237 に答える
5
  • Q1アプリの起動時にプッシュレジスタを配置する必要はありませんがapplication: didFinishLaunchingWithOptions:、デバイストークンが開発者のサーバーに正常に保存されるようにするためにプッシュレジスタを配置するものもあります。
  • Q2ここでの「はい/いいえ」は何ですか?「プッシュ通知を受信する場合」で「はい/いいえ」を意味する場合、ユーザーが「はい」をクリックすると、委任application: didRegisterForRemoteNotificationsWithDeviceTokenがトリガーされます。それ以外の場合はトリガーされません。
  • Q3ユーザーが「いいえ」をクリックしてプッシュ通知の受信を拒否した場合、後で設定でオンにするようにユーザーに通知するか、UISwitchなどの機能を使用してユーザーが [[UIApplication sharedApplication] registerForRemoteNotificationTypes:(UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeBadge |UIRemoteNotificationTypeSound)]; 再度トリガーできるようにすることができます。
于 2012-10-29T01:38:27.180 に答える
5

swift(Visit Link)の次のチュートリアルを使用し、ApplePushNotificationのobjective-cの次の簡単なコードを使用できます。

  - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
        if ([application respondsToSelector:@selector(isRegisteredForRemoteNotifications)])
        {
         // iOS 8 Notifications
            [application registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeSound |UIUserNotificationTypeAlert | UIUserNotificationTypeBadge) categories:nil]];
            [application registerForRemoteNotifications];
        }
        return YES;
    }


    - (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
        NSLog(@"Did Register for Remote Notifications with Device Token (%@)", deviceToken);
    }

    - (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error {

        NSLog(@"Did Fail to Register for Remote Notifications");
        NSLog(@"%@, %@", error, error.localizedDescription);
    }

    -(void) application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
        NSLog(@"%@",userInfo);
    }
于 2016-08-02T13:29:05.470 に答える
0

質問に対する回答:iOS10では2。

iOS:10では、完了ハンドラーが実装されています。したがって、完了ハンドラブロック内ですぐに通知されます。

if([[[UIDevice currentDevice] systemVersion] floatValue] >= 10.f){
    UNUserNotificationCenter* notificationCenter = [UNUserNotificationCenter currentNotificationCenter];
    [notificationCenter requestAuthorizationWithOptions:UNAuthorizationOptionAlert | UNAuthorizationOptionSound | UNAuthorizationOptionBadge completionHandler:^(BOOL granted, NSError * _Nullable error) {
        NSLog(@"grant Access:%d",granted);
    }];
于 2017-09-09T17:25:01.117 に答える