2012-10-28 75 views
7

Q1。在我的应用程序开始时,我必须这样做吗?或者,我可以触发提示,允许/不允许我的应用程序的任何时候? Q2302。有没有办法找出用户是否点击是/否? (回调?)iOS在应用程序内注册推送通知

Q3。如果用户已经点击了否(在之前的会话中),我的提示是否会实际触发?或者我需要告诉用户去他们的电话设置并在那里启用它?

原因是我有一个应用程序里面有一个叫做“通知”的部分,他们可以启用/禁用接收某些事情的通知,所以我只想提示他们启用等等,当他们在这个部分不在应用程序的开始部分。

+0

如果您使用'UserNotifications' *框架*,那么您可以在iOS 10中查看用户是否使用回调单击是/否。请参阅[这里](http://useyourloaf.com/blog/local-notifications-with-ios-10/) – Honey

回答

21

A1:不,它并不一定是在应用的开始。您可以从代码中的任何位置调用registerForRemoteNotificationTypes。

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

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

// 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:委托方法,您可以在推送通知的消息,只是目前UIAlertView中和处理alertView代表确定/取消以标准的方式按一下按钮。

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

+0

如果用户拒绝接收推送通知或关闭设置中的推送通知,那么我们如何处理re的情况 - 提示用户? .i.e。,如何知道用户没有注册为推送并给他重新提示? –

+1

**这个答案(和其他可能的答案)部分过时**。它仅适用于iOS <7。在iOS789中,你必须做一个单独的'[register registerForRemoteNotifications]',因为它可以让你获得令牌(在没有用户许可的情况下你可以做的事情;只有当你给用户发出警报/ )。在iOS 10中有一个名为'UserNotifications'的新框架,可以让您找出用户是否允许访问。请参阅[这里了解iOS 10的更多信息](http://useyourloaf.com/blog/local-notifications-with-ios-10/)(1/2) – Honey

+0

在之前的版本中,您必须'[application isRegisteredForRemoteNotifications]'看看你是否注册(2/2) – Honey

5
  • Q1这是没有必要把推动寄存器在应用程序启动,但也有一些 把它application: didFinishLaunchingWithOptions:以某种方式 确保设备令牌成功存储开发者的服务器上。
  • Q2这里的“是/否”是什么?如果你指的“是/否”的“如果 收到推送通知”,那么如果用户点击“是”,则 代表application: didRegisterForRemoteNotificationsWithDeviceToken将被触发, 否则不是。
  • Q3如果用户点击“否”拒绝接收推送通知,然后 要么你可以稍后提醒他关在设置或有 功能,就像一个UISwitch的事情,以使用户能够触发 [[UIApplication sharedApplication] registerForRemoteNotificationTypes:(UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeBadge |UIRemoteNotificationTypeSound)];再次使用 。
5

您可以使用下面的教程SWIFT(Visit Link),并使用以下的Objective-C的苹果推送通知简单的代码。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 
     if ([application respondsToSelector:@selector(isRegisteredForRemoteNotifications)]) 
     { 
     // iOS 8 Notifications 
      [application registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeSound |UIUserNotificationTypeAlert | UIUserNotificationTypeBadge) categories:nil]]; 
      [application registerForRemoteNotifications]; 
     } 
     return YES; 
    } 


    - (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken { 
     NSLog(@"Did Register for Remote Notifications with Device Token (%@)", deviceToken); 
    } 

    - (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error { 

     NSLog(@"Did Fail to Register for Remote Notifications"); 
     NSLog(@"%@, %@", error, error.localizedDescription); 
    } 

    -(void) application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler { 
     NSLog(@"%@",userInfo); 
    } 
+0

请使用这个答案... @ applefreak的答案现在已被弃用 – karan

+0

我们也可以跳过其他部分iOS <8通知..现在我们走了一天ios 8及以上...穆罕默德很好的对象代码。 – karan

0

回答为问题:2在IOS 10.

在iOS的:10,完成处理程序实现的。因此,您将在完成处理程序块中立即得到通知。

if([[[UIDevice currentDevice] systemVersion] floatValue] >= 10.f){ 
    UNUserNotificationCenter* notificationCenter = [UNUserNotificationCenter currentNotificationCenter]; 
    [notificationCenter requestAuthorizationWithOptions:UNAuthorizationOptionAlert | UNAuthorizationOptionSound | UNAuthorizationOptionBadge completionHandler:^(BOOL granted, NSError * _Nullable error) { 
     NSLog(@"grant Access:%d",granted); 
    }];