我正在注册我的iPhone应用程序以进行远程通知。
这是我的情景:
我的问题是:
答案 0 :(得分:16)
您想了解UIRemoteNotifications吗? :)很酷,因为它们并不像人们经常让它们变得那么复杂。不过,我将以相反的顺序解决您的问题。它的流动性比方式好。
每次启动应用程序时都应该申请新令牌吗?
排序。使用UIRemoteNotifications,您永远不会真正请求令牌,而是请求权限和接收令牌。您应该做的是在您的app委托中实施application:didRegisterForRemoteNotificationsWithDeviceToken:
。此方法(及其错误捕获的兄弟application:didFailToRegisterForRemoteNotificationsWithError:
)是registerForRemoteNotificationTypes:
的回调。最佳做法是在registerForRemoteNotificationTypes:
期间致电application:didFinishLaunchingWithOptions:
。 (不要担心所有的方法名称都在飞来飞去。我会很快解释代码)。
如果我在没有用户关闭我的应用的关闭通知的情况下请求新令牌,则检索到的令牌不同或始终相同?
也许。出于安全原因,设备令牌可能会发生变化,但一般情况下,您不应该过于关注它的变化。
是否可以检查用户是否在我的应用代码中禁用了我的应用的远程通知?
为什么,是的。 UIApplicationDelegate
有一个名为enabledRemoteNotificationTypes
的方法,它可以获取您请求并由您的用户启用的所有远程通知类型。更多相关内容。
在一天结束时,你应该得到这样的结论:
#define deviceTokenKey @"devtok"
#define remoteNotifTypes UIRemoteNotificationTypeBadge | \
UIRemoteNotificationTypeAlert
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
//generic setup and whatnot
[[UIApplication sharedApplication] registerForRemoteNotificationTypes: remoteNotifTypes];
if (([[NSUserDefaults standardUserDefaults] stringForKey: deviceTokenKey]) &&
([[UIApplication sharedApplication] enabledRemoteNotificationTypes] != remoteNotifTypes))
{
//user has probably disabled push. react accordingly.
}
}
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)token
{
NSString *deviceToken = [token description];
deviceToken = [deviceToken stringByReplacingOccurrencesOfString: @"<" withString: @""];
deviceToken = [deviceToken stringByReplacingOccurrencesOfString: @">" withString: @""];
deviceToken = [deviceToken stringByReplacingOccurrencesOfString: @" " withString: @""];
if ([[NSUserDefaults standardUserDefaults] stringForKey: deviceTokenKey])
{
if (![[[NSUserDefaults standardUserDefaults] stringForKey: deviceTokenKey] isEqualToString: deviceToken])
{
[[NSUserDefaults standardUserDefaults] setObject: deviceToken forKey: deviceTokenKey];
[[NSUserDefaults standardUserDefaults] synchronize];
//user allowed push. react accordingly.
}
}
else
{
[[NSUserDefaults standardUserDefaults] setObject: deviceToken forKey: deviceTokenKey];
[[NSUserDefaults standardUserDefaults] synchronize];
//user allowed push. react accordingly.
}
}
- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error
{
NSLog("application: %@ didFailToRegisterForRemoteNotificationsWithError: %@", application, [error localizedDescription]);
}
答案 1 :(得分:0)
2。 可以根据此SO更改检索到的令牌。
3。 是的,如果令牌发生变化。