5

Użyłem następujący kod dla iOS 8,9 jak:iOS - Jak zintegrować powiadomienia push w systemie iOS 10?

UIMutableUserNotificationAction *action1; 
    action1 = [[UIMutableUserNotificationAction alloc] init]; 
    [action1 setActivationMode:UIUserNotificationActivationModeBackground]; 
    [action1 setTitle:@"REJECT"]; 
    [action1 setIdentifier:NotificationActionOneIdent]; 
    [action1 setDestructive:NO]; 
    [action1 setAuthenticationRequired:NO]; 

    UIMutableUserNotificationAction *action2; 
    action2 = [[UIMutableUserNotificationAction alloc] init]; 
    [action2 setActivationMode:UIUserNotificationActivationModeBackground];////UIUserNotificationActivationModeBackground 
    [action2 setTitle:@"ACCEPT"]; 
    [action2 setIdentifier:NotificationActionTwoIdent]; 
    [action2 setDestructive:NO]; 
    [action2 setAuthenticationRequired:NO]; 

    UIMutableUserNotificationCategory *actionCategory; 
    actionCategory = [[UIMutableUserNotificationCategory alloc] init]; 
    [actionCategory setIdentifier:NotificationCategoryIdent]; 
    [actionCategory setActions:@[action1, action2] 
        forContext:UIUserNotificationActionContextDefault]; 

    NSSet *categories = [NSSet setWithObject:actionCategory]; 

    UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes: 
             UIUserNotificationTypeSound | UIUserNotificationTypeAlert categories:categories]; 
    [[UIApplication sharedApplication] registerUserNotificationSettings:settings]; 

Uchwyt metodami Delegat:

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler 
{ 
//Handle according to app state 
} 

I // obsłużyć działań

- (void)application:(UIApplication *)application handleActionWithIdentifier:(NSString *)identifier forRemoteNotification:(NSDictionary *)userInfo completionHandler:(void (^)())completionHandler { 
//Handle action as well 
} 

Jak zrobić sam w iOS 10 przy użyciu UserNotifications i UserNotificationsUI framework? muszę również obsługiwać system iOS 8 i iOS 9?

Odpowiedz

36

nie zapomnij, aby włączyć ten

enter image description here

dla Swift3 dla próbki zobaczyć this

importować ramy UserNotifications i dodać UNUserNotificationCenterDelegate w Appdelegate

import UserNotifications 

@UIApplicationMain 
class AppDelegate: UIResponder, UIApplicationDelegate,UNUserNotificationCenterDelegate 


func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { 
    // Override point for customization after application launch. 

    //create the notificationCenter 
    let center = UNUserNotificationCenter.current() 
    center.delegate = self 
    // set the type as sound or badge 
    center.requestAuthorization(options: [.sound,.alert,.badge]) { (granted, error) in 
     // Enable or disable features based on authorization 

     } 
     application.registerForRemoteNotifications() 
    return true 
} 

func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) { 
    let chars = UnsafePointer<CChar>((deviceToken as NSData).bytes) 
    var token = "" 

    for i in 0..<deviceToken.count { 
token += String(format: "%02.2hhx", arguments: [chars[i]]) 
    } 

    print("Registration succeeded!") 
    print("Token: ", token) 
} 

func application(_ application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: NSError) { 
    print("Registration failed!") 
} 

odbierać powiadomienia Stosując ten delegatów

func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (_ options: UNNotificationPresentationOptions) -> Void) { 
    print("Handle push from foreground") 
    // custom code to handle push while app is in the foreground 
    print("\(notification.request.content.userInfo)") 
} 

func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping() -> Void) { 
    print("Handle push from background or closed") 
    // if you set a member variable in didReceiveRemoteNotification, you will know if this is from closed or background 
    print("\(response.notification.request.content.userInfo)") 
} 

Aby uzyskać więcej informacji można zobaczyć w Apple API Reference

Objective-C

AppDelegate.h ma następujące linie:

Etap-1

#import <UserNotifications/UserNotifications.h> 
@interface AppDelegate : UIResponder <UIApplicationDelegate,UNUserNotificationCenterDelegate> 

Etap-2

AppDelegate.m

// define macro 
    #define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending) 
    #define SYSTEM_VERSION_LESS_THAN(v)     ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedAscending) 

Krok-3

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 
application.applicationIconBadgeNumber = 0; 
    if(SYSTEM_VERSION_LESS_THAN(@"10.0")) 
{ 
    [[UIApplication sharedApplication] registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeSound | UIUserNotificationTypeAlert | UIUserNotificationTypeBadge) categories:nil]]; 
    [[UIApplication sharedApplication] registerForRemoteNotifications]; 

} 
else 
{ 
    UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter]; 
    center.delegate = self; 
    [center requestAuthorizationWithOptions:(UNAuthorizationOptionSound | UNAuthorizationOptionAlert | UNAuthorizationOptionBadge) completionHandler:^(BOOL granted, NSError * _Nullable error) 
    { 
if(!error) 
    { 
    [[UIApplication sharedApplication] registerForRemoteNotifications]; // required to get the app to do anything at all about push notifications 
    NSLog(@"Push registration success."); 
} 
else 
{ 
    NSLog(@"Push registration FAILED"); 
    NSLog(@"ERROR: %@ - %@", error.localizedFailureReason, error.localizedDescription); 
    NSLog(@"SUGGESTIONS: %@ - %@", error.localizedRecoveryOptions, error.localizedRecoverySuggestion); 
    } 
    }]; 
} 

return YES; 
} 

to zadziała w wyniku zawijających registerForRemoteNotifications:

- (void)application:(UIApplication*)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken 
{ 
// custom stuff we do to register the device with our AWS middleman 
} 

Następnie, gdy użytkownik kliknie powiadomienie, thi s pożary:

Uruchomi w iOS 10, gdy aplikacja jest na pierwszym planie lub w tle, ale nie zamknięte

-(void) application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void 
    (^)(UIBackgroundFetchResult))completionHandler 
    { 
// iOS 10 will handle notifications through other methods 

if(SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"10.0")) 
{ 
    NSLog(@"iOS version >= 10. Let NotificationCenter handle this one."); 
// set a member variable to tell the new delegate that this is background 
    return; 
} 
NSLog(@"HANDLE PUSH, didReceiveRemoteNotification: %@", userInfo); 

// custom code to handle notification content 

if([UIApplication sharedApplication].applicationState == UIApplicationStateInactive) 
{ 
    NSLog(@"INACTIVE"); 
    completionHandler(UIBackgroundFetchResultNewData); 
} 
else if([UIApplication sharedApplication].applicationState == UIApplicationStateBackground) 
{ 
    NSLog(@"BACKGROUND"); 
    completionHandler(UIBackgroundFetchResultNewData); 
} 
else 
{ 
    NSLog(@"FOREGROUND"); 
    completionHandler(UIBackgroundFetchResultNewData); 
} 
} 


- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo 
{ 
[self application:application didReceiveRemoteNotification:userInfo fetchCompletionHandler:^(UIBackgroundFetchResult result) { 
}]; 
} 

Wtedy dla iOS 10, te dwie metody:

- (void)userNotificationCenter:(UNUserNotificationCenter *)center 
    willPresentNotification:(UNNotification *)notification 
    withCompletionHandler:(void (^)(UNNotificationPresentationOptions options))completionHandler 
    { 
    NSLog(@"Handle push from foreground"); 
    // custom code to handle push while app is in the foreground 
    NSLog(@"%@", notification.request.content.userInfo); 
    } 

- (void)userNotificationCenter:(UNUserNotificationCenter *)center 
didReceiveNotificationResponse:(UNNotificationResponse *)response 
    withCompletionHandler:(void (^)())completionHandler 
    { 
    NSLog(@"Handle push from background or closed"); 
    // if you set a member variable in didReceiveRemoteNotification, you will know if this is from closed or background 
    NSLog(@"%@", response.notification.request.content.userInfo); 
    } 
+0

czek zaktualizowany odpowiedzi –

+0

Użytkownicy, którzy uaktualnili swój projekt do XCode 8, powinni dołączyć UserNotifications.framework do połączonych bibliotek. –

+0

@SofieVos - na pewno –

1

1st) Dodaj UserNotifications.framework do PowiązaneFramew orkiiBiblioteki w ogólnych ustawieniach projektu

2) Dodać te linie do AppDelagte tak

#import <UserNotifications/UserNotifications.h> 
@interface AppDelegate() <UIApplicationDelegate,UNUserNotificationCenterDelegate> 

3rd) dla uzyskania odpowiedzi jako

- (void)userNotificationCenter:(UNUserNotificationCenter *)center 
willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions options))completionHandler{ 
NSLog(@"for handling push in foreground"); 
// Your code 
NSLog(@"%@", notification.request.content.userInfo); //for getting response payload data 
} 

- (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)())completionHandler { 
NSLog(@"for handling push in background"); 
// Your code 
NSLog(@"%@", response.notification.request.content.userInfo); //for getting response payload data 
} 
+0

Brak pierwszego parametru w "notification.request.content.userInfo" –

+0

Najpierw spróbuj wydrukować powiadomienie, myślę, że to ci pomoże. –

+0

Powinno to być: response.notification.request.content.userInfo –

Powiązane problemy