与When is didRegisterForRemoteNotificationsWithDeviceToken called?有些相似。
当用户第一次安装该应用并提示是否接受通知时,如果用户接受通知,则会调用didRegisterForRemoteNotificationsWithDeviceToken
吗?
用户成功登录或创建帐户后,我正在呼叫registerForRemoteNotificationTypes
。
在随后的启动中,即使没有在AppDelegate中调用didRegisterForRemoteNotificationsWithDeviceToken
,也会调用registerForRemoteNotificationTypes
委托。
如果我按照文档和示例代码进行操作:
每次启动应用程序时,通过请求设备令牌并将其传递给提供程序,可以帮助确保提供程序具有设备的当前令牌。
- (void)applicationDidFinishLaunching:(UIApplication *)app {
// other setup tasks here....
[[UIApplication sharedApplication] registerForRemoteNotificationTypes:...
}
但是,当应用程序启动时请求令牌,代理将被调用两次。
需要提出几个问题和清晰度:
要发生初始提示,必须拨打registerForRemoteNotificationTypes
才能显示提示?但是,如果我在AppDelegate中手动调用该代理,则会调用该代理两次。假设是这样吗?
如果用户接受初始提示,是否会自动调用didRegisterForRemoteNotificationsWithDeviceToken
?或者我们必须援引
AppDelegate中的registerForRemoteNotificationTypes
?但是,代表将在未来的发布会上被召集两次?
如果用户拒绝并稍后通过设置接受,会发生什么?
更新
0。要初始提示,必须调用registerForRemoteNotificationTypes
才能显示提示?但是,如果我在AppDelegate中手动调用该代理,则会调用该代理两次。是假设是这样吗? 这不是真的。发现在AppDelegate中实际上有2 registerForRemoteNotiicationTypes
。
答案 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")
}