需求ios developer文件(自行获取解决)
aps_development.cer 推送证书
aps_development.p12 钥匙串导出的p12文件
ios_development.cer 开发者证书
CSRequest.certSigningRequest 从请求机构请求的request文件---(本文不需要)
PushTest.mobileprovision 推送描述文件---(本文不需要)
AuthKey.p8 推送p8文件---firebase推送需要(本文自定义推送)
一、前端实现在
下载查看QMNetNotification.h QMNetNotification.m
AppController.m中修改
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
...
[[QMNetNotification sharedInstance] application:application didFinishLaunchingWithOptions:launchOptions];
...
}
//远端推送需要获取设备的Device Token
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
[[QMNetNotification sharedInstance] didRegisterForRemoteNotificationsWithDeviceToken:deviceToken];
}
- (void)applicationDidBecomeActive:(UIApplication *)application {
...
[[QMNetNotification sharedInstance] applicationDidBecomeActive];
...
}
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {
[[QMNetNotification sharedInstance] didReceiveRemoteNotification:userInfo];
}
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
completionHandler(UIBackgroundFetchResultNewData);
[[QMNetNotification sharedInstance] didReceiveRemoteNotification:userInfo];
}
二、后端实现
1、cert.pem文件生成
openssl x509 -in aps_development.cer -inform DER -outform PEM -out cert.pem
2、key.pem文件生成
openssl pkcs12 -in aps_development.p12 -out key.pem -nodes
3、验证
openssl s_client -connect gateway.sandbox.push.apple.com:2195 -cert cert.pem -key key.pem
4、nodejs实现
需要安装apn: node install apn
const apn = require("apn");
var deviceToken = "d95f950dcc65735f1bb54adxxxxbf0775983xxxx49604ed308af0b6c3c66xxxx";(硬件ID前端可以获取)
或者
var deviceToken = ["d95f950dcc65735f1bb54adxxxxbf0775983xxxx49604ed308af0b6c3c66xxxx"];
var options = {
cert: "cert.pem",
key: "key.pem",
production: false
};
var apnProvider = new apn.Provider(options);
var note = new apn.Notification();
// note.expiry = Math.floor(Date.now() / 1000) + 3600; // Expires 1 hour from now.
note.badge = 1;
note.sound = "";
note.alert = "测试通知消息";
note.payload = {'messageFrom': '你擦我擦'};
note.topic = "com.xxxx.xxxx";
apnProvider.send(note, deviceToken).then( function (result) {
console.log("sent: --------", result.sent);
console.log("failed: ---22-",result.failed.length);
console.log("failed: ---11-", result.failed);
});
apnProvider.shutdown();
三、其他知识点
1、本地推送UILocalNotification的applicationIconBadgeNumber属性只会影响角标的显示,不会影响通知栏的通知处理。
1)当applicationIconBadgeNumber>0时,角标会随applicationIconBadgeNumber而变化。
2)当applicationIconBadgeNumber=0时,角标维持推送前状态不变。
3)当applicationIconBadgeNumber<0时,角标置0不显示。
2、远程推送的badge字段,只会影响角标的显示,不会影响通知栏的通知处理。
1)当badge>0时,角标会随badge而变化。
2)当badge=0时,角标维持不变。
3)当badge<0时,角标维持不变。
3、UIApplication的applicationIconBadgeNumber属性既会影响角标的显示,又会影响通知栏通知的处理。
1)当applicationIconBadgeNumber>0时,角标会随之变化,通知栏通知不变。
2)当applicationIconBadgeNumber=0时,角标变为0不显示,通知栏通知清空。
3)当applicationIconBadgeNumber<0时,角标变为0不显示,通知栏通知清空。