আইওএস APN পুশ নোটিফিকেশন

আইওএস APN পুশ নোটিফিকেশন প্রজেক্টে কিভাবে প্রয়োগ করা যায়, তাই দেখব। একটা প্রজেক্ট তৈরি করে নিব। প্রজেক্টটির বান্ডেল আইডেন্টিফায়ারটা ঠিক মত দিব।

কোন প্রজেক্টে পুশ নোটিফিকেশন কনফিগার করার জন্য মাত্র দুইটা লাইন লিখতে।  AppDeligate.swift ফাইলটা ওপেন করব। এরপর নিচের কোডগুলো didFinishLaunchingWithOptions এ যুক্ত করে দিব। প্রথম ফাংশনটি হচ্ছে didFinishLaunchingWithOptions।


application.registerForRemoteNotifications() 

application.registerUserNotificationSettings(UIUserNotificationSettings(forTypes: .Alert, categories: nil))

এ দুইটি লাইন যুক্ত করার পর অ্যাপটি রান করলে প্রথমবার অ্যাপটি ওপেন করলে আমাদের জিজ্ঞেস করবে আমরা পুশ নোটিফিকেশন পারমিশন চাইবে।

এবার নিচের মেথড গুলোও AppDeligate.swift ফাইলে যুক্ত করে দিব।


 func application(application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: NSError) {
 print(error)
 }
 
 func application(application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData) {
 print(deviceToken)
 
 }
 
 func application(application: UIApplication, didReceiveRemoteNotificationuserInfo: [NSObject : AnyObject]) {
 
 }

পুশ নোটিফিকেশন এর জন্য আমাদের আপাতত কোন কোড লিখতে হবে না। এতটুকু লিখলেই আমরা একটা প্রজেক্টে পুশ নোটিফিকেশন ইন্ট্রিগ্রেট করতে পারব। এবার অ্যাপ এর বান্ডেল আইডেন্টিফায়ারটা কপি করব।

ios bundle identifire

 

পুশ নোটিফিকেশন যুক্ত করতে হলে অ্যাপলের আইওএস ডেভেলপার প্রোগ্রামটি থাকতে হয়। ধরে নিচ্ছি আপনার ডেভেলপার একাউণ্টে এক্সেস আছে। অ্যাপলের আইওএস ডেভেলপার একাউন্টে গিয়ে Apple Developer Certificates, Identifiers & Profiles থেকে একটা App ID তৈরি করব। তার জন্য Identifier সেকশন থেকে App IDs এ ক্লিক করব। এরপর + এ ক্লিক করব। নিচের মত অপশন পাবো। এখানে অ্যাপ এর নাম এবং Explicit App ID তে আমাদের অ্যাপের বান্ডেল আইডেন্টিফায়ারটা দিব।

নিচের দিকে App Services সেকশন থেকে Push Notifications এ টিক দিব। এরপর Continue করব। এবং শেষে Generate এ ক্লিক করব।

 

create App ID

 

অ্যাপ আইডি তৈরি করা হলে আমরা পুশ নটিফিকেশনের জন্য সার্টিফিকেট তৈরি করব। তার জন্য Certificate সেকশন থেকে Development এ ক্লিক করব। প্লাস বাটনে ক্লিক করে  Apple Push Notification service এ ক্লিক করব। এবং কন্টিনিউ করব।

 

Push Cirtificate

পরের স্ক্রিন থেকে আমরা যে অ্যাপ আইডিটা তৈরি করেছি, তা সিলেক্ট করব। এবং কন্টিনিউ করব। এবং শেষে আবার কন্টিনিউ করব। এখানে আমাদের একটা .certSigningRequest ফাইল আপলোড করতে বলবে। তার জন্য ম্যাকের প্রোগ্রাম থেকে Keychain Access প্রোগ্রামটা ওপেন করব।

Keychain Access > Certificate Assistant > Request a Certificate From a Certificate Authority তে ক্লিক করব।

 

Keychain access

 

তাহলে নিচের মত অপশন পাবো। এখানে একটা ইমেইল দিব। এবং Save to Disk এ ক্লিক করব।

 

Cirtificate Requist

এবং শেষে যেখানে সেভ করব, তা দেখিয়ে দিব। এবার আবার ব্রাউজারে ফিরে গিয়ে সদ্য তৈরি করা ফাইলটি আপলোড করব। এবং কন্টিনিউতে ক্লিক করব।

Generate Cirtificate

তাহলে আমাদের জন্য একটা সার্টিফিকেট তৈরি করবে। এবার এই সার্টিফিকেটটা ডাউনলোড করে ডাবল ক্লিক করে ওপেন করব।

আবার Keychain Access  এ ফিরব। এবার এই সার্টিফিকেটটা Keychain Access থেকে এক্সপোর্ট করব। বান্ডেল আইডেন্টিফারটা দেখে সঠিক সার্টিফিকেটটা সিলেক্ট করব। আমাদের দুইবার এক্সপোর্ট করতে হবে।  একবার .p12 ফাইল হিসেবে। একবার .cer ফাইল হিসেবে। Export এ ক্লিক করলেই অপশন পাবো।

 

Export Certificate

 

 

ঐ দুইটা ফাইল একটা ফোল্ডারে রাখব। যেমন ফাইল দুইটিঃ Certificates.p12 এবং Certificates.cer. টার্মিনাল থেকে ঐ ফোল্ডারে ন্যাভিগেট করব। এবং নিচের কমান্ড লিখবঃ


openssl x509 -in Certificates.cer -inform der -out PushCertificate.pem

 

এরপর নিচের কমান্ড লিখবঃ


openssl pkcs12 -nocerts -in Certificates.p12 -out PushKey.pem

 

আমাদের প্রথমে একটা পাসওয়ার্ড দিতে বলবে। আমরা যদি Certificates.p12 এক্সপোর্ট করতে কোন পাসওয়ার্ড দেই, তাহলে সেটা এখানে দিতে হবে। এক্সপোর্ট করতে কোন পাসওয়ার্ড না দিলে পাসওয়ার্ড না দিয়ে Enter দিব। এরপর একটা passphrase দিতে বলবে। এটা মনে রাখা গুরুত্বপূর্ণ। যেমন আমরা দিলাম 123456.

আমরা দেখব আমাদের ফোল্ডারে দুইটা .pem তৈরি হয়েছে। এই দুইটা ফাইল একসাথ করতে হবে। তার জন্য নিচের কমান্ড লিখবঃ


cat PushCertificate.pem PushKey.pem > PushCertificateAndKey.pem

তাহলে PushCertificateAndKey.pem নামে একটা নতুন pem তৈরি হবে। এটা আমাদের দরকার।

 

পুশ নটিফিকেশনের জন্য সার্ভার থেকে যেন আমরা পুশ পাঠাতে পারি, তা কনফিগার করতে হবে। আমরা পুশ পাঠাবো পিএইচপি দিয়ে। তার জন্য আমাদের ব্যাসিক কিছু পিএইচপি কোড লিখতে হবে। পিএইচপি সম্পর্কে জ্ঞান না থাকলেও সমস্যা নেই। নিচের কোড গুলো একটা পিএইচপি ফাইলে যুক্ত করে দিলেই হবে। এরপর যে কোন পিএইচপি সার্ভারে ফাইলটি রান করলেই আমাদের মোবাইলে নোটিফিকেশন পাঠাবে।

<?php  
/* We are using the sandbox version of the APNS for development. 
For production     environments, change this to ssl://gateway.push.apple.com:2195 
*/
$apnsServer = 'ssl://gateway.sandbox.push.apple.com:2195';
 /* Make sure this is set to the password that you set for your private key when you exported it to the .pem file using openssl on your OS X 
In step 6 Command 2
 */
$privateKeyPassword = '123456';

/* Put your own message here if you want to */
$message = "Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor.";

/* Put your device token here */ 

$deviceToken ='bc78084dd81bc60295f37289bc62b638764f5e5c2b6a0d138a90720fab604254';

/* Replace this with the name of the file that you placed by your PHP script file, containing your private key and certificate that you generated earlier */
$pushCertAndKeyPemFile = 'PushCertificateAndKey.pem';
$stream = stream_context_create();
stream_context_set_option($stream,'ssl','passphrase',$privateKeyPassword);
stream_context_set_option($stream,'ssl','local_cert',$pushCertAndKeyPemFile);
$connectionTimeout = 30;
$connectionType = STREAM_CLIENT_CONNECT | STREAM_CLIENT_PERSISTENT;
$connection = stream_socket_client($apnsServer, $errorNumber, $errorString, $connectionTimeout,$connectionType,$stream);


if (!$connection){
	echo "Failed to connect to the APNS server. Error = $errorString <br/>"; 
	exit;
}else{
	echo "Successfully connected to the APNS. Processing...</br>";
}
$messageBody['aps'] = array('alert' => $message, 'sound' => 'default','badge' => 2);
/*
In iOS 8 and later, the maximum size allowed for a notification payload is 2 kilobytes
Apple Push Notification service refuses any notification that exceeds this limit. 
(Prior to iOS 8 and in OS X, the maximum payload size is 256 bytes.)
*/
$payload = json_encode($messageBody);
$notification = chr(0) . pack('n', 32) . pack('H*', $deviceToken) . pack('n', strlen($payload)) . $payload;
$wroteSuccessfully = fwrite($connection, $notification, strlen($notification));

if (!$wroteSuccessfully){
	echo "Could not send the message<br/>";
} else {
	echo "Successfully sent the message<br/>"; 
}

পিএইচপি ফাইলটি এবং PushCertificateAndKey.pem যেন একই ফোল্ডারে থাকে। পিএইচপি ফাইলে PushCertificateAndKey.pem ফাইলটা দেখিয়ে দিতে হবে।

 

পুশ পাঠানোর জন্য ডিভাইস টোকেন লাগে। কোন ডিভাইসে আমরা পুশ পাঠাবো, তা। প্রজেক্টটি রান করলে কনসোলে ডিভাইস আইডি প্রিন্ট করবে। ঐখানে স্পেসও থাকবে। স্পেস গুলো রিমুভ করে তা পিএইচপি ফাইলে যুক্ত করতে হবে।

 

আইওএস প্রজেক্টে আমাদের আরো কিছু সেটিং ঠিক করতে হবে। Capabilities থেকে Push Notifications টা অন করতে হবে।

 

ios background modes

Background Modes অন করে থেকে Remote Notifications টা সিলেক্ট করতে হবে।

Build Settings থেকে Code Signing সেকশন এ  সার্টিফিকেট যুক্ত করব। 

Code Signing

Provisioning Profile এ আমাদের Push Notification এর সার্টিফিকেটটা সিলেক্ট করব। এ সেটিং গুলো একবার প্রজেক্টের জন্য একবার টার্গেটের জন্য করতে হবে। পুশ নোটিফিকেশন ইমিউলেটরে কাজ করে না। রিয়েল ডিভাইসে কাজ করে। প্রজেক্টটি রিয়েল আইওএস ডিভাইসে রান করার পর কনসোলে একটা ডিভাইস আইডি প্রিন্ট করবে। ঐ ডিভাইস আইডিটি পিএইচপি ফাইলে যুক্ত করে দেওয়ার পর পিএইচপি ফাইলটি রান করলে আমরা নোটিফিকেশন পাবো। অ্যাপটি রানিং থাকলে নোটিফিকেশন কাজ করবে না। অ্যাপ ব্যাগ্রাউন্ডে রেখে নোটিফিকেশন টেস্ট করতে হবে। অনেক কমপ্লেক্স মনে হলেও সহজ।

সব গুলো কোড পাওয়া যাবে গিটহাবে। iOS Push নামক ফোল্ডারে। PHP কোড পাওয়া যাবে php ফোল্ডারে।

Leave a Reply