Sök…


Syntax

  • UIUserNotificationSettings.types: UIUserNotificationType // En bitmask av meddelandetyper som din app får använda
  • UIUserNotificationSettings.categorier: Ställ in // Appens registrerade handlingsgrupper

parametrar

Parameter Beskrivning
användarinformation En ordlista som innehåller information om fjärrmeddelanden, som eventuellt inkluderar ett märkenummer för appikonen, varningsljud, varningsmeddelande, en meddelandeidentifiering och anpassad data.

Registrerar enhet för Push Notifications

Om du vill registrera din enhet för push-aviseringar lägger du till följande kod i din AppDelegate-fil i didFinishLaunchingWithOptions metoden:

Snabb

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    // Override point for customization after application launch.
    if UIDevice.currentDevice().systemVersion.compare(v, options: .NumericSearch) == NSOrderedAscending { 
        // Register for Push Notitications, if running iOS < 8
        if application.respondsToSelector("registerUserNotificationSettings:") {
            let types:UIUserNotificationType = (.Alert | .Badge | .Sound)
            let settings:UIUserNotificationSettings = UIUserNotificationSettings(forTypes: types, categories: nil)

            application.registerUserNotificationSettings(settings)
            application.registerForRemoteNotifications()
        } else {      
            // Register for Push Notifications before iOS 8
            application.registerForRemoteNotificationTypes(.Alert | .Badge | .Sound)
        }
    } else {
        var center = UNUserNotificationCenter.currentNotificationCenter()
        center.delegate = self
        center.requestAuthorizationWithOptions((UNAuthorizationOptionSound | UNAuthorizationOptionAlert | UNAuthorizationOptionBadge)) {(granted: Bool, error: NSError) -> Void in
            if !error {
                UIApplication.sharedApplication().registerForRemoteNotifications()
                // required to get the app to do anything at all about push notifications
                print("Push registration success.")
            } else {
                print("Push registration FAILED")
                print("ERROR: \(error.localizedFailureReason!) - \(error.localizedDescription)")
                print("SUGGESTIONS: \(error.localizedRecoveryOptions) - \(error.localizedRecoverySuggestion!)")
            })
    }

    return true
}

Objective-C

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

if( SYSTEM_VERSION_LESS_THAN( @"10.0" ) )
{
        if ([application respondsToSelector:@selector(isRegisteredForRemoteNotifications)])
    {
        // iOS 8 Notifications
        [application registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeSound | UIUserNotificationTypeAlert | UIUserNotificationTypeBadge) categories:nil]];
        
        [application registerForRemoteNotifications];
    }
    else
    {
        // iOS < 8 Notifications
        [application registerForRemoteNotificationTypes:
         (UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound)];
    }

}
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 );  
         }  
     }];  
}


//to check if your App lunch from Push notification 
//---------------------------------------------------
    //Handel Push notification
    if (launchOptions != nil)
    {
        // Here app will open from pushnotification
        //RemoteNotification
        NSDictionary* dictionary1 = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
        //LocalNotification
        NSDictionary* dictionary2 = [launchOptions objectForKey:UIApplicationLaunchOptionsLocalNotificationKey];
        if (dictionary1 != nil)
        {
            //RemoteNotification Payload
            NSLog(@"Launched from push notification: %@", dictionary1);
            //here handle your push notification
        }
        if (dictionary2 != nil)
        {
            NSLog(@"Launched from dictionary2dictionary2dictionary2 notification: %@", dictionary2);
            double delayInSeconds = 7;
            dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC));
            dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
                // [self addMessageFromRemoteNotification:dictionary2 updateUI:NO];
            });
        }
        
     }
     else
         {}
    //------------------------------------------------

Ovanstående kod kommer att försöka kommunicera med APNs server för att få enhetens token (förutsättningar för att du har APN: er aktiverade i din iOS-tilldelningsprofil).

När den väl har upprättat en tillförlitlig anslutning till APNs-servern ger servern en enhetstoken.

När du har lagt till koden ovan lägger du till dessa metoder i klassen AppDelegate :

Snabb

func application(application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData) {
    print("DEVICE TOKEN = \(deviceToken)")
}

func application(application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: NSError) {
    print(error)
}

Objective-C

- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
{    
NSString * deviceTokenString = [[[[deviceToken description]
                     stringByReplacingOccurrencesOfString: @"<" withString: @""] 
                    stringByReplacingOccurrencesOfString: @">" withString: @""] 
                   stringByReplacingOccurrencesOfString: @" " withString: @""];

NSLog(@"The generated device token string is : %@",deviceTokenString);
}

- (void)application:(UIApplication*)application didFailToRegisterForRemoteNotificationsWithError:(NSError*)error
{
    NSLog(@"Failed to get token, error: %@", error.description);
}

Ovanstående metoder kallas enligt registreringsframgång eller misslyckadescenario.

Framgångsscenariot kallar:

Snabb

func application(application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData) {
    print("DEVICE TOKEN = \(deviceToken)")
}

I Swift3:

@objc(userNotificationCenter:willPresentNotification:withCompletionHandler:) @available(iOS 10.0, *)
func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void)
{
    //To show notifications in foreground.
   print("Userinfo2 \(notification.request.content.userInfo)")
}

Objective-C

- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
{
if(application.applicationState == UIApplicationStateInactive) { 
    NSLog(@"Inactive - the user has tapped in the notification when app was closed or in background");
    //do some tasks
    [self handelPushNotification:userInfo];
}
else if (application.applicationState == UIApplicationStateBackground) {
    NSLog(@"application Background - notification has arrived when app was in background");
    [self handelPushNotification:userInfo];
}
else {
    NSLog(@"application Active - notication has arrived while app was opened");
    //Show an in-app banner
    //do tasks
}
}

Felscenareanrop:

Snabb

func application(application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: NSError) {
    print(error)
}

Objective-C

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

Notera

Om ingen av ovanstående metoder ringer upp kan din enhet inte skapa tillförlitlig anslutning till APN: s server, vilket kan bero på problem med internetåtkomst.

Kontrollerar om din app redan är registrerad för Push Notification

Snabb

let isPushEnabled = UIApplication.sharedApplication().isRegisteredForRemoteNotifications()

Registrerar dig för (icke interaktivt) Push-meddelande

Logiken för att registrera AppDelegate.swift för push-meddelande rekommenderas att läggas till i AppDelegate.swift eftersom återuppringningsfunktionerna (framgång, misslyckande) kommer att kallas deras. Gör följande för att registrera dig:

let application = UIApplication.sharedApplication()
let settings = UIUserNotificationSettings(forTypes: [.Alert, .Badge, .Sound], categories: nil)
application.registerUserNotificationSettings(settings)

Sedan kommer återuppringningsfunktionen didRegisterUserNotificationSettings att didRegisterUserNotificationSettings och i så fall utlöser du bara registret så här:

func application(application: UIApplication, didRegisterUserNotificationSettings notificationSettings: UIUserNotificationSettings) {
    application.registerForRemoteNotifications()
}

Och i så fall kommer en systemvarning att visas och ber om tillåtelse för att få push-meddelande. En av följande återuppringningsfunktioner kommer att anropas:

func application(application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData) {
    let tokenChars = UnsafePointer<CChar>(deviceToken.bytes)
    var tokenString = ""
    
    for i in 0..<deviceToken.length {
        tokenString += String(format: "%02.2hhx", arguments: [tokenChars[i]])
    }
    
    print("Push token: \(tokenString)")
}

func application(application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: NSError) {
    print("didFailToRegisterForRemoteNotificationsWithError: \(error)")
            
}

I mycket sällsynta fall kallas varken framgång eller misslyckande återuppringningsfunktioner. Detta händer när du har problem med internetanslutningen eller APNS Sandbox är nere. Systemet gör ett API-samtal till APNS för att göra viss verifiering, om du inte gör det kommer ingen av de två återuppringningsfunktionerna att anropas. Besök Apples systemstatus för att se till att det är bra.

Hantera Push-meddelande

När användaren klickar på ett push-meddelande kommer följande återuppringningsfunktion att anropas. Du kan analysera JSON för att få all specifik information skickad från backend som hjälper dig att djupa länka:

Snabb

func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject]) {
    print("Received notification: \(userInfo)")
}

Mål C

- (void)application:(UIApplication *)application didReceiveRemoteNotification: (NSDictionary *)userInfo
{
    NSLog(@"Received notification: %@", userInfo);
}

iOS 10

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

-(void) application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void                              (^)(UIBackgroundFetchResult))completionHandler
{
    // iOS 10 will handle notifications through other methods
    NSLog(@"Received notification: %@", userInfo);


    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)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);
}

Registrera app-ID för användning med Push-aviseringar

Saker du behöver

  • Ett betalt medlemskap i Apple Developer Program
  • Ett giltigt app-ID och identifierare för din app (som com.example.MyApp) som inte används tidigare
  • Åtkomst till Developer.apple.com och Members Center
  • En iOS-enhet att testa (eftersom Push Notifications inte fungerar på Simulator)

Aktivera APN: s åtkomst för app-ID i Apple Developer Center

1- Logga in på Developer.apple.com medlemscenter (kontolänken på hemsidan)

ange bildbeskrivning här

2- Gå till "Certifikat"

3- Välj "App-ID" från vänster panel

ange bildbeskrivning här

4- Klicka på "+" uppe till höger

ange bildbeskrivning här

5- Lägg till app-ID med alternativet Push Notifications markerat

6- Klicka på skapat app-ID och välj Redigera

7- Klicka på Konfigurera i panelen Push Notifications

8- Öppna appen Keychain Access på din Mac

9- Från Keychain Access-menyn klickar du på Certificate Assistant -> Begär ett certifikat från en Certificate Authority

10- Ange din e-post i det första textfältet

11- Ange ditt namn i det andra textfältet

ange bildbeskrivning här

12- Lämna CA-e-postadressen tom

13- Välj Sparad på disk istället för E-post till CA

14- Klicka på Fortsätt och ladda upp den genererade filen

15- Ladda ner den genererade filen av Apple och öppna den medan Keychain Access är öppen

Aktivera APN: s åtkomst i Xcode

1- Välj ditt projekt

2- Öppna fliken Funktioner

3- Hitta Push-aviseringar och slå på den

4-Hitta bakgrundslägen och slå på den och kontrollera fjärrmeddelanden

Avregistrerar från Push-aviseringar

För att avregistrera program från fjärrmeddelanden kan du använda

Objective-C

[[UIApplication sharedApplication] unregisterForRemoteNotifications];

Snabb

UIApplication.sharedApplication().unregisterForRemoteNotifications()

det här liknar det att gå in på telefonens inställning och stänga av meddelanden manuellt för applikationen.

OBS: Det kan vara sällsynta fall där du skulle behöva detta (t.ex. när din app inte längre stöder push-aviseringar)

Om du bara vill tillåta användaren att tillfälligt inaktivera aviseringar. Du bör implementera en metod för att ta bort enhetstoken i databasen på din server. annars om du bara inaktiverar avisering lokalt på din enhet kommer din server fortfarande att skicka meddelanden.

Ställer in applikationsikonets märknummer

Använd följande kodkod för att ställa in märkningsnumret från din ansökan (antag att someNumber har deklarerats tidigare):

Objective-C

[UIApplication sharedApplication].applicationIconBadgeNumber = someNumber;

Snabb

UIApplication.shared.applicationIconBadgeNumber = someNumber

För att ta bort märket helt, ställ bara in someNumber = 0 .

Testa push-aviseringar

Det är alltid en bra praxis att testa hur push-aviseringar fungerar även innan du har din serversida redo för dem, bara för att se till att allt är korrekt inställt på din sida. Det är ganska enkelt att skicka dig en push-meddelande med hjälp av följande PHP-skript.

  1. Spara skriptet som en fil (till exempel send_push.php) i samma mapp som ditt certifikat (utveckling eller produktion)
  2. Redigera det för att sätta din enhetens token, lösenord från certifikatet
  3. Välj rätt sökväg för att öppna en anslutning, dev_path eller prod_path (det är där 'Öppna en anslutning till APNS-servern' sker i skriptet)
  4. cd till mappen i Terminal och kör kommandot 'php send_push'
  5. Få meddelandet på din enhet
<?php

// Put your device token here (without spaces):   
$deviceToken = '20128697f872d7d39e48c4a61f50cb11d77789b39e6fc6b4cd7ec80582ed5229';
// Put your final pem cert name here. it is supposed to be in the same folder as this script
$cert_name = 'final_cert.pem';
// Put your private key's passphrase here:
$passphrase = '1234';

// sample point
$alert = 'Hello world!';
$event = 'new_incoming_message';
    
// You can choose either of the paths, depending on what kind of certificate you are using
$dev_path = 'ssl://gateway.sandbox.push.apple.com:2195';
$prod_path = 'ssl://gateway.push.apple.com:2195';
    
////////////////////////////////////////////////////////////////////////////////

$ctx = stream_context_create();
stream_context_set_option($ctx, 'ssl', 'local_cert', $cert_name);
stream_context_set_option($ctx, 'ssl', 'passphrase', $passphrase);

// Open a connection to the APNS server
$fp = stream_socket_client(
    $dev_path, $err,
    $errstr, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx);

if (!$fp)
    exit("Failed to connect: $err $errstr" . PHP_EOL);

echo 'Connected to APNS' . PHP_EOL;

// Create the payload body
// it should be as short as possible
// if the notification doesnt get delivered that is most likely
// because the generated message is too long
$body['aps'] = array(
                     'alert' => $alert,
                     'sound' => 'default',
                     'event' => $event
                     );

// Encode the payload as JSON
$payload = json_encode($body);

// Build the binary notification
$msg = chr(0) . pack('n', 32) . pack('H*', $deviceToken) . pack('n', strlen($payload)) . $payload;

// Send it to the server
$result = fwrite($fp, $msg, strlen($msg));

if (!$result)
    echo 'Message not delivered' . PHP_EOL;
else
    echo 'Message successfully delivered' . PHP_EOL;

// Close the connection to the server
fclose($fp);

Genererar ett .pem-certifikat från din .cer-fil för att vidarebefordra till serverutvecklaren

  1. Spara aps.cer i en mapp

  2. Öppna "Nyckelringstillträde" och exportera nyckeln som finns under certifikatet till en .p12-fil (kalla den key.p12). För att göra det högerklicka på det och välj Export. Spara den i samma mapp som steg 1. Vid export blir du ombedd ett lösenord. Gör något och memorera det.

    exportera

  3. cd till den mappen i Terminal och kör följande kommandon:

  4. Konvertera .cer till ett .pem-certifikat

openssl x509 -in aps.cer -inform der -out aps.pem    
  1. Konvertera din nyckel till .pem-format. Om du vill öppna nyckeln anger du lösenordet du exporterade med från nyckelringen i steg 2. Ange sedan ett annat lösenord som skyddar den exporterade filen. Du blir ombedd att ange den två gånger för bekräftelse.
openssl pkcs12 -nocerts -out key.pem -in key.p12
  1. Slå samman filerna till en slutlig fil
cat key.pem aps.pem > final_cert.pem
  1. Final_cert.pem är det slutliga resultatet. Vidarebefordra det till serverutvecklare med lösenordet från steg 5 så att de kan använda det skyddade certifikatet.


Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow