swift 3 firibase notification kapalı iken gelmiyor.
18.03.2017 - 01:38
siwift 3 te firibase ile bildirim işlemi yapmaya çalışıyorum. sertifika imzasını yaptım. Kodlarım bunlar.
//
// AppDelegate.swift
// Ornek
//
// Created by Cemil Yeşil on 17.03.2017.
// Copyright © 2017 Haber. All rights reserved.
//
import UIKit
import UserNotifications
import Firebase
import FirebaseInstanceID
import FirebaseMessaging
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
func application(_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
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 })
// For iOS 10 data message (sent via FCM)
FIRMessaging.messaging().remoteMessageDelegate = self
} else {
let settings: UIUserNotificationSettings =
UIUserNotificationSettings(types: [.alert, .badge, .sound], categories: nil)
application.registerUserNotificationSettings(settings)
}
application.registerForRemoteNotifications()
// [END register_for_notifications]
FIRApp.configure()
// [START add_token_refresh_observer]
// Add observer for InstanceID token refresh callback.
NotificationCenter.default.addObserver(self,
selector: #selector(self.tokenRefreshNotification),
name: .firInstanceIDTokenRefresh,
object: nil)
// [END add_token_refresh_observer]
return true
}
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
// Print message ID.
FIRMessaging.messaging().appDidReceiveMessage(userInfo)
print("ikinci notification:")
let settings: UIUserNotificationSettings =
UIUserNotificationSettings(types: [.alert, .badge, .sound], categories: nil)
application.registerUserNotificationSettings(settings)
application.registerForRemoteNotifications()
NotificationCenter.default.addObserver(self,
selector: #selector(self.tokenRefreshNotification),
name: .firInstanceIDTokenRefresh,
object: nil)
var turr = ""
var baslikk = ""
var ozett = ""
var icerikk = ""
var resimm = ""
var idd = ""
if let tur = userInfo["tur"] as? String {
print(tur)
turr = tur
}
if let id = userInfo["id"] as? String {
print(id)
idd = id
}
if let baslik = userInfo["baslik"] as? String {
print(baslik)
baslikk = baslik
}
if let ozet = userInfo["ozet"] as? String {
print(ozet)
ozett = ozet
}
if let icerik = userInfo["icerik"] as? String {
print(icerik)
icerikk = icerik
}
if let resim = userInfo["resim"] as? String {
print(resim)
resimm = resim
}
if turr=="bildirim" {
var databasePath = String()
let filemgr = FileManager.default
let dirPaths = filemgr.urls(for: .documentDirectory,
in: .userDomainMask)
databasePath = dirPaths[0].appendingPathComponent("haberler.db").path
let contactDB = FMDatabase(path: databasePath as String)
if (contactDB?.open())! {
let date = Date()
let formatter = DateFormatter()
formatter.dateFormat = "yyyy.MM.dd"
let tarih = formatter.string(from: date)
let insertSQL = "INSERT INTO haberler (baslik, ozet, icerik, img, tarih,tur) VALUES ('"+baslikk+"', '"+ozett+"', '"+icerikk+"', '"+resimm+"', '"+tarih+"', '"+turr+"')"
let result = contactDB?.executeUpdate(insertSQL,
withArgumentsIn: nil)
if result! {
print("Ok: kayıt yapıldı")
}
} else {
print("Error: \(contactDB?.lastErrorMessage())")
}
}
let alert = UIAlertController(title: baslikk, message: ozett, preferredStyle: UIAlertControllerStyle.alert)
alert.addAction(UIAlertAction(title: "Kapat", style: .cancel, handler: nil))
alert.addAction(UIAlertAction(title: "Aç", style: .default, handler:
{ action in
switch action.style {
case .default:
var databasePath = String()
let filemgr = FileManager.default
let dirPaths = filemgr.urls(for: .documentDirectory,
in: .userDomainMask)
databasePath = dirPaths[0].appendingPathComponent("haberler.db").path
let contactDB = FMDatabase(path: databasePath as String)
if (contactDB?.open())! {
let querySQL = "SELECT * FROM haberler "
let results:FMResultSet? = contactDB?.executeQuery(querySQL,
withArgumentsIn: nil)
if results?.next() == true {
while (results?.next())! {
idd=(results?.string(forColumn: "id"))!
}
}
contactDB?.close()
} else {
print("Error: \(contactDB?.lastErrorMessage())")
}
let vc = self.window?.rootViewController?.storyboard?.instantiateViewController(withIdentifier: "Haber_Detay") as! Haber_Detay
vc.imageString = resimm
vc.ozet = ozett
vc.id = idd
vc.tur = turr
vc.icerik = icerikk
self.window?.rootViewController = vc
break
case .cancel: break
case .destructive: break
}
}))
self.window?.rootViewController?.present(alert, animated: true, completion: nil)
// Print full message.
print(userInfo)
completionHandler(UIBackgroundFetchResult.newData)
}
func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject], fetchCompletionHandler completionHandler: (UIBackgroundFetchResult) -> Void) {
// Let FCM know about the message for analytics etc.
FIRMessaging.messaging().appDidReceiveMessage(userInfo)
print("enson")
// handle your message
}
// [START receive_message]
func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any]) {
// 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
// Print message ID.
FIRMessaging.messaging().appDidReceiveMessage(userInfo)
guard let aps = userInfo["aps"] as? [String : AnyObject] else {
print("Error parsing aps")
return
}
let name:NSNotification.Name = NSNotification.Name("notificationName")
NotificationCenter.default.post(name: name, object: nil)
var body = ""
var title = "20Fit"
if let alert = aps["alert"] as? String {
body = alert
} else if let alert = aps["alert"] as? [String : String] {
body = alert["body"]!
title = alert["title"]!
}
let settings: UIUserNotificationSettings =
UIUserNotificationSettings(types: [.alert, .badge, .sound], categories: nil)
application.registerUserNotificationSettings(settings)
application.registerForRemoteNotifications()
NotificationCenter.default.addObserver(self,
selector: #selector(self.tokenRefreshNotification),
name: .firInstanceIDTokenRefresh,
object: nil)
print("birinci notification:")
var turr = ""
var baslikk = ""
var ozett = ""
var icerikk = ""
var resimm = ""
var idd = ""
if let tur = userInfo["tur"] as? String {
print(tur)
turr = tur
}
if let id = userInfo["id"] as? String {
print(id)
idd = id
}
if let baslik = userInfo["baslik"] as? String {
print(baslik)
baslikk = baslik
}
if let ozet = userInfo["ozet"] as? String {
print(ozet)
ozett = ozet
}
if let icerik = userInfo["icerik"] as? String {
print(icerik)
icerikk = icerik
}
if let resim = userInfo["resim"] as? String {
print(resim)
resimm = resim
}
if turr=="bildirim" {
var databasePath = String()
let filemgr = FileManager.default
let dirPaths = filemgr.urls(for: .documentDirectory,
in: .userDomainMask)
databasePath = dirPaths[0].appendingPathComponent("haberler.db").path
let contactDB = FMDatabase(path: databasePath as String)
if (contactDB?.open())! {
let date = Date()
let formatter = DateFormatter()
formatter.dateFormat = "yyyy.MM.dd"
let tarih = formatter.string(from: date)
let insertSQL = "INSERT INTO haberler (baslik, ozet, icerik, img, tarih,tur) VALUES ('"+baslikk+"', '"+ozett+"', '"+icerikk+"', '"+resimm+"', '"+tarih+"', '"+turr+"')"
let result = contactDB?.executeUpdate(insertSQL,
withArgumentsIn: nil)
if result! {
print("Ok: kayıt yapıldı")
}
} else {
print("Error: \(contactDB?.lastErrorMessage())")
}
}
let alert = UIAlertController(title: baslikk, message: ozett, preferredStyle: UIAlertControllerStyle.alert)
alert.addAction(UIAlertAction(title: "Kapat", style: .cancel, handler: nil))
alert.addAction(UIAlertAction(title: "Aç", style: .default, handler:
{ action in
switch action.style {
case .default:
var databasePath = String()
let filemgr = FileManager.default
let dirPaths = filemgr.urls(for: .documentDirectory,
in: .userDomainMask)
databasePath = dirPaths[0].appendingPathComponent("haberler.db").path
let contactDB = FMDatabase(path: databasePath as String)
if (contactDB?.open())! {
let querySQL = "SELECT * FROM haberler "
let results:FMResultSet? = contactDB?.executeQuery(querySQL,
withArgumentsIn: nil)
if results?.next() == true {
while (results?.next())! {
idd=(results?.string(forColumn: "id"))!
}
}
contactDB?.close()
} else {
print("Error: \(contactDB?.lastErrorMessage())")
}
let vc = self.window?.rootViewController?.storyboard?.instantiateViewController(withIdentifier: "Haber_Detay") as! Haber_Detay
vc.imageString = resimm
vc.ozet = ozett
vc.id = idd
vc.tur = turr
vc.icerik = icerikk
self.window?.rootViewController = vc
break
case .cancel: break
case .destructive: break
}
}))
self.window?.rootViewController?.present(alert, animated: true, completion: nil)
// Print full message.
print(userInfo)
}
// [START refresh_token]
func tokenRefreshNotification(_ notification: Notification) {
if let refreshedToken = FIRInstanceID.instanceID().token() {
print("InstanceID token: \(refreshedToken)")
}
// Connect to FCM since connection may have failed when attempted before having a token.
connectToFcm()
}
// [END refresh_token]
// [START connect_to_fcm]
func connectToFcm() {
// Won't connect since there is no token
guard FIRInstanceID.instanceID().token() != nil else {
return
}
// Disconnect previous FCM connection if it exists.
FIRMessaging.messaging().disconnect()
FIRMessaging.messaging().connect { (error) in
if error != nil {
print("Unable to connect with FCM. \(error)")
} else {
let device_id = UIDevice.current.identifierForVendor as Any
let uuid = UIDevice.current.identifierForVendor?.uuidString
print("uuid : " + uuid!)
let token = FIRInstanceID.instanceID().token()
if token != nil{
print("token_id" + token!)
let dict = ["device":uuid! ,"token":token! ] as [String: Any]
if let jsonData = try? JSONSerialization.data(withJSONObject: dict, options: []) {
let url = URL(string: "http://kardessuriye.com/app-json/ios_token_kaydet.php")!
let request = NSMutableURLRequest(url: url as URL)
request.httpMethod = "POST"
request.httpBody = jsonData
request.addValue("application/json", forHTTPHeaderField: "Content-Type")
let task = URLSession.shared.dataTask(with: request as URLRequest){ data,response,error in
if error != nil{
print(error?.localizedDescription)
return
}
do {
let json = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as? NSDictionary
if let parseJSON = json {
}
} catch let error as NSError {
print(error)
}
}
task.resume()
}
}
else{
print("token boş")
}
print("Connected to FCM.")
}
}
}
// [END connect_to_fcm]
func application(_ application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: Error) {
print("Unable to register for remote notifications: \(error.localizedDescription)")
}
// This function is added here only for debugging purposes, and can be removed if swizzling is enabled.
// If swizzling is disabled then this function must be implemented so that the APNs token can be paired to
// the InstanceID token.
func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
let chars = (deviceToken as NSData).bytes.bindMemory(to: CChar.self, capacity: deviceToken.count)
var token = ""
for i in 0..<deviceToken.count {
token += String(format: "%02.2hhx", arguments: [chars[i]])
}
FIRInstanceID.instanceID().setAPNSToken(deviceToken, type:FIRInstanceIDAPNSTokenType.sandbox)
FIRInstanceID.instanceID().setAPNSToken(deviceToken, type: FIRInstanceIDAPNSTokenType.unknown)
FIRInstanceID.instanceID().setAPNSToken(deviceToken, type:FIRInstanceIDAPNSTokenType.prod)
print("Device Token = ", token)
}
func application(application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData) {
FIRInstanceID.instanceID().setAPNSToken(deviceToken as Data, type: FIRInstanceIDAPNSTokenType.unknown)
}
// [START connect_on_active]
func applicationDidBecomeActive(_ application: UIApplication) {
connectToFcm()
application.applicationIconBadgeNumber = 0;
}
// [END connect_on_active]
// [START disconnect_from_fcm]
func applicationDidEnterBackground(_ application: UIApplication) {
FIRMessaging.messaging().disconnect()
print("Disconnected from FCM.")
}
// [END disconnect_from_fcm]
static func registerForPushNotifications() {
let settings: UIUserNotificationSettings =
UIUserNotificationSettings(types: [.alert, .badge, .sound], categories: nil)
UIApplication.shared.registerUserNotificationSettings(settings)
UIApplication.shared.registerForRemoteNotifications()
}
}
// [START ios_10_message_handling]
@available(iOS 10, *)
extension AppDelegate : UNUserNotificationCenterDelegate {
// Receive displayed notifications for iOS 10 devices.
func userNotificationCenter(_ center: UNUserNotificationCenter,
willPresent notification: UNNotification,
withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
let userInfo = notification.request.content.userInfo
// Print message ID.
// Print full message.
print(userInfo)
// Change this to your preferred presentation option
completionHandler([])
}
func userNotificationCenter(_ center: UNUserNotificationCenter,
didReceive response: UNNotificationResponse,
withCompletionHandler completionHandler: @escaping () -> Void) {
let userInfo = response.notification.request.content.userInfo
// Print message ID.
// Print full message.
print(userInfo)
completionHandler()
}
}
// [END ios_10_message_handling]
// [START ios_10_data_message_handling]
extension AppDelegate : FIRMessagingDelegate {
// Receive data message on iOS 10 devices while app is in the foreground.
func applicationReceivedRemoteMessage(_ remoteMessage: FIRMessagingRemoteMessage) {
print(remoteMessage.appData)
}
}
// [END ios_10_data_message_handling]
appdelegate kodlarım yukarda kullanıyrum. Ancak uygulama firibase consolundan mesaj attığımda uygulama açıkta olsa kapalıda olsa normal çalışıyor. bildirim geliyor.
Php dosyasından attığımda
<?php
if(isset($_POST['submit'])){//kontrol
$token_idler = array();
$data = array('id'=> "0", 'priority' => "high",'tur'=> "bildirim",'title'=>$_POST['baslik'],'baslik'=>$_POST['baslik'],'ozet'=> $_POST['ozet'] ,'icerik'=>$_POST['icerik'],'resim'=>$_POST['resim']);
//FCM api URL
$url = 'https://fcm.googleapis.com/fcm/send';
//api_key available in Firebase Console -> Project Settings -> CLOUD MESSAGING -> Server key
$server_key = 'serverapi_key';
$fields = array();
$fields['data'] = $data;
if(is_array( "token_id")){
$fields['token_idler'] = "token_id";
}else{
$fields['to'] = "token_id";
}
//header with content_type api key
$headers = array(
'Content-Type:application/json',
'Authorization:key='.$server_key
);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($fields));
$result = curl_exec($ch);
if ($result === FALSE) {
die('FCM Send Error: ' . curl_error($ch));
}
curl_close($ch);
echo $result;
}
?>
Php kodları yukarda. bildirim uygulama açıkken geliyor ayrıştırıyorum. fakat uygulama kapalı iken bildirim gelmiyor. bunun çözümünu araştırıyoruma am birtürlü bulamadım. böyle bi durumla karşıalşan varmı ?
yani kısıacası firibase apisini kullanıyorum. uygulama açıkken bildirim alert olarak alıyorum. ama uygulama kapalı iken hiçbir şekilde bildirm gelmiyor. uygualmayı açınca alert oalrak geliyor.
9
Görüntülenme
0 Beğeni