Catch up on everthing we announced at this year's Firebase Summit. Learn more

שלח הודעות למספר מכשירים בפלטפורמות של אפל

Firebase Cloud Messaging מספקת שתי דרכים למקד הודעה למספר מכשירים:

  • הודעות נושא , אשר מאפשרות לך לשלוח הודעה מספר מכשירים אשר מצורפות לנושא מסוים.
  • הודעות לקבוצות התקן , אשר מאפשרת לך לשלוח הודעה אחת מספר מופעים של אפליקציה פועלת על התקנים השייכים לקבוצה.

הדרכה זו מתמקדת שליחת הודעות בנושא משרת את היישום שלך באמצעות SDK של ניהול או API REST עבור FCM, וקבלה וטיפול בהם אפליקציה אפל. דף זה מפרט את כול שלבים כדי להשיג זאת, החל משלב הגדרת אימות - כך שהוא עשוי לכסות צעדים שהשלמתם כבר אם יש לך להגדיר אפליקצית לקוח אפלה עבור FCM או עבדת לאורך השלבים שלחו ההודעה הראשונה שלך .

הוסף את Firebase לפרויקט Apple שלך

חלק זה מכסה משימות שייתכן שהשלמת אם כבר הפעלת תכונות אחרות של Firebase עבור האפליקציה שלך. עבור FCM במיוחד, תצטרך להעלות מפתח אימות APNs שלך ואת להירשם הודעות מרחוק .

דרישות מוקדמות

  • התקן את הדברים הבאים:

    • Xcode 12.5 ואילך
  • ודא שהפרויקט שלך עומד בדרישות הבאות:

    • על הפרויקט שלך למקד לגרסאות הפלטפורמה האלה או מאוחרות יותר:
      • iOS 10
      • macOS 10.12
      • tvOS 12
      • watchOS 6
  • הגדרת מכשיר אפל פיסי מנת להריץ את האפליקציה שלך, ולהשלים את המשימות הבאות:

אם עדיין אין לך פרויקט Xcode ופשוט רוצה לנסות מוצר Firebase, אתה יכול להוריד אחד שלנו דגימות QuickStart .

צור פרויקט Firebase

לפני שתוכל להוסיף את Firebase לאפליקציית Apple שלך, עליך ליצור פרויקט Firebase כדי להתחבר לאפליקציה שלך. בקר להבין Firebase פרוייקטים כדי ללמוד עוד על פרויקטים Firebase.

רשום את האפליקציה שלך ב-Firebase

לאחר שיש לך פרויקט Firebase, תוכל להוסיף אליו את אפליקציית Apple שלך.

בקר להבין פרוייקטים Firebase כדי ללמוד עוד על שיטות עבודה מומלצות שיקולים להוספת יישומים פרויקט Firebase, כולל איך להתמודד עם גרסאות לבנות מרובות.

  1. עבור אל קונסולת Firebase .

  2. במרכז דף סקירת הפרויקט, לחץ על סמל iOS + להשיק את עבודת ההתקנה.

    אם כבר הוסיף יישום לפרויקט Firebase שלך, לחץ על הוסף אפליקציה להצגת אפשרויות הפלטפורמה.

  3. זן זיהוי החבילה של האפליקציה שלך בתחום זיהוי החבילה.

  4. (אופציונלי) זן פרטי אפליקציה אחרים: כינוי App ו- App Store ID.

  5. לחץ אפליקצית רישום.

הוסף קובץ תצורה של Firebase

  1. לחץ להורדה GoogleService-info.plist להשיג קובץ config פלטפורמות Firebase האפל שלך ( GoogleService-Info.plist ).

  2. העבר את קובץ התצורה שלך לשורש פרויקט ה-Xcode שלך. אם תתבקש, בחר להוסיף את קובץ התצורה לכל היעדים.

אם יש לך מזהי צרור מרובים בפרויקט שלך, עליך לשייך כל זיהוי חבילה עם אפליקציית רשום במסוף Firebase כך שכל יישום יכולים להיות משלה GoogleService-Info.plist קובץ.

הוסף ערכות פיתוח של Firebase לאפליקציה שלך

השתמש ב-Swift Package Manager כדי להתקין ולנהל תלות ב-Firebase.

  1. בשנת Xcode, עם פרויקט היישום שלך פתוח, נווט אל קובץ> חבילות סוויפט> הוסף תלות חבילה.
  2. כאשר תתבקש, הוסף את מאגר Firebase Apple platforms SDK:
  3.   https://github.com/firebase/firebase-ios-sdk
      
  4. בחר את ספריית Firebase Cloud Messaging.
  5. לקבלת חווית שימוש אופטימלית עם Firebase Cloud Messaging, אנו ממליצים לאפשר ל- Google Analytics בפרויקט Firebase שלך והוספת SDK Firebase עבור Google Analytics באפליקציה. אתה יכול לבחור בספרייה ללא אוסף IDFA או עם אוסף IDFA.
  6. בסיום, Xcode יתחיל באופן אוטומטי לפתור ולהוריד את התלות שלך ברקע.

העלה את מפתח האימות של ה-APN שלך

העלה את מפתח האימות של ה-APN שלך ל-Firebase. אם עדיין אין לך מפתח אימות APNs, הקפד ליצור אחד המפתחים של אפל חבר המרכז .

  1. בתוך הפרויקט שלך במסוף Firebase, בחר את סמל גלגל השיניים, בחר הגדרות פרויקט, ולאחר מכן בחר את כרטיסיית הודעות בענן.

  2. במפתח אימות APNs תחת תצורת אפליקציה ל- iOS, לחץ על כפתור Upload.

  3. דפדף אל המיקום שבו שמרת המפתח שלך, בחר בו ולאחר מכן לחץ על פתח. מוסיפים את מזהה מפתח עבור המפתח (זמין למפתחים אפל מרכז חבר ) ולחץ על העלאה.

אתחל את Firebase באפליקציה שלך

יהיה עליך להוסיף קוד אתחול Firebase לאפליקציה שלך. ייבא את מודול Firebase והגדר מופע משותף כפי שמוצג:

  1. ייבא את מודול Firebase ב שלך UIApplicationDelegate :

    מָהִיר

    import Firebase

    Objective-C

    @import Firebase;
  2. & Nbsp הגדר FirebaseApp משותף למשל, בדרך כלל של האפליקציה שלך application:didFinishLaunchingWithOptions: השיטה:

    מָהִיר

    // Use Firebase library to configure APIs
    FirebaseApp.configure()

    Objective-C

    // Use Firebase library to configure APIs
    [FIRApp configure];

הירשם לקבלת התראות מרחוק

או בעת ההפעלה, או בנקודה הרצויה בזרימת היישום שלך, רשום את האפליקציה שלך לקבלת התראות מרחוק. התקשר registerForRemoteNotifications כמוצג:

מָהִיר

if #available(iOS 10.0, *) {
  // For iOS 10 display notification (sent via APNS)
  UNUserNotificationCenter.current().delegate = self

  let authOptions: UNAuthorizationOptions = [.alert, .badge, .sound]
  UNUserNotificationCenter.current().requestAuthorization(
    options: authOptions,
    completionHandler: { _, _ in }
  )
} else {
  let settings: UIUserNotificationSettings =
    UIUserNotificationSettings(types: [.alert, .badge, .sound], categories: nil)
  application.registerUserNotificationSettings(settings)
}

application.registerForRemoteNotifications()

Objective-C

if ([UNUserNotificationCenter class] != nil) {
  // iOS 10 or later
  // For iOS 10 display notification (sent via APNS)
  [UNUserNotificationCenter currentNotificationCenter].delegate = self;
  UNAuthorizationOptions authOptions = UNAuthorizationOptionAlert |
      UNAuthorizationOptionSound | UNAuthorizationOptionBadge;
  [[UNUserNotificationCenter currentNotificationCenter]
      requestAuthorizationWithOptions:authOptions
      completionHandler:^(BOOL granted, NSError * _Nullable error) {
        // ...
      }];
} else {
  // iOS 10 notifications aren't available; fall back to iOS 8-9 notifications.
  UIUserNotificationType allNotificationTypes =
  (UIUserNotificationTypeSound | UIUserNotificationTypeAlert | UIUserNotificationTypeBadge);
  UIUserNotificationSettings *settings =
  [UIUserNotificationSettings settingsForTypes:allNotificationTypes categories:nil];
  [application registerUserNotificationSettings:settings];
}

[application registerForRemoteNotifications];

הירשם לאפליקציית הלקוח לנושא

אפליקציות לקוח יכולות להירשם לכל נושא קיים, או שהן יכולות ליצור נושא חדש. כאשר אפליקציית לקוח נרשמת לשם נושא חדש (כזה שלא קיים כבר עבור פרויקט Firebase שלך), נושא חדש בשם זה נוצר ב-FCM וכל לקוח יכול להירשם אליו לאחר מכן.

כדי להירשם לנושא, התקשר לשיטת המנוי מהשרשור הראשי של היישום שלך (FCM אינו בטוח לשרשור). אם בקשת המנוי נכשלת בתחילה, FCM מנסה שוב באופן אוטומטי. במקרים שבהם לא ניתן להשלים את המנוי, המנוי זורק שגיאה שתוכל לתפוס במטפל בהשלמה כפי שמוצג:

מָהִיר

Messaging.messaging().subscribe(toTopic: "weather") { error in
  print("Subscribed to weather topic")
}

Objective-C

[[FIRMessaging messaging] subscribeToTopic:@"weather"
                                completion:^(NSError * _Nullable error) {
  NSLog(@"Subscribed to weather topic");
}];

שיחה זו מבצעת בקשה אסינכרונית ל-FCM העורפי ומרשימה את הלקוח לנושא הנתון. לפני קריאה subscribeToTopic:topic , לוודא כי מופע יישום הלקוח כבר קיבל רישום האסימון באמצעות התקשרות didReceiveRegistrationToken .

בכל פעם שהאפליקציה מתחילה, FCM מוודאת שכל הנושאים המבוקשים נרשמו. כדי לבטל את המנוי, קוראים unsubscribeFromTopic:topic , וביטלו רישום FCM מהנושא ברקע.

קבלה וטיפול בהודעות בנושא

FCM מעביר הודעות נושא באותו אופן כמו הודעות אחרות במורד הזרם.

ליישם application(_:didReceiveRemoteNotification:fetchCompletionHandler:) כמוצג:

מָהִיר

func application(_ application: UIApplication,
                 didReceiveRemoteNotification userInfo: [AnyHashable: Any],
                 fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult)
                   -> Void) {
  // If you are receiving a notification message while your app is in the background,
  // this callback will not be fired till the user taps on the notification launching the application.
  // TODO: Handle data of notification

  // With swizzling disabled you must let Messaging know about the message, for Analytics
  // Messaging.messaging().appDidReceiveMessage(userInfo)

  // Print message ID.
  if let messageID = userInfo[gcmMessageIDKey] {
    print("Message ID: \(messageID)")
  }

  // Print full message.
  print(userInfo)

  completionHandler(UIBackgroundFetchResult.newData)
}

Objective-C

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
    fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
  // If you are receiving a notification message while your app is in the background,
  // this callback will not be fired till the user taps on the notification launching the application.
  // TODO: Handle data of notification

  // With swizzling disabled you must let Messaging know about the message, for Analytics
  // [[FIRMessaging messaging] appDidReceiveMessage:userInfo];

  // ...

  // Print full message.
  NSLog(@"%@", userInfo);

  completionHandler(UIBackgroundFetchResultNewData);
}

בנה בקשות לשלוח

לאחר שיצרת נושא, בין אם על ידי עשיית מנוי מקרים אפליקציית הלקוח לנושא בצד הלקוח או דרך API השרת , אתה יכול לשלוח הודעות לנושא. אם זו הפעם הראשונה שלך בבניית בקשות שליחה עבור FCM, עיין במדריך כדי בסביבת השרת שלך ו FCM עבור רקע חשוב ומידע התקנה.

בלוגיקת השליחה שלך בקצה האחורי, ציין את שם הנושא הרצוי כפי שמוצג:

Node.js

// The topic name can be optionally prefixed with "/topics/".
const topic = 'highScores';

const message = {
  data: {
    score: '850',
    time: '2:45'
  },
  topic: topic
};

// Send a message to devices subscribed to the provided topic.
getMessaging().send(message)
  .then((response) => {
    // Response is a message ID string.
    console.log('Successfully sent message:', response);
  })
  .catch((error) => {
    console.log('Error sending message:', error);
  });

ג'אווה

// The topic name can be optionally prefixed with "/topics/".
String topic = "highScores";

// See documentation on defining a message payload.
Message message = Message.builder()
    .putData("score", "850")
    .putData("time", "2:45")
    .setTopic(topic)
    .build();

// Send a message to the devices subscribed to the provided topic.
String response = FirebaseMessaging.getInstance().send(message);
// Response is a message ID string.
System.out.println("Successfully sent message: " + response);

פִּיתוֹן

# The topic name can be optionally prefixed with "/topics/".
topic = 'highScores'

# See documentation on defining a message payload.
message = messaging.Message(
    data={
        'score': '850',
        'time': '2:45',
    },
    topic=topic,
)

# Send a message to the devices subscribed to the provided topic.
response = messaging.send(message)
# Response is a message ID string.
print('Successfully sent message:', response)

ללכת

// The topic name can be optionally prefixed with "/topics/".
topic := "highScores"

// See documentation on defining a message payload.
message := &messaging.Message{
	Data: map[string]string{
		"score": "850",
		"time":  "2:45",
	},
	Topic: topic,
}

// Send a message to the devices subscribed to the provided topic.
response, err := client.Send(ctx, message)
if err != nil {
	log.Fatalln(err)
}
// Response is a message ID string.
fmt.Println("Successfully sent message:", response)

C#

// The topic name can be optionally prefixed with "/topics/".
var topic = "highScores";

// See documentation on defining a message payload.
var message = new Message()
{
    Data = new Dictionary<string, string>()
    {
        { "score", "850" },
        { "time", "2:45" },
    },
    Topic = topic,
};

// Send a message to the devices subscribed to the provided topic.
string response = await FirebaseMessaging.DefaultInstance.SendAsync(message);
// Response is a message ID string.
Console.WriteLine("Successfully sent message: " + response);

מנוחה

POST https://fcm.googleapis.com/v1/projects/myproject-b5ae1/messages:send HTTP/1.1

Content-Type: application/json
Authorization: Bearer ya29.ElqKBGN2Ri_Uz...HnS_uNreA
{
  "message":{
    "topic" : "foo-bar",
    "notification" : {
      "body" : "This is a Firebase Cloud Messaging Topic Message!",
      "title" : "FCM Message"
      }
   }
}

פקודת cURL:

curl -X POST -H "Authorization: Bearer ya29.ElqKBGN2Ri_Uz...HnS_uNreA" -H "Content-Type: application/json" -d '{
  "message": {
    "topic" : "foo-bar",
    "notification": {
      "body": "This is a Firebase Cloud Messaging Topic Message!",
      "title": "FCM Message"
    }
  }
}' https://fcm.googleapis.com/v1/projects/myproject-b5ae1/messages:send HTTP/1.1

כדי לשלוח הודעת שילוב של נושאים, ציין מצב, שבו הוא ביטוי בוליאני המציין את נושאי היעד. לדוגמה, התנאי הבא ישלח הודעות למכשירים אשר מנוי על TopicA ואו TopicB או TopicC :

"'TopicA' in topics && ('TopicB' in topics || 'TopicC' in topics)"

FCM מעריך תחילה תנאים בסוגריים, ולאחר מכן מעריך את הביטוי משמאל לימין. בביטוי שלמעלה, משתמש שנרשם לאף נושא בודד אינו מקבל את ההודעה. כמו כן, משתמש אשר אינו מנוי על TopicA אינו מקבל את המסר. השילובים האלה אכן מקבלים את זה:

  • TopicA ו TopicB
  • TopicA ו TopicC

אתה יכול לכלול עד חמישה נושאים בביטוי המותנה שלך.

כדי לשלוח לתנאי:

Node.js

// Define a condition which will send to devices which are subscribed
// to either the Google stock or the tech industry topics.
const condition = '\'stock-GOOG\' in topics || \'industry-tech\' in topics';

// See documentation on defining a message payload.
const message = {
  notification: {
    title: '$FooCorp up 1.43% on the day',
    body: '$FooCorp gained 11.80 points to close at 835.67, up 1.43% on the day.'
  },
  condition: condition
};

// Send a message to devices subscribed to the combination of topics
// specified by the provided condition.
getMessaging().send(message)
  .then((response) => {
    // Response is a message ID string.
    console.log('Successfully sent message:', response);
  })
  .catch((error) => {
    console.log('Error sending message:', error);
  });

ג'אווה

// Define a condition which will send to devices which are subscribed
// to either the Google stock or the tech industry topics.
String condition = "'stock-GOOG' in topics || 'industry-tech' in topics";

// See documentation on defining a message payload.
Message message = Message.builder()
    .setNotification(Notification.builder()
        .setTitle("$GOOG up 1.43% on the day")
        .setBody("$GOOG gained 11.80 points to close at 835.67, up 1.43% on the day.")
        .build())
    .setCondition(condition)
    .build();

// Send a message to devices subscribed to the combination of topics
// specified by the provided condition.
String response = FirebaseMessaging.getInstance().send(message);
// Response is a message ID string.
System.out.println("Successfully sent message: " + response);

פִּיתוֹן

# Define a condition which will send to devices which are subscribed
# to either the Google stock or the tech industry topics.
condition = "'stock-GOOG' in topics || 'industry-tech' in topics"

# See documentation on defining a message payload.
message = messaging.Message(
    notification=messaging.Notification(
        title='$GOOG up 1.43% on the day',
        body='$GOOG gained 11.80 points to close at 835.67, up 1.43% on the day.',
    ),
    condition=condition,
)

# Send a message to devices subscribed to the combination of topics
# specified by the provided condition.
response = messaging.send(message)
# Response is a message ID string.
print('Successfully sent message:', response)

ללכת

// Define a condition which will send to devices which are subscribed
// to either the Google stock or the tech industry topics.
condition := "'stock-GOOG' in topics || 'industry-tech' in topics"

// See documentation on defining a message payload.
message := &messaging.Message{
	Data: map[string]string{
		"score": "850",
		"time":  "2:45",
	},
	Condition: condition,
}

// Send a message to devices subscribed to the combination of topics
// specified by the provided condition.
response, err := client.Send(ctx, message)
if err != nil {
	log.Fatalln(err)
}
// Response is a message ID string.
fmt.Println("Successfully sent message:", response)

C#

// Define a condition which will send to devices which are subscribed
// to either the Google stock or the tech industry topics.
var condition = "'stock-GOOG' in topics || 'industry-tech' in topics";

// See documentation on defining a message payload.
var message = new Message()
{
    Notification = new Notification()
    {
        Title = "$GOOG up 1.43% on the day",
        Body = "$GOOG gained 11.80 points to close at 835.67, up 1.43% on the day.",
    },
    Condition = condition,
};

// Send a message to devices subscribed to the combination of topics
// specified by the provided condition.
string response = await FirebaseMessaging.DefaultInstance.SendAsync(message);
// Response is a message ID string.
Console.WriteLine("Successfully sent message: " + response);

מנוחה

POST https://fcm.googleapis.com/v1/projects/myproject-b5ae1/messages:send HTTP/1.1

Content-Type: application/json
Authorization: Bearer ya29.ElqKBGN2Ri_Uz...HnS_uNreA
{
   "message":{
    "condition": "'dogs' in topics || 'cats' in topics",
    "notification" : {
      "body" : "This is a Firebase Cloud Messaging Topic Message!",
      "title" : "FCM Message",
    }
  }
}

פקודת cURL:

curl -X POST -H "Authorization: Bearer ya29.ElqKBGN2Ri_Uz...HnS_uNreA" -H "Content-Type: application/json" -d '{
  "notification": {
    "title": "FCM Message",
    "body": "This is a Firebase Cloud Messaging Topic Message!",
  },
  "condition": "'dogs' in topics || 'cats' in topics"
}' https://fcm.googleapis.com/v1/projects/myproject-b5ae1/messages:send HTTP/1.1

הצעדים הבאים