didRegisterForRemoteNotificationsWithDeviceToken调用了两次?

时间:2013-09-03 10:19:54

标签: ios push-notification apple-push-notifications

When is didRegisterForRemoteNotificationsWithDeviceToken called?有些相似。

当用户第一次安装该应用并提示是否接受通知时,如果用户接受通知,则会调用didRegisterForRemoteNotificationsWithDeviceToken吗?

用户成功登录或创建帐户后,我正在呼叫registerForRemoteNotificationTypes

在随后的启动中,即使没有在AppDelegate中调用didRegisterForRemoteNotificationsWithDeviceToken,也会调用registerForRemoteNotificationTypes委托。

如果我按照文档和示例代码进行操作:

  

每次启动应用程序时,通过请求设备令牌并将其传递给提供程序,可以帮助确保提供程序具有设备的当前令牌。

- (void)applicationDidFinishLaunching:(UIApplication *)app {

   // other setup tasks here....
    [[UIApplication sharedApplication] registerForRemoteNotificationTypes:...
}

但是,当应用程序启动时请求令牌,代理将被调用两次。

需要提出几个问题和清晰度:

  1. 要发生初始提示,必须拨打registerForRemoteNotificationTypes才能显示提示?但是,如果我在AppDelegate中手动调用该代理,则会调用该代理两次。假设是这样吗?

  2. 如果用户接受初始提示,是否会自动调用didRegisterForRemoteNotificationsWithDeviceToken?或者我们必须援引 AppDelegate中的registerForRemoteNotificationTypes?但是,代表将在未来的发布会上被召集两次?

  3. 如果用户拒绝并稍后通过设置接受,会发生什么?

  4. 更新

    0。要初始提示,必须调用registerForRemoteNotificationTypes才能显示提示?但是,如果我在AppDelegate中手动调用该代理,则会调用该代理两次。是假设是这样吗? 这不是真的。发现在AppDelegate中实际上有2 registerForRemoteNotiicationTypes

3 个答案:

答案 0 :(得分:7)

如果用户接受初始提示,是否会自动调用didRegisterForRemoteNotificationsWithDeviceToken? 不,单击“允许访问”时会启动远程通知注册过程,但仅在成功进行APNS注册时才会调用didRegisterForRemoteNotificationsWithDeviceToken方法。

  

如果您的申请先前已注册,请致电   registerForRemoteNotificationTypes:操作系统中的结果   将设备令牌立即传递给代理人而不会产生任何影响   额外开销

     

您可以确定是否由于启动了应用程序   用户点击操作按钮或通知是否   通过检查已发送到已经运行的应用程序   申请状态。在代表的实施中   application:didReceiveRemoteNotification:或   application:didReceiveLocalNotification:方法,获取值   applicationState属性并对其进行评估。如果值是   UIApplicationStateInactive,用户点击了动作按钮;如果   值是UIApplicationStateActive,应用程序是最重要的   它收到了通知。

答案 1 :(得分:2)

不。此方法仅在应用启动时调用一次。如果它被调用两次,那么它将从你的代码中调用。如果要输入像

这样的代码,请尝试查看
[application registerUserNotificationSettings:mySettings];
[application registerForRemoteNotifications];
didFinishLaunchingWithOptions

中的

然后转到

- (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings

是您可能正在调用[application registerForRemoteNotifications];

删除此代码。

答案 2 :(得分:0)

检查功能didReceiveRegistrationToken内的应用程序状态

let state = UIApplication.shared.applicationState
        if state == .background || state == .inactive {
            print("Background")
        } else if state == .active {
            print("foreground")
        }