15

有点类似于何时调用 didRegisterForRemoteNotificationsWithDeviceToken?.

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

我目前正在registerForRemoteNotificationTypes用户成功登录或创建帐户后拨打电话。

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

如果我遵循文档和示例代码:

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

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

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

但是通过在应用程序启动时请求令牌,委托将被调用两次。

需要几个问题和明确性:

  1. 要发生初始提示,是否registerForRemoteNotificationTypes必须调用 for 才能出现提示?但是,如果我在 AppDelegate 中手动调用它,代理将被调用两次。是不是应该这样?

  2. 如果用户接受初始提示,会didRegisterForRemoteNotificationsWithDeviceToken自动调用吗?registerForRemoteNotificationTypes还是我们必须在 AppDelegate 中调用 ?但是,代表将被调用两次以进行未来的发布?

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

更新

0. 要出现初始提示,是否registerForRemoteNotificationTypes必须调用 for 才能出现提示?但是,如果我在 AppDelegate 中手动调用它,代理将被调用两次。是不是应该这样? 这不是真的。发现registerForRemoteNotiicationTypes在 AppDelegate 中实际上有 2 个。

4

3 回答 3

8

如果用户接受初始提示,会自动调用 didRegisterForRemoteNotificationsWithDeviceToken 吗?不,您的远程通知注册过程在单击“允许访问”时开始,但只有在成功注册 APNS 时才会调用 didRegisterForRemoteNotificationsWithDeviceToken 方法。

如果您的应用程序之前已注册,则调用 registerForRemoteNotificationTypes: 会导致操作系统立即将设备令牌传递给委托,而不会产生额外的开销

您可以通过检查应用程序状态来确定应用程序是否由于用户点击操作按钮而启动,或者通知是否已发送到已运行的应用程序。在委托的 application:didReceiveRemoteNotification: 或 application:didReceiveLocalNotification: 方法的实现中,获取 applicationState 属性的值并对其进行评估。如果值为 UIApplicationStateInactive,则用户点击了操作按钮;如果值为 UIApplicationStateActive,则应用程序在收到通知时位于最前面。

于 2013-09-03T11:23:04.393 回答
2

没有。此方法仅在应用启动时调用一次。如果它被调用两次,那么它将从您的代码中调用。试着看看,如果你把代码像

[application registerUserNotificationSettings:mySettings];
[application registerForRemoteNotifications];

didFinishLaunchingWithOptions

然后去

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

是你可能在打电话[application registerForRemoteNotifications];

所以删除此代码。

于 2017-06-10T11:15:28.340 回答
0

检查函数内部的应用程序状态didReceiveRegistrationToken

let state = UIApplication.shared.applicationState
        if state == .background || state == .inactive {
            print("Background")
        } else if state == .active {
            print("foreground")
        }
于 2019-12-04T00:58:07.557 回答