2012-10-28 43 views
7

Q1. Tôi có phải làm điều này khi bắt đầu Ứng dụng của mình không? Hoặc tôi có thể kích hoạt lời nhắc cho phép/không cho phép tại bất kỳ thời điểm nào trong ứng dụng của mình không?Đăng ký iOS cho thông báo đẩy trong ứng dụng

Q2. Có cách nào để tìm hiểu xem người dùng đã nhấp vào có/không? (gọi lại?)

Q3. Nếu người dùng đã nhấp không, (trong phiên trước), lời nhắc của tôi có thực sự kích hoạt không? Hoặc tôi có cần phải yêu cầu người dùng truy cập cài đặt điện thoại của họ và bật nó ở đó không?

Lý do là tôi có ứng dụng có phần bên trong được gọi là "Thông báo", nhờ đó họ có thể bật/tắt để nhận thông báo về một số thứ nhất định, vì vậy tôi chỉ muốn nhắc họ bật. phần không phải lúc bắt đầu ứng dụng.

+0

trong iOS 10 nếu bạn sử dụng khung 'UserNotifications' * thì bạn có thể tìm hiểu xem người dùng đã nhấp có/không sử dụng gọi lại không. Xem [ở đây] (http://useyourloaf.com/blog/local-notifications-with-ios-10/) – Honey

Trả lời

21

A1: Không, nó không phải ở đầu ứng dụng. Bạn có thể gọi registerForRemoteNotificationTypes từ bất cứ nơi nào trong mã.

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

Bạn sẽ cần xử lý các phương thức đại biểu sau đây (trong đại biểu) được gọi khi đăng ký thành công/không thành công để thông báo đẩy.

// 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: Có, bạn có thể. Có hai tình huống có thể xảy ra. Nếu ứng dụng của bạn không chạy, bạn sẽ xử lý thông báo đẩy trong didFinishLaunchingWithOptions. Trong trường hợp này nếu người dùng đã chọn "mở" trong thông báo tin nhắn hoặc nhấp vào Biểu ngữ (tùy thuộc vào cài đặt của người dùng), ứng dụng của bạn sẽ tự động bắt đầu và bạn có thể xử lý thông số người dùng được chuyển trong thông báo đẩy.

/* Push notification received when app is not running */ 
NSDictionary *params = [[launchOptions objectForKey:@"UIApplicationLaunchOptionsRemoteNotificationKey"] objectForKey:@"appsInfo"]; 

    if (params) { 
     // Use params and do your stuffs 
    } 

Nếu ứng dụng của bạn đang chạy, đẩy thông báo sẽ được gửi đến application:didReceiveRemoteNotification: phương pháp đại diện trong đó bạn có thể UIAlertView đơn giản hiện diện với thông điệp trong thông báo push và xử lý các đại biểu alertView OK/Cancel nút nhấp chuột theo cách thông thường.

- (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: Nếu người dùng đã từ chối chấp nhận thông báo đẩy từ ứng dụng của bạn sau đó didFailToRegisterForRemoteNotificationsWithError của nó và bạn vì thế bạn sẽ không nhận devToken của người dùng được yêu cầu để được vào máy chủ của bạn để gửi thông báo đẩy để người dùng đó. Nếu người dùng ban đầu chấp nhận nhưng sau này nếu anh ta thay đổi cài đặt để vô hiệu hóa thông báo đẩy của bạn thì máy chủ Apple sẽ không gửi thông báo đẩy của bạn cho người dùng đó. Trong trường hợp này UDID của người dùng sẽ xuất hiện trong dịch vụ Phản hồi và lý tưởng là máy chủ của bạn nên xóa UDID của người dùng đó khỏi cơ sở dữ liệu và ngừng gửi thông báo đẩy tới người dùng đó. Nếu bạn tiếp tục gửi thông báo đẩy không hợp lệ, máy chủ Apple có thể ngắt kết nối của bạn một cách im lặng và bạn sẽ không thể gửi bất kỳ thông báo đẩy nào.

Xem Apple Push Notification tài liệu để biết chi tiết về triển khai.

+0

Nếu người dùng từ chối nhận thông báo đẩy hoặc tắt thông báo đẩy từ cài đặt, làm cách nào chúng tôi có thể xử lý lại trường hợp -prompting người dùng? .i.e., Làm thế nào để biết rằng người dùng không được đăng ký để đẩy và cung cấp cho anh ta nhắc lại? –

+1

** Câu trả lời này (và các câu trả lời có khả năng khác) đã lỗi thời một phần **. nó chỉ áp dụng cho iOS <7. trong iOS789, bạn phải thực hiện một '[application registerForRemoteNotifications]' riêng biệt vì điều đó sẽ giúp bạn nhận được mã thông báo (một thứ bạn có thể thực hiện mà không có sự cho phép của người dùng), quyền chỉ được yêu cầu nếu bạn đưa ra cảnh báo/huy hiệu, âm thanh cho người dùng). trong iOS 10 có một khung công tác mới có tên 'UserNotifications' cho phép bạn tìm hiểu xem người dùng có cho phép truy cập hay không. Xem [tại đây để biết thêm về iOS 10] (http://useyourloaf.com/blog/local-notifications-with-ios-10/) (1/2) – Honey

+0

Trong các phiên bản trước bạn đã phải '[application isRegisteredForRemoteNotifications]' để xem bạn đã đăng ký hay chưa (2/2) – Honey

5
  • Q1 Đó là không cần thiết để đưa đẩy đăng ký lúc khởi động ứng dụng, nhưng một số làm đặt nó trong application: didFinishLaunchingWithOptions: nào đó đảm bảo token thiết bị được lưu trữ thành công trên máy chủ của nhà phát triển.
  • Q2 "Có/không" ở đây là gì? Nếu bạn có nghĩa là "có/không" trên "nếu nhận thông báo đẩy", thì nếu người dùng nhấp "có", thì ủy quyền application: didRegisterForRemoteNotificationsWithDeviceToken sẽ được kích hoạt, nếu không thì không.
  • Q3 Nếu nhấp chuột người dùng "không" để từ chối nhận thông báo đẩy, sau đó hoặc là bạn có thể sau đó nhắc nhở ông phải bật tính năng này trong cài đặt, hoặc có một chức năng , giống như một điều UISwitch, cho phép người dùng kích hoạt [[UIApplication sharedApplication] registerForRemoteNotificationTypes:(UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeBadge |UIRemoteNotificationTypeSound)]; một lần nữa.
5

Bạn có thể sử dụng hướng dẫn sau đây cho nhanh (Visit Link) và sử dụng mã đơn giản sau đây cho mục tiêu-c cho Thông báo đẩy của Apple.

- (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

hãy dùng câu trả lời này ... @ câu trả lời của applefreak hiện không được chấp nhận – karan

+0

chúng tôi cũng có thể bỏ qua phần khác iOS <8 Thông báo .. như bây giờ một ngày chúng tôi đi ios 8 trở lên ... Mohammad tốt obj c code. – karan

0

trả lời cho cho câu hỏi: 2 trong iOS 10.

Trong iOS: 10, một handler hoàn thành được thực hiện. Do đó bạn sẽ được thông báo ngay lập tức trong khối xử lý hoàn thành.

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); 
    }]; 
Các vấn đề liên quan