objective-c - iOS 在应用程序中注册推送通知

标签 objective-c ios push-notification

Q1。我必须在我的应用程序开始时执行此操作吗?或者我可以在我的应用中随时触发允许/不允许的提示吗?

Q2。有没有办法确定用户是否单击了是/否? (回调?)

Q3。如果用户已经点击了否,(在之前的 session 中),我的提示是否真的会触发?或者我是否需要告诉用户转到他们的手机设置并在那里启用它?

原因是我有一个应用程序,其中有一个名为“通知”的部分,他们可以在其中启用/禁用接收有关某些事情的通知,所以我只想提示他们在这个部分中启用等不在应用程序的开头。

最佳答案

A1:不,它不必位于应用程序的开头。您可以从代码中的任何位置调用 registerForRemoteNotificationTypes。

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

您将需要处理以下委托(delegate)方法(在委托(delegate)中),这些方法在注册推送通知成功/失败时被调用。

// 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:可以。有两种可能的情况。如果您的应用程序未运行,您将在 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: 委托(delegate)方法,您可以在其中简单地向 UIAlertView 显示推送通知中的消息并处理 alertView 委托(delegate) OK/Cancel 按钮单击以标准方式。

- (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 Push Notification有关实现细节的文档。

关于objective-c - iOS 在应用程序中注册推送通知,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13113716/

相关文章:

Android - GCMRegistrar.checkDevice() 的 UnSupportedOperation 异常

Android 推送通知未接收/未发送

objective-c - Objective-C 选择器在哪里注册/存储?

objective-c - 什么是好的 Mac objective-c 2D 游戏引擎?

ios - 如何在 iOS 8 中不显示共享表直接启动事件?

ios - "argument contains uninitialised data"设置帧时

javascript - 如何将导航器引用传递给 React Native <Drawer/>?

ios - NSDictionaryOfVariableBindings 快速等效?

objective-c - Xcode 警告 : "May not respond to"

php - APNS SSL 操作失败,代码为 1