Join us for Firebase Summit on November 10, 2021. Tune in to learn how Firebase can help you accelerate app development, release with confidence, and scale with ease. Register

ارسال پیام به چندین دستگاه در iOS

Firebase Cloud Messaging دو روش برای هدف قرار دادن پیام به چندین دستگاه ارائه می دهد:

  • پیام موضوع ، که اجازه می دهد تا شما را به ارسال یک پیام به چند دستگاه که در به یک موضوع خاص نموده اند.
  • پیام های گروه دستگاه ، که اجازه می دهد شما را به ارسال یک پیام واحد به چند نمونه از یک برنامه در حال اجرا بر روی دستگاه های تعلق به یک گروه.

این آموزش در ارسال پیام های موضوع از سرور برنامه خود را با استفاده از تمرکز SDK محیط مدیریت یا REST API برای FCM، و دریافت و دست زدن به آنها را در برنامه های iOS. این صفحه همه مراحل برای رسیدن به این، از راه اندازی به تایید - پس از آن ممکن است مراحل شما در حال حاضر به اتمام اگر شما تحت پوشش راه اندازی یک برنامه سرویس گیرنده در iOS برای FCM یا کار از طریق مراحل به ارسال خود را اولین پیام .

Firebase را به پروژه iOS خود اضافه کنید

این بخش شامل وظایفی است که ممکن است در صورت فعال کردن سایر ویژگی های Firebase برای برنامه خود انجام داده باشید. برای FCM به طور خاص، شما نیاز به آپلود کلیدی APN ها احراز هویت خود را و ثبت نام برای اطلاعیه از راه دور .

پیش نیازها

  • موارد زیر را نصب کنید:

    • کد X.2 12 یا بالاتر
    • CocoaPods 1.10.0 یا بالاتر
  • اطمینان حاصل کنید که پروژه شما دارای این الزامات است:

    • پروژه شما باید iOS 10 یا بالاتر را هدف قرار دهد.
  • تنظیم یک دستگاه فیزیکی در iOS برای اجرای برنامه خود را، و تکمیل این وظایف:

    • به دست آوردن یک هشدار از طریق فشار اپل اعتبار کلید برای خود حساب اپل توسعهدهنده .
    • فعال کردن فشار اطلاعیه در Xcode متعلق به تحت برنامه> قابلیت های.

اگر شما در حال حاضر یک پروژه Xcode متعلق اند و فقط می خواهم سعی کنید از یک محصول فایربیس، شما می توانید یکی از ما را دانلود نمونه شروع سریع .

ایجاد پروژه Firebase

قبل از افزودن Firebase به برنامه iOS خود ، باید یک پروژه Firebase ایجاد کنید تا به برنامه iOS خود متصل شوید. مشاهده درک پروژه فایربیس برای کسب اطلاعات بیشتر در مورد پروژه های فایربیس.

برنامه خود را با Firebase ثبت کنید

پس از انجام پروژه Firebase ، می توانید برنامه iOS خود را به آن اضافه کنید.

مشاهده درک پروژه فایربیس برای کسب اطلاعات بیشتر در مورد بهترین شیوه و ملاحظات برای اضافه کردن برنامه به یک پروژه فایربیس، از جمله نحوه اداره چندین انواع ساخت.

  1. رفتن به کنسول فایربیس .

  2. در مرکز صفحه مرور کلی پروژه، کلیک بر روی آیکون های iOS ( ) برای راه اندازی گردش کار راه اندازی شده است.

    اگر شما در حال حاضر یک برنامه اضافه به پروژه Firebase خود، کلیک کنید اضافه کردن برنامه برای نمایش گزینه های پلت فرم.

  3. ID بسته نرم افزاری برنامه خود را وارد کنید در iOS بسته نرم افزاری به حوزه ID.

  4. نام مستعار برنامه و فروشگاه App ID: (اختیاری) دیگر اطلاعات برنامه را وارد کنید.

  5. برنامه ثبت نام کلیک کنید.

یک فایل پیکربندی Firebase اضافه کنید

  1. برای به دست آوردن فایل پیکربندی فایربیس خود را IOS (کلیک کنید دانلود GoogleService-Info.plist GoogleService-Info.plist ).

  2. فایل پیکربندی خود را به ریشه پروژه Xcode خود منتقل کنید. در صورت درخواست ، انتخاب کنید تا فایل پیکربندی به همه اهداف اضافه شود.

اگر شما شناسه بسته نرم افزاری متعدد در پروژه خود را، شما باید هر ID بسته نرم افزاری با یک برنامه ثبت نام در کنسول فایربیس به طوری که هر برنامه می تواند خود را داشته مرتبط GoogleService-Info.plist فایل.

SDK های Firebase را به برنامه خود اضافه کنید

ما توصیه می کنیم با استفاده از CocoaPods به نصب کتابخانه فایربیس. با این حال، اگر شما ترجیح می CocoaPods استفاده نمی کند، شما می توانید قاب های SDK به طور مستقیم ادغام و یا استفاده از سویفت بسته بندی شده مدیریت به جای.

آیا شما استفاده از یکی از نمونه شروع سریع ؟ این پروژه Xcode و Podfile (با غلاف) در حال حاضر در حال حاضر، اما شما هنوز هم نیاز به اضافه کردن فایل پیکربندی Firebase خود و نصب غلاف.

  1. اگر قبلاً فایل Podfile ندارید ایجاد کنید:

    cd your-project-directory
    pod init
  2. به Podfile خود ، غلاف های Firebase را که می خواهید در برنامه خود استفاده کنید ، اضافه کنید.

    شما می توانید هر یک از اضافه محصولات فایربیس پشتیبانی به برنامه iOS خود را.

    برای یک تجربه بهینه با Firebase ابر پیام، توصیه می کنیم فعال کردن Google Analytics به در پروژه شما. همچنین ، به عنوان بخشی از راه اندازی Analytics ، باید Firebase SDK for Analytics را به برنامه خود اضافه کنید.

    تجزیه و تحلیل فعال است

    # Add the Firebase pod for Google Analytics
    pod 'Firebase/Analytics'
    
    # For Analytics without IDFA collection capability, use this pod instead
    # pod ‘Firebase/AnalyticsWithoutAdIdSupport’
    
    # Add the pod for Firebase Cloud Messaging
    pod 'Firebase/Messaging'

    اطلاعات بیشتر در مورد جشنواره آمستردام، در سطح شناسه دستگاه تبلیغاتی، در اپل بدانید حریم خصوصی کاربر و داده ها استفاده کنید و از نرم افزار ردیابی شفافیت اسناد و مدارک.

    تجزیه و تحلیل فعال نیست

    # Add the pod for Firebase Cloud Messaging
    pod 'Firebase/Messaging'
  3. نصب غلاف، پس از آن خود را باز .xcworkspace فایل که این طرح در Xcode متعلق به:

    pod install
    open your-project.xcworkspace

کلید احراز هویت APN خود را بارگذاری کنید

کلید احراز هویت APN خود را در Firebase بارگذاری کنید. اگر شما در حال حاضر یک کلید APN ها احراز هویت دارند، مطمئن شوید که به ایجاد یک در توسعه مرکز اپل کاربران .

  1. در داخل پروژه خود را در فایربیس کنسول، را انتخاب کنید آیکون چرخ دنده، تنظیمات پروژه را انتخاب کنید، و سپس برگه ابر پیام انتخاب کنید.

  2. در کلید احراز هویت APN ها تحت پیکربندی برنامه های iOS، کلیک بر روی دکمه آپلود.

  3. مرور به محل که در آن کلید خود را نجات داد، آن را انتخاب کنید، و روی Open کلیک کنید. اضافه کردن شماره شناسایی کلید برای کلید (موجود در توسعه مرکز اپل کاربران ) و آپلود را کلیک کنید.

ابتدا Firebase را در برنامه خود فعال کنید

شما باید کد اولیه Firebase را به برنامه خود اضافه کنید. ماژول Firebase را وارد کنید و یک نمونه مشترک را مطابق شکل پیکربندی کنید:

  1. واردات ماژول فایربیس خود را UIApplicationDelegate :

    سریع

    import Firebase

    هدف-ج

    @import Firebase;
  2. پیکربندی FirebaseApp عنوان مثال مشترک، به طور معمول در برنامه شما application:didFinishLaunchingWithOptions: روش:

    سریع

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

    هدف-ج

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

هدف-ج

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

هدف-ج

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

هدف-ج

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

سی شارپ

// 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)

سی شارپ

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

مراحل بعدی