डिवाइस की स्थिति के आधार पर, आने वाले संदेशों को अलग तरीके से हैंडल किया जाता है। इन परिदृश्यों को समझने और FCM को अपने स्वयं के एप्लिकेशन में कैसे एकीकृत किया जाए, यह समझने के लिए सबसे पहले यह महत्वपूर्ण है कि डिवाइस की विभिन्न स्थितियों को स्थापित किया जाए:
राज्य | विवरण |
---|---|
अग्रभूमि | जब एप्लिकेशन खुला हो, देखने में और उपयोग में हो। |
पृष्ठभूमि | जब एप्लिकेशन खुला हो, लेकिन पृष्ठभूमि में (कम से कम)। यह आमतौर पर तब होता है जब उपयोगकर्ता ने डिवाइस पर "होम" बटन दबाया हो, ऐप स्विचर का उपयोग करके किसी अन्य ऐप पर स्विच किया हो, या एप्लिकेशन को एक अलग टैब (वेब) में खोला हो। |
समाप्त | जब डिवाइस लॉक है या एप्लिकेशन नहीं चल रहा है। |
FCM के माध्यम से संदेश पेलोड प्राप्त करने से पहले कुछ पूर्व शर्तें पूरी की जानी चाहिए:
- आवेदन कम से कम एक बार खोला जाना चाहिए (एफसीएम के साथ पंजीकरण की अनुमति देने के लिए)।
- आईओएस पर, यदि उपयोगकर्ता ऐप स्विचर से एप्लिकेशन को स्वाइप कर देता है, तो पृष्ठभूमि संदेशों को फिर से काम करना शुरू करने के लिए इसे मैन्युअल रूप से फिर से खोलना होगा।
- एंड्रॉइड पर, यदि उपयोगकर्ता डिवाइस सेटिंग्स से ऐप को बलपूर्वक छोड़ देता है, तो संदेशों को काम करना शुरू करने के लिए इसे मैन्युअल रूप से फिर से खोलना होगा।
- वेब पर, आपने अपने वेब पुश प्रमाणपत्र के साथ एक टोकन (
getToken()
का उपयोग करके) का अनुरोध किया होगा।
संदेश प्राप्त करने की अनुमति का अनुरोध करें (Apple और वेब)
iOS, macOS और वेब पर, आपके डिवाइस पर FCM पेलोड प्राप्त करने से पहले, आपको पहले उपयोगकर्ता की अनुमति लेनी होगी।
firebase_messaging
पैकेज requestPermission
विधि के माध्यम से अनुमति का अनुरोध करने के लिए एक सरल एपीआई प्रदान करता है। यह एपीआई कई नामित तर्कों को स्वीकार करता है जो उन अनुमतियों के प्रकार को परिभाषित करता है जिनका आप अनुरोध करना चाहते हैं, जैसे कि अधिसूचना पेलोड वाले मैसेजिंग ध्वनि को ट्रिगर कर सकते हैं या सिरी के माध्यम से संदेशों को पढ़ सकते हैं। डिफ़ॉल्ट रूप से, विधि समझदार डिफ़ॉल्ट अनुमतियों का अनुरोध करती है। संदर्भ API प्रत्येक अनुमति के लिए क्या है, इस पर पूर्ण दस्तावेज़ीकरण प्रदान करता है।
आरंभ करने के लिए, अपने एप्लिकेशन से विधि को कॉल करें (आईओएस पर एक मूल मॉडल प्रदर्शित किया जाएगा, वेब पर ब्राउज़र का मूल एपीआई प्रवाह चालू हो जाएगा):
FirebaseMessaging messaging = FirebaseMessaging.instance;
NotificationSettings settings = await messaging.requestPermission(
alert: true,
announcement: false,
badge: true,
carPlay: false,
criticalAlert: false,
provisional: false,
sound: true,
);
print('User granted permission: ${settings.authorizationStatus}');
उपयोगकर्ता के समग्र निर्णय को निर्धारित करने के लिए अनुरोध से लौटाई गई NotificationSettings
ऑब्जेक्ट की authorizationStatus
संपत्ति का उपयोग किया जा सकता है:
-
authorized
: उपयोगकर्ता ने अनुमति दी। -
denied
: उपयोगकर्ता ने अनुमति देने से इनकार कर दिया। -
notDetermined
: उपयोगकर्ता ने अभी तक यह नहीं चुना है कि अनुमति देना है या नहीं। -
provisional
: उपयोगकर्ता ने अनंतिम अनुमति प्रदान की
NotificationSettings
पर अन्य गुण वापस आते हैं कि वर्तमान डिवाइस पर एक विशिष्ट अनुमति सक्षम, अक्षम या समर्थित नहीं है या नहीं।
एक बार अनुमति मिल जाने के बाद और विभिन्न प्रकार की डिवाइस स्थिति समझ में आने के बाद, आपका एप्लिकेशन अब आने वाले FCM पेलोड को हैंडल करना शुरू कर सकता है।
संदेश संभालना
आपके एप्लिकेशन की वर्तमान स्थिति के आधार पर, विभिन्न संदेश प्रकारों के आने वाले पेलोड को संभालने के लिए अलग-अलग कार्यान्वयन की आवश्यकता होती है:
अग्रभूमि संदेश
जब आपका एप्लिकेशन अग्रभूमि में हो तो संदेशों को संभालने के लिए, onMessage
स्ट्रीम को सुनें।
FirebaseMessaging.onMessage.listen((RemoteMessage message) {
print('Got a message whilst in the foreground!');
print('Message data: ${message.data}');
if (message.notification != null) {
print('Message also contained a notification: ${message.notification}');
}
});
स्ट्रीम में एक RemoteMessage
होता है, जिसमें पेलोड के बारे में विभिन्न जानकारी का विवरण होता है, जैसे कि यह कहाँ से था, अद्वितीय आईडी, भेजा गया समय, क्या इसमें कोई सूचना शामिल है और बहुत कुछ। चूँकि आपका एप्लिकेशन अग्रभूमि में होने के दौरान संदेश को पुनर्प्राप्त कर लिया गया था, आप सीधे अपने फ़्लटर एप्लिकेशन की स्थिति और संदर्भ तक पहुँच सकते हैं।
अग्रभूमि और अधिसूचना संदेश
एप्लिकेशन के अग्रभूमि में होने पर आने वाले अधिसूचना संदेश एंड्रॉइड और आईओएस दोनों पर डिफ़ॉल्ट रूप से एक दृश्य अधिसूचना प्रदर्शित नहीं करेंगे। हालाँकि, इस व्यवहार को ओवरराइड करना संभव है:
- Android पर, आपको एक "उच्च प्राथमिकता" सूचना चैनल बनाना होगा।
- आईओएस पर, आप एप्लिकेशन के लिए प्रेजेंटेशन विकल्पों को अपडेट कर सकते हैं।
पृष्ठभूमि संदेश
मूल (एंड्रॉइड और ऐप्पल) और वेब आधारित प्लेटफॉर्म पर पृष्ठभूमि संदेशों को संभालने की प्रक्रिया अलग है।
Apple प्लेटफॉर्म और Android
onBackgroundMessage
हैंडलर को पंजीकृत करके पृष्ठभूमि संदेशों को संभालें। जब संदेश प्राप्त होते हैं, तो एक आइसोलेट उत्पन्न होता है (केवल Android, iOS/macOS को एक अलग आइसोलेट की आवश्यकता नहीं होती है) जिससे आप संदेशों को तब भी संभाल सकते हैं जब आपका एप्लिकेशन नहीं चल रहा हो।
आपके बैकग्राउंड मैसेज हैंडलर के बारे में कुछ बातों का ध्यान रखना चाहिए:
- यह एक अनाम कार्य नहीं होना चाहिए।
- यह एक शीर्ष-स्तरीय कार्य होना चाहिए (उदाहरण के लिए एक वर्ग विधि नहीं है जिसके लिए आरंभीकरण की आवश्यकता होती है)।
- फ़्लटर संस्करण 3.3.0 या उच्चतर का उपयोग करते समय, संदेश हैंडलर
@pragma('vm:entry-point')
के साथ फ़ंक्शन घोषणा के ठीक ऊपर एनोटेट किया जाना चाहिए (अन्यथा इसे रिलीज़ मोड के लिए ट्री शेकिंग के दौरान हटाया जा सकता है)।
@pragma('vm:entry-point')
Future<void> _firebaseMessagingBackgroundHandler(RemoteMessage message) async {
// If you're going to use other Firebase services in the background, such as Firestore,
// make sure you call `initializeApp` before using other Firebase services.
await Firebase.initializeApp();
print("Handling a background message: ${message.messageId}");
}
void main() {
FirebaseMessaging.onBackgroundMessage(_firebaseMessagingBackgroundHandler);
runApp(MyApp());
}
चूंकि हैंडलर आपके एप्लिकेशन संदर्भ के बाहर अपने स्वयं के अलगाव में चलता है, इसलिए एप्लिकेशन स्थिति को अपडेट करना या किसी यूआई को प्रभावित करने वाले तर्क को निष्पादित करना संभव नहीं है। हालाँकि, आप HTTP अनुरोधों जैसे तर्क कर सकते हैं, IO संचालन कर सकते हैं (जैसे स्थानीय भंडारण को अपडेट करना), अन्य प्लगइन्स के साथ संवाद करना आदि।
जितनी जल्दी हो सके अपने तर्क को पूरा करने की भी सिफारिश की जाती है। लंबे समय तक चलने वाले, गहन कार्य डिवाइस के प्रदर्शन को प्रभावित करते हैं और OS को प्रक्रिया को समाप्त करने का कारण बन सकते हैं। यदि कार्य 30 सेकंड से अधिक समय तक चलते हैं, तो डिवाइस स्वचालित रूप से प्रक्रिया को खत्म कर सकता है।
वेब
वेब पर, एक जावास्क्रिप्ट सर्विस वर्कर लिखें जो पृष्ठभूमि में चलता है। पृष्ठभूमि संदेशों को प्रबंधित करने के लिए सेवा कार्यकर्ता का उपयोग करें।
आरंभ करने के लिए, अपनी web
निर्देशिका में एक नई फ़ाइल बनाएँ, और इसे firebase-messaging-sw.js
नाम दें:
importScripts("https://www.gstatic.com/firebasejs/8.10.0/firebase-app.js");
importScripts("https://www.gstatic.com/firebasejs/8.10.0/firebase-messaging.js");
firebase.initializeApp({
apiKey: "...",
authDomain: "...",
databaseURL: "...",
projectId: "...",
storageBucket: "...",
messagingSenderId: "...",
appId: "...",
});
const messaging = firebase.messaging();
// Optional:
messaging.onBackgroundMessage((message) => {
console.log("onBackgroundMessage", message);
});
फ़ाइल को ऐप और मैसेजिंग SDK दोनों को आयात करना होगा, Firebase को इनिशियलाइज़ करना होगा और messaging
वैरिएबल को एक्सपोज़ करना होगा।
अगला, कार्यकर्ता पंजीकृत होना चाहिए। प्रविष्टि फ़ाइल के भीतर, main.dart.js
फ़ाइल लोड होने के बाद , अपने कार्यकर्ता को पंजीकृत करें:
<html>
<body>
...
<script src="main.dart.js" type="application/javascript"></script>
<script>
if ('serviceWorker' in navigator) {
// Service workers are supported. Use them.
window.addEventListener('load', function () {
// ADD THIS LINE
navigator.serviceWorker.register('/firebase-messaging-sw.js');
// Wait for registration to finish before dropping the <script> tag.
// Otherwise, the browser will load the script multiple times,
// potentially different versions.
var serviceWorkerUrl = 'flutter_service_worker.js?v=' + serviceWorkerVersion;
// ...
});
}
</script>
अगला अपने स्पंदन एप्लिकेशन को पुनरारंभ करें। कार्यकर्ता पंजीकृत होगा और किसी भी पृष्ठभूमि संदेश को इस फाइल के माध्यम से नियंत्रित किया जाएगा।
इंटरेक्शन को संभालना
चूंकि सूचनाएं एक दृश्य संकेत हैं, इसलिए उपयोगकर्ताओं के लिए उनके साथ (दबाकर) बातचीत करना आम बात है। एंड्रॉइड और आईओएस दोनों पर डिफ़ॉल्ट व्यवहार एप्लिकेशन को खोलना है। यदि आवेदन समाप्त हो जाता है तो इसे शुरू कर दिया जाएगा; अगर यह पृष्ठभूमि में है तो इसे अग्रभूमि में लाया जाएगा।
अधिसूचना की सामग्री के आधार पर, आप एप्लिकेशन के खुलने पर उपयोगकर्ता की सहभागिता को संभालना चाह सकते हैं। उदाहरण के लिए, यदि एक अधिसूचना के माध्यम से एक नया चैट संदेश भेजा जाता है और उपयोगकर्ता इसे दबाता है, तो आप एप्लिकेशन के खुलने पर विशिष्ट बातचीत को खोलना चाह सकते हैं।
firebase-messaging
पैकेज इस इंटरैक्शन को संभालने के दो तरीके प्रदान करता है:
-
getInitialMessage()
: यदि एप्लिकेशन को समाप्त स्थिति से खोला जाता है, तो भविष्य मेंRemoteMessage
युक्तFuture
वापस आ जाएगा। एक बार सेवन करने के बाद,RemoteMessage
हटा दिया जाएगा। -
onMessageOpenedApp
: एकStream
जो पृष्ठभूमि स्थिति से एप्लिकेशन खोले जाने परRemoteMessage
पोस्ट करती है।
यह अनुशंसा की जाती है कि आपके उपयोगकर्ताओं के लिए एक सहज UX सुनिश्चित करने के लिए दोनों परिदृश्यों को संभाला जाए। नीचे दिया गया कोड उदाहरण बताता है कि यह कैसे प्राप्त किया जा सकता है:
class Application extends StatefulWidget {
@override
State<StatefulWidget> createState() => _Application();
}
class _Application extends State<Application> {
// It is assumed that all messages contain a data field with the key 'type'
Future<void> setupInteractedMessage() async {
// Get any messages which caused the application to open from
// a terminated state.
RemoteMessage? initialMessage =
await FirebaseMessaging.instance.getInitialMessage();
// If the message also contains a data property with a "type" of "chat",
// navigate to a chat screen
if (initialMessage != null) {
_handleMessage(initialMessage);
}
// Also handle any interaction when the app is in the background via a
// Stream listener
FirebaseMessaging.onMessageOpenedApp.listen(_handleMessage);
}
void _handleMessage(RemoteMessage message) {
if (message.data['type'] == 'chat') {
Navigator.pushNamed(context, '/chat',
arguments: ChatArguments(message),
);
}
}
@override
void initState() {
super.initState();
// Run code required to handle interacted messages in an async function
// as initState() must not be async
setupInteractedMessage();
}
@override
Widget build(BuildContext context) {
return Text("...");
}
}
आप इंटरेक्शन को कैसे हैंडल करते हैं यह आपके एप्लिकेशन सेटअप पर निर्भर करता है। उपरोक्त उदाहरण StatefulWidget का उपयोग करते हुए एक बुनियादी उदाहरण दिखाता है।
संदेशों को स्थानीयकृत करें
आप स्थानीयकृत स्ट्रिंग्स को दो अलग-अलग तरीकों से भेज सकते हैं:
- अपने प्रत्येक उपयोगकर्ता की पसंदीदा भाषा को अपने सर्वर में संग्रहीत करें और प्रत्येक भाषा के लिए अनुकूलित सूचनाएं भेजें
- अपने ऐप में स्थानीयकृत स्ट्रिंग्स एम्बेड करें और ऑपरेटिंग सिस्टम की मूल लोकेल सेटिंग्स का उपयोग करें
यहां बताया गया है कि दूसरी विधि का उपयोग कैसे करें:
एंड्रॉयड
अपने डिफ़ॉल्ट-भाषा संदेशों को
resources/values/strings.xml
में निर्दिष्ट करें:<string name="notification_title">Hello world</string> <string name="notification_message">This is a message</string>
values- language
निर्देशिका में अनुवादित संदेशों को निर्दिष्ट करें। उदाहरण के लिए,resources/values-fr/strings.xml
में फ़्रेंच संदेश निर्दिष्ट करें:<string name="notification_title">Bonjour le monde</string> <string name="notification_message">C'est un message</string>
सर्वर पेलोड में,
title
,message
औरbody
कुंजियों का उपयोग करने के बजाय, अपने स्थानीयकृत संदेश के लिएtitle_loc_key
औरbody_loc_key
का उपयोग करें और उन्हें उस संदेश कीname
विशेषता पर सेट करें जिसे आप प्रदर्शित करना चाहते हैं।संदेश पेलोड इस तरह दिखेगा:
{ "data": { "title_loc_key": "notification_title", "body_loc_key": "notification_message" } }
आईओएस
Base.lproj/Localizable.strings
में अपने डिफ़ॉल्ट-भाषा संदेश निर्दिष्ट करें:"NOTIFICATION_TITLE" = "Hello World"; "NOTIFICATION_MESSAGE" = "This is a message";
language .lproj
निर्देशिका में अनुवादित संदेशों को निर्दिष्ट करें। उदाहरण के लिए,fr.lproj/Localizable.strings
में फ़्रेंच संदेश निर्दिष्ट करें:"NOTIFICATION_TITLE" = "Bonjour le monde"; "NOTIFICATION_MESSAGE" = "C'est un message";
संदेश पेलोड इस तरह दिखेगा:
{ "data": { "title_loc_key": "NOTIFICATION_TITLE", "body_loc_key": "NOTIFICATION_MESSAGE" } }
संदेश वितरण डेटा निर्यात सक्षम करें
आगे के विश्लेषण के लिए आप अपना संदेश डेटा BigQuery में निर्यात कर सकते हैं। BigQuery आपको BigQuery SQL का उपयोग करके डेटा का विश्लेषण करने देता है, इसे किसी अन्य क्लाउड प्रदाता को निर्यात करने देता है, या अपने कस्टम ML मॉडल के लिए डेटा का उपयोग करने देता है। BigQuery को किए जाने वाले निर्यात में संदेशों के लिए सभी उपलब्ध डेटा शामिल होते हैं, भले ही संदेश प्रकार या संदेश API या सूचना कंपोज़र के माध्यम से भेजा गया हो.
निर्यात को सक्षम करने के लिए, पहले यहां बताए गए चरणों का पालन करें, फिर इन निर्देशों का पालन करें:
एंड्रॉयड
आप निम्न कोड का उपयोग कर सकते हैं:
await FirebaseMessaging.instance.setDeliveryMetricsExportToBigQuery(true);
आईओएस
iOS के लिए, आपको निम्न सामग्री के साथ AppDelegate.m
बदलना होगा।
#import "AppDelegate.h"
#import "GeneratedPluginRegistrant.h"
#import <Firebase/Firebase.h>
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
[GeneratedPluginRegistrant registerWithRegistry:self];
// Override point for customization after application launch.
return [super application:application didFinishLaunchingWithOptions:launchOptions];
}
- (void)application:(UIApplication *)application
didReceiveRemoteNotification:(NSDictionary *)userInfo
fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
[[FIRMessaging extensionHelper] exportDeliveryMetricsToBigQueryWithMessageInfo:userInfo];
}
@end
वेब
वेब के लिए, SDK के v9 संस्करण का उपयोग करने के लिए आपको अपने सेवा कार्यकर्ता को बदलने की आवश्यकता है। V9 संस्करण को बंडल करने की आवश्यकता है, इसलिए आपको सेवा कार्यकर्ता को काम पर लाने के लिए उदाहरण के लिए esbuild
जैसे बंडलर का उपयोग करने की आवश्यकता है। इसे कैसे प्राप्त करें यह देखने के लिए उदाहरण ऐप देखें।
एक बार जब आप v9 SDK में माइग्रेट हो जाते हैं, तो आप निम्न कोड का उपयोग कर सकते हैं:
import {
experimentalSetDeliveryMetricsExportedToBigQueryEnabled,
getMessaging,
} from 'firebase/messaging/sw';
...
const messaging = getMessaging(app);
experimentalSetDeliveryMetricsExportedToBigQueryEnabled(messaging, true);
अपने सेवा कार्यकर्ता के नए संस्करण को web
फ़ोल्डर में निर्यात करने के लिए yarn build
चलाना न भूलें।
आईओएस पर अधिसूचनाओं में छवियों को प्रदर्शित करें
Apple उपकरणों पर, FCM पेलोड से छवियों को प्रदर्शित करने के लिए आने वाली FCM सूचनाओं के लिए, आपको एक अतिरिक्त सूचना सेवा एक्सटेंशन जोड़ना होगा और इसका उपयोग करने के लिए अपने ऐप को कॉन्फ़िगर करना होगा।
यदि आप फायरबेस फोन प्रमाणीकरण का उपयोग कर रहे हैं, तो आपको अपने पॉडफाइल में फायरबेस ऑथ पॉड जोड़ना होगा।
चरण 1 - अधिसूचना सेवा विस्तार जोड़ें
- Xcode में, फ़ाइल > नया > लक्ष्य... क्लिक करें
- एक मोडल संभावित लक्ष्यों की एक सूची प्रस्तुत करेगा; अधिसूचना सेवा विस्तार का चयन करने के लिए नीचे स्क्रॉल करें या फ़िल्टर का उपयोग करें। अगला क्लिक करें।
- एक उत्पाद का नाम जोड़ें (इस ट्यूटोरियल के साथ अनुसरण करने के लिए "ImageNotification" का उपयोग करें), भाषा को Objective-C पर सेट करें और समाप्त पर क्लिक करें।
- सक्रिय करें पर क्लिक करके योजना को सक्षम करें।
चरण 2 - पॉडफाइल में लक्ष्य जोड़ें
सुनिश्चित करें कि आपके नए एक्सटेंशन के पास पॉडफाइल में जोड़कर Firebase/Messaging
पॉड तक पहुंच है:
नेविगेटर से, पॉडफाइल खोलें: पॉड्स> पॉडफाइल
फ़ाइल के नीचे स्क्रॉल करें और जोड़ें:
target 'ImageNotification' do use_frameworks! pod 'Firebase/Auth' # Add this line if you are using FirebaseAuth phone authentication pod 'Firebase/Messaging' end
ios
याmacos
निर्देशिका सेpod install
उपयोग करके अपने पॉड्स को स्थापित या अपडेट करें।
चरण 3 - विस्तार सहायक का प्रयोग करें
इस बिंदु पर, सब कुछ अभी भी सामान्य रूप से चलना चाहिए। अंतिम चरण विस्तार सहायक का आह्वान कर रहा है।
नेविगेटर से, अपना ImageNotification एक्सटेंशन चुनें
NotificationService.m
फ़ाइल खोलें।फ़ाइल के शीर्ष पर,
FirebaseMessaging.h
नीचे दिखाए गए अनुसारNotificationService.h
ठीक बाद आयात करें।NotificationService.m
की सामग्री को इसके साथ बदलें:#import "NotificationService.h" #import "FirebaseMessaging.h" #import "FirebaseAuth.h" // Add this line if you are using FirebaseAuth phone authentication #import <UIKit/UIKit.h> // Add this line if you are using FirebaseAuth phone authentication @interface NotificationService () @property (nonatomic, strong) void (^contentHandler)(UNNotificationContent *contentToDeliver); @property (nonatomic, strong) UNMutableNotificationContent *bestAttemptContent; @end @implementation NotificationService /* Uncomment this if you are using Firebase Auth - (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey, id> *)options { if ([[FIRAuth auth] canHandleURL:url]) { return YES; } return NO; } - (void)scene:(UIScene *)scene openURLContexts:(NSSet<UIOpenURLContext *> *)URLContexts { for (UIOpenURLContext *urlContext in URLContexts) { [FIRAuth.auth canHandleURL:urlContext.URL]; } } */ - (void)didReceiveNotificationRequest:(UNNotificationRequest *)request withContentHandler:(void (^)(UNNotificationContent * _Nonnull))contentHandler { self.contentHandler = contentHandler; self.bestAttemptContent = [request.content mutableCopy]; // Modify the notification content here... [[FIRMessaging extensionHelper] populateNotificationContent:self.bestAttemptContent withContentHandler:contentHandler]; } - (void)serviceExtensionTimeWillExpire { // Called just before the extension will be terminated by the system. // Use this as an opportunity to deliver your "best attempt" at modified content, otherwise the original push payload will be used. self.contentHandler(self.bestAttemptContent); } @end
चरण 4 - छवि को पेलोड में जोड़ें
अपने नोटिफिकेशन पेलोड में, अब आप एक इमेज जोड़ सकते हैं। भेजें अनुरोध बनाने के तरीके के बारे में iOS दस्तावेज़ देखें। ध्यान रखें कि डिवाइस द्वारा 300KB अधिकतम छवि आकार लागू किया गया है।