iOS NSNotification的使用

如果在一个类中想要执行另一个类中的方法可以使用通知
1.创建一个通知对象: 使用notificationWithName:object: 或者 notificationWithName:object:userInfo:

NSNotification* notification = [NSNotification notificationWithName:kImageNotificationLoadFailed(connection.imageURL)
object:self
userInfo:[NSDictionary dictionaryWithObjectsAndKeys:error,@”error”,connection.imageURL,@”imageURL”,nil]];

这里需要注意的是,创建自己的通知并不是必须的。而是在创建自己的通知之前,采用NSNotificationCenter类的方法 postNotificationName:object: 和 postNotificationName:object:userInfo:更加便利的发出通知。这种情况,一般使用NSNotificationCenter的类方法defaultCenter就获得默认的通知对象,这样你就可以给该程序的默认通知中心发送通知了。注意:每一个程序都有一个自己的通知中心,即NSNotificationCenter对象。该对象采用单例设计模式,采用defaultCenter方法就可以获得唯一的NSNotificationCenter对象。

注意:NSNotification对象是不可变的,因为一旦创建,对象是不能更改的。

2.注册通知:addObserver:selector:name:object:

可以看到除了添加观察者之外,还有其接收到通知之后的执行方法入口,即selector的实参。因此为了进行防御式编程,*好先检查观察者是否定义了该方法。例如:添加观察者代码有

[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(aWindowBecameMain:)
name:NSWindowDidBecomeMainNotification object:nil];

这里保证了self定义了aWindowBecameMain:方法。而对于一个任意的观察者observer,不能保证其对应的selector有aWindowBecameMain:,可采用[observer respondsToSelector:@selector(aWindowBecameMain:)]] 进行检查。所以完整的添加观察者过程为:

if([observer respondsToSelector:@selector(aWindowBecameMain:)]) {
[[NSNotificationCenter defaultCenter] addObserver:observer selector:@selector(aWindowBecameMain:) name:NSWindowDidBecomeMainNotification object:nil];
}

注意到addObserver:selector:name:object:不仅指定一个观察者,指定通知中心发送给观察者的消息,还有接收通知的名字,以及指定的对象。一般来说不需要指定name和object,但如果仅仅指定了一个object,观察者将收到该对象的所有通知。例如将上面的代码中name改为nil,那么观察者将接收到object对象的所有消息,但是确定不了接收这些消息的顺序。如果指指定一个通知名称,观察者将收到它每次发出的通知。例如,上面的代码中object为nil,那么客户对象(self)将收到任何对象发出NSWindowDidBecomeMainNotification通知。如果既没有指定指定object,也没有指定name,那么该观察者将收到所有对象的所有消息。

3.发送通知:postNotificationName:object:或者performSelectorOnMainThread:withObject:waitUntilDone:

例如程序可以实现将一个文本可以进行一系列的转换,例如对于一个实例、RTF格式转换成ASCII格式。而转换在一个类(如Converter类)的对象中得到处理,在诚寻执行过程中可以加入或者删除这种转换。而且当添加或者删除Converter操作时,你的程序可能需要通知其他的对象,但是这些Converter对象并不需要知道被通知对象是什么,能干什么。你只需要声明两个通知,”ConverterAdded” 和 “ConverterRemoved”,并且在某一事件发生时就发出这两个通知。

当一个用户安装或者删除一个Converter,它将发送下面的消息给通知中心:

[[NSNotificationCenter defaultCenter]
postNotificationName:@”ConverterAdded” object:self];

或者是

[[NSNotificationCenter defaultCenter]
postNotificationName:@”ConverterRemoved” object:self];

通知中心将会区分它们对象对这些通知感兴趣并且通知他们。如果除了关心观察者的通知名称和观察的对象,还关心其他之外的对象,那么就把之外的对象放在通知的可选字典中,或者用方法postNotificationName:object:userInfo:。

而采用performSelectorOnMainThread:withObject:waitUntilDone:则是直接调用NSNotification的方法postNotification,而postNotificationName和object参数可以放到withObject的实参中。例如:

[[NSNotificationCenter defaultCenter] performSelectorOnMainThread:@selector(postNotification:) withObject:notification waitUntilDone:YES];//注意这里的notification为自定义的一个通知对象,可定义为NSNotification* notification = [NSNotification notificationWithName:@”ConverterAdded”object:self];//那么它的作用与上面的一致

4.移除通知:removeObserver:和removeObserver:name:object:

其中,removeObserver:是删除通知中心保存的调度表一个观察者的所有入口,而removeObserver:name:object:是删除匹配了通知中心保存的调度表中观察者的一个入口。

这个比较简单,直接调用该方法就行。例如:

[[NSNotificationCenter defaultCenter] removeObserver:observer name:nil object:self];

注意参数notificationObserver为要删除的观察者,一定不能置为nil。

PS:这里简单说一下通知中心保存的调度表。通知中心的调度表是给一些观察者指定的一些通知集。一个通知集是通知中心发出的通知的子集。每个表的入口包含:

通知观察者(必须要的)、通知名称、通知的发送者。

下图表示通知集中指定的通知的调用表入口的四种类型:
%title插图%num

下图表示四种观察者的调度表

%title插图%num

*后,提醒一下观察者收到通知的顺序是没有定义的。同时通知发出和观察的对象有可能是一样的。通知中心同步转发通知给观察者,就是说 postNotification: 方法直到接收并处理完通知才返回值。要想异步的发送通知,可以使用NSNotificationQueue。在多线程编程中,通知一般是在一个发出通知的那个线程中转发,但也可能是不在同一个线程中转发通知。

通知 是在跳转控制器之间常用的传值代理方式,除了代理模式,通知更方便、便捷,一个简单的Demo实现通知的跳转传值.

iOS通知传值的使用
输入所要发送的信息 ,同时将label的值通过button方法调用传递,

– (IBAction)buttonClick:(id)sender {

   //添加 字典,将label的值通过key值设置传递

   NSDictionary *dict =[[NSDictionary alloc]initWithObjectsAndKeys:self.textFieldOne.text,@”textOne”,self.textFieldTwo.text,@”textTwo”,nil];

   //创建通知

   NSNotification *notification =[NSNotification notificationWithName:@”tongzhi” object:niluserInfo:dict];

   //通过通知中心发送通知

   [[NSNotificationCenter defaultCenter] postNotification:notification];

   [self.navigationController popViewControllerAnimated:YES];

}

在发送通知后,在所要接收的控制器中注册通知监听者,将通知发送的信息接收

– (void)viewDidLoad {

   [super viewDidLoad];

   //注册通知

   [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(tongzhi:)name:@”tongzhi” object:nil];

}

– (void)tongzhi:(NSNotification *)text{

   NSLog(@”%@”,text.userInfo[@”textOne”]);

       NSLog(@”-----接收到通知——“);

}

移除通知:removeObserver:和removeObserver:name:object:

其中,removeObserver:是删除通知中心保存的调度表一个观察者的所有入口,而removeObserver:name:object:是删除匹配了通知中心保存的调度表中观察者的一个入口。

这个比较简单,直接调用该方法就行。例如:

[[NSNotificationCenter defaultCenter] removeObserver:observer name:nil object:self];

注意参数notificationObserver为要删除的观察者,一定不能置为nil。

方格填数

方格填数

标题:方格填数

在2行5列的格子中填入1到10的数字。
要求:
相邻的格子中的数,右边的大于左边的,下边的大于上边的。

如【图1.png】所示的2种,就是合格的填法。

请你计算一共有多少种可能的方案。

请提交该整数,不要填写任何多余的内容(例如:说明性文字)。

%title插图%num

思路
将其看做一维数组,每个位置代表一个数字

def ad(a, b, k):
if len(a) == 0:
if b[0]<b[1]<b[2]<b[3]<b[4] and b[5]<b[6]<b[7]<b[8]<b[9] and b[0]<b[5] and b[1]<b[6] and b[2]<b[7] and b[3]<b[8] and b[4]<b[9]:
k += 1
return k
for i in range(len(a)):
b.append(a[i])
d = a.pop(i)
k = ad(a, b, k)
a.insert(i, d)
b.pop(-1)
return k

a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
b = []
k = ad(a, b, 0)
print(k)

IOS 启动画面和图标设置(适配IOS7 and Xcode5)

关于IOS程序设置启动画面以及图标的设备目前主要为:IPhone设备 和IPad设备

IPhone启动画面以及图标的设置

目前IPhone的分辨率为:320X480、640X960、640X1136。

Default.png                    320X480 iPhone 320X480分辨率屏幕默认启动图片。

[email protected]             640X960 iPhone 640X960分辨率屏幕默认启动图片。

[email protected]    640X1136  iPhone 640X1136分辨率屏幕默认启动图片。

————————————————————————————–

Icon.png                      57X57       10px   用户AppStore以及iPhone/iPod 中显示 必需

[email protected]              114X114   20px  高清模式

Icon_120.png             120X120   20px  用于iPhone5的高清显示

Icon-Small.png           29X29       20px  用于设置以及Spotlight搜索

[email protected]   58X58      8px     用于Icon-Small.png的高清模式

Icon_80.png  80X80      8px   用于iPhone5在Spotlight搜索

—————————————————————————————

IPad启动画面以及图标设置

Default-Portrait.png                            768X1024        iPad专用竖向启动画面

Default-Landscape.png                      768X1024        iPad专用横向启动画面

Default-PortraitUpsideDown.png        768X1024        iPad专用竖向启动画面(Home按钮在屏幕上面)

Default-LandscapeLeft.png                768X1024        iPad专用竖向启动画面(Home按钮在屏幕左面)

Default-LandscapeRight.png              768X1024        iPad专用竖向启动画面(Home按钮在屏幕右面)

——————————————————————————————–

Icon-72.png         72X72       20px       用于在iPad桌面中显示必需

Icon-50.png         50X50       20px      用于iPad中的Spotlight搜索

Icon-29.png         29X29       10px      设置页面

 

ptorch索引、切片、连接和换位

ptorch索引、切片、连接和换位

目录:
1.torch.cat 使用dim对Tensor进行指定拼接
2.如何将一个Tensor按指定维度切片?
3.按照索引对元素进行聚合
4,如何按照索引选择目标数据?
5、如何选出满足矩阵条件的元素?
6.如何找出矩阵中的非零元素的索引?
7.如何将输入张量分割成相同形状的的chunks?
8.如何增加一个矩阵的维度(如1维变2维)?
9.如何实现Tensor维度之间的转置?
10.如何沿着某个维度切片后返回所有切片组成的列表?
1.torch.cat 使用dim对Tensor进行指定拼接
Tensor = torch.ones(2,3)
print(torch.cat([Tensor,Tensor]))
print(torch.cat([Tensor,Tensor],dim=0)) # 纵向拼接为一个矩阵
print(torch.cat([Tensor,Tensor],dim=1).shape) # 横向拼接为一个矩阵
# torch.stack 方法进行拼接
print(torch.stack([Tensor,Tensor],dim=1).shape) # 拼接为两个矩阵

2.如何将一个Tensor按指定维度切片?
x = torch.ones(2,10)
print(torch.chunk(x,5,dim=1)) # 横向切片,切为5个

3.按照索引对元素进行聚合
x = torch.Tensor([[33,66,9],[1,99,88]])
print(x)
result = torch.gather(x,1,torch.LongTensor([[0,1],[1,2]])) # 按索引取 维度1 *行的 1 2两个数 第二行的2 3 两个数
print(result)
print(result.shape)

4,如何按照索引选择目标数据?
x = torch.randn(2,7)
print(x)
# 参数1:原Tensor 参数2:维度 参数3:该维度上的索引
y = torch.index_select(x,1,torch.LongTensor([1,3,5]))
print(y)
z = torch.index_select(x,0,torch.LongTensor([1]))
print(z)

5、如何选出满足矩阵条件的元素?
x = torch.randn(2,4)
print(x)
mask = x.ge(0.5) # 大于0.5为1 小于0.5 为0
print(mask)
print(torch.masked_select(x,mask))

6.如何找出矩阵中的非零元素的索引?
x = torch.Tensor([[0.0,1.1],[6.6,0.0]])
print(x)
print(torch.nonzero(x))
———————————————————————-
result:
tensor([[0.0000, 1.1000],
[6.6000, 0.0000]])
tensor([[0, 1],
[1, 0]])

7.如何将输入张量分割成相同形状的的chunks?
x = torch.ones(2,5)
print(x)
print(torch.split(x,2,dim=1))
print(torch.split(x,1,dim=0))
print(torch.split(x,[2,3],dim=1))
———————————————————————
result:
tensor([[1., 1., 1., 1., 1.],
[1., 1., 1., 1., 1.]])
(tensor([[1., 1.],
[1., 1.]]), tensor([[1., 1.],
[1., 1.]]), tensor([[1.],
[1.]]))
(tensor([[1., 1., 1., 1., 1.]]), tensor([[1., 1., 1., 1., 1.]]))
(tensor([[1., 1.],
[1., 1.]]), tensor([[1., 1., 1.],
[1., 1., 1.]]))

8.如何增加一个矩阵的维度(如1维变2维)?
x = torch.Tensor([1,2,3,4,5])
print(x.shape)
y = x.unsqueeze(dim=0) # 降维用squeeze()删除dim指定维度
print(y)
print(y.shape)
z = x.unsqueeze(dim=1)
print(z.shape)
———————————————————————–
result:
torch.Size([5])
tensor([[1., 2., 3., 4., 5.]])
torch.Size([1, 5])
torch.Size([5, 1])

9.如何实现Tensor维度之间的转置?
x = torch.randn(2,1)
print(x,x.shape)
y = torch.t(x)
print(y,y.shape)
z = torch.transpose(x,1,0)
print(z,z.shape)
print(x.t())
print(x.transpose(1,0))
———————————————————————–
result:
tensor([[0.6000],
[0.2830]]) torch.Size([2, 1])
tensor([[0.6000, 0.2830]]) torch.Size([1, 2])
tensor([[0.6000, 0.2830]]) torch.Size([1, 2])
tensor([[0.6000, 0.2830]])
tensor([[0.6000, 0.2830]])

10.如何沿着某个维度切片后返回所有切片组成的列表?
x = torch.rand(2,2,2)
print(x)
print(torch.unbind(x,dim=1))
———————————————————————–
result:
tensor([[[0.0420, 0.9931],
[0.5015, 0.7112]],

[[0.2467, 0.9473],
[0.7529, 0.8323]]])
(tensor([[0.0420, 0.9931],
[0.2467, 0.9473]]), tensor([[0.5015, 0.7112],
[0.7529, 0.8323]]))

iOS开发phonegap之消息推送

一、安装插件:

1、phonegaplocal plugin add https://github.com/phonegap-build/PushPlugin.git

2、phonegap plugin add cordova-plugin-device

3、phonegap plugin add cordova-plugin-media

二、在js文件中调用

var pushNotification;

var app = {
// Application Constructor

initialize: function() {
this.bindEvents();

},

// Bind Event Listeners

//

// Bind any events that are required on startup. Common events are:

// ‘load’, ‘deviceready’, ‘offline’, and ‘online’.

bindEvents: function() {
document.addEventListener(‘deviceready’, this.onDeviceReady, false);

 

},

// deviceready Event Handler

//

// The scope of ‘this’ is the event. In order to call the ‘receivedEvent’

// function, we must explicitly call ‘app.receivedEvent(…);’

 

onDeviceReady: function() {
app.receivedEvent(‘deviceready’);

app.registerN();

 

},

// Update DOM on a Received Event

receivedEvent: function(id) {

var parentElement = document.getElementById(id);

var listeningElement = parentElement.querySelector(‘.listening’);

var receivedElement = parentElement.querySelector(‘.received’);

listeningElement.setAttribute(‘style’, ‘display:none;’);

receivedElement.setAttribute(‘style’, ‘display:block;’);

console.log(‘Received Event: ‘ + id);

},

registerN: function() {

pushNotification = window.plugins.pushNotification;

 

pushNotification.register(

this.tokenHandler,

this.errorHandler,

{
“badge”:”true”,

“sound”:”true”,

“alert”:”true”,

“ecb”:”onNotificationAPN”

});

},

onNotificationAPN: function(event) {
if ( event.alert )

{
navigator.notification.alert(event.alert);

}

 

if ( event.sound )

{
var snd = new Media(event.sound);

snd.play();

}

 

if ( event.badge )

{
pushNotification.setApplicationIconBadgeNumber(successHandler, errorHandler, event.badge);

}

},

tokenHandler: function(result) {
alert (‘success’);

alert(‘device token = ‘ + result);

},

errorHandler: function(error) {
alert(‘register erro’);

alert(‘error = ‘ + error);

}

};

iphone屏幕镜像连电视_手机如何连接电视机?

一般情况下,手机想要直接的连接到电视机上是无法实现的,但是,我们如果只是想手机上的视频投影到电视机上播放还是没有问题的。我们可以通过DLNA技术来实现这个功能。

先解释一下DLNA

2b32ed1d424805d3fc88df492f78d7b0.pngDLNA其实严格来说并不是一种技术,而是一种解决方案,全程叫“DIGITAL LIVING NETWORK ALLIANCE(数字生活网络联盟)”,是由索尼、英特尔、微软等公司发起成立的。为的就是实现PC电脑、移动设备和消费电器在无线或者有线网络中的互联互通。

不过2017年1月15日,DLNA组织已经正式解散了,不过这个技术依旧被使用着。

怎么来实现投屏呢?

首先,我们需要一个联网的路由器(*好是无线),一部智能手机(iPhone和安卓都行),一台电视机。如果电视是互联网电视,能够直接连上无线网络,那么就不需要更多设备了,如果电视没有这个功能,那么你还需要一个小小的投屏设备。

我们先假设电视是互联网电视

对于iPhone手机来说,那就很简单了,先保证手机连上了你家里的wifi,然后保证你的电视机是连上wifi的。

然后打开手机,向上滑动出功能菜单,其中就有一个叫做屏幕镜像的功能。

8e8b60c1b3aca5cad8de4bba3134c12b.png7a92b788291950ff5b9750c12e76f643.png

点击以后,就能够看到你已经联网的电视机了。这是,点击选中,OK,一切就完成了,是不是很简单。

如果是安卓手机呢?华为的手机,很多是自带了投屏功能,和iPhone一样,可以直接投屏。如果是没有自带这个功能的安卓手机,你就需要安装一个投屏APP,类似的投屏APP非常多,到应用市场里面找一个就OK了。

d5f2b5943d6ba00a96b728a88c3bd088.png

使用的话,也就是打开APP,然后选择投屏,再选择设备就OK了,也非常简单。

当然,如果你是在用爱艺奇,youku等视频APP看视频,想要投屏到电视上,一般在播放视频的时候,手机屏幕的右上角会有类似的功能按钮,就可以实现投屏了。

77604225779c7f2a05136de449bb629b.png

如果我的电视不是互联网电视,不能联网怎么办呢?

那你就需要借助外力了。一般来说,小米盒子这种互联网机顶盒都是带有投屏功能的,如果你有,可以通过投屏到这些设备上,然后在电视上播放。

如果没有机顶盒,那么就只有买一个小设备了。选择设备的时候,可以根据自己的使用目的来购买。例如:你经常看爱奇艺的视频,那么你就可以选一个电视果。

fe4a2bc491ec9730acd94914981c32d4.png

非常小的个头,还送爱奇艺会员,并且,在投屏爱奇艺的视频时,其实并不是投屏,而是通过电视果直接播放。

是不是投屏有什么区别呢?

如果是投屏,手机关闭或者断网,那么电视也就不会继续播放了,因为电视是通过连接手机来播放的。但是电视果就好像一个机顶盒,如果是播放爱奇艺的视频,其实就不需要你手机作为信号源了,电视果可以直连爱奇艺视频网站进行播放。手机关机都不会受到影响。

当然,还有什么天猫魔盒、小米盒子等等很多选择。

前期回顾:

1:都说安卓手机用一两年就卡到不行,但知道这3招,同样可以用很久

2:iPhone深深隐藏的5个秘密开关,苹果官方都求着你去开,不开血亏

3:App Store里5个热门应用,款款都是黑科技,让你的苹果好用爆表!

ios屏蔽描述文件官方下载入口_iOS屏蔽更新描述文件失效解决办法:用这个方法屏蔽iOS13更新…

相信不少苹果设备的用户都经历过这样一个场景,只是睡一觉的时间,自己手中的iPhone或者iPad自动升级到了*新iOS版本。众所周知,由于iOS系统的机制,当设备开启“自动更新”,苹果设备会在适合的网络环境下自动下载*新的系统,且在充电状态+接入WI-FI的时候,自动升级新版iOS系统。

d9e9dc4dfd68cb4e5d5799b242a715de.png

对部分用户来说,他们希望能够停留在较低版本,而iPhone的升级提醒,却让人感到心烦,一旦误操作,就无法退回到已关闭验证的较早版本。在过去,我们都是利用苹果tvOS的描述文件来屏蔽iOS升级,在iOS设备上安装tvOS描述文件就可以让系统误以为检查的是tvOS的OTA更新,因此在iOS系统上就收不到更新。随着屏蔽系统更新的tvOS 12描述文件在今年1月底失效后,至今没有可用的屏蔽升级描述文件。为了避免系统意外升级,我们可以先通过其它的“曲线救国”方式来屏蔽升级。

  • 方法:关闭“设置“的网络权限

原理:因为系统升级需要联网下载新固件,关闭“设置”的网络权限,无法接入网络,所以也就不会自动下载*新固件,避免了意外升级。

使用方法:

1. 先打开“设置-iPhone存储空间”检查新固件是否已经被下载,如果系统固件已经下载,先将其删除;

2. 前往“设置-无线局域网-使用WLAN与蜂窝移动网的应用”,在列表中找到“设置”,将其权限关闭。

3. 关闭“设置”的网络权限后,我们就不用再担心新固件自动被下载到设备上。

7dcd342491b16fa1edc7861d2b6a6185.png

优点:简单,易操作,无需安装额外的配置文件或者App。

缺点:

1. 可能影响到其它需要联网才能设置的功能。

解决办法:可在需要使用“设置”联网时,重新打开网络权限,使用完成后重复上述步骤即可。

2. “设置”图标上的提醒数字“1”不会消失。

iOS开发中怎么样使用激光推送

1.注册激光推送的账号 —-> 创建应用

2.上传推送测试和发布的p12文件  注意密码的填写

3.下载sdk并拖进工程里

4.在build setting 搜索search   把路径改一下%title插图%num

%title插图%num

然后导入必须的库

CFNetwork.framework
CoreFoundation.framework
CoreTelephony.framework
SystemConfiguration.framework
CoreGraphics.framework
Foundation.framework
UIKit.framework
Security.framework
Xcode7需要的是libz.tbd;Xcode7以下版本是libz.dylib

配置plist文件

实现如下代码

AppDelegate.m
// 远程推送
//
// Created by  on 16/3/28.
// Copyright © 2016年 sjb. All rights reserved.
//
#import “AppDelegate.h”
#import “JPUSHService.h”

#define kJpushKey @”c171bc25d7754e085b48861b”
#define kMasterSecret (7f37465534cece94ac94c277)
static NSString *appKey = @”AppKey copied from JPush Portal application”;

static NSString *channel = @”Publish channel”;
static BOOL isProduction = FALSE;

@interface AppDelegate ()

@end

@implementation AppDelegate

– (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

if ([UIDevice currentDevice].systemVersion.floatValue >= 8.0) {
UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge|UIUserNotificationTypeSound|UIUserNotificationTypeAlert categories:nil];
[[UIApplication sharedApplication] registerUserNotificationSettings:settings];
}

if ([[UIDevice currentDevice].systemVersion floatValue] >= 8.0) {
[JPUSHService registerForRemoteNotificationTypes:(UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert) categories:nil];
}else{
[JPUSHService registerForRemoteNotificationTypes:(UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert) categories:nil];
}

[JPUSHService setupWithOption:launchOptions appKey:kJpushKey
channel:channel apsForProduction:isProduction];

return YES;
}

– (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {

// Required
[JPUSHService registerDeviceToken:deviceToken];
}

– (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {

// Required,For systems with less than or equal to iOS6
[JPUSHService handleRemoteNotification:userInfo];
}

– (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {

// IOS 7 Support Required
[JPUSHService handleRemoteNotification:userInfo];
completionHandler(UIBackgroundFetchResultNewData);
}

– (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error {

//Optional
NSLog(@”did Fail To Register For Remote Notifications With Error: %@”, error);
}

phonegap+激光推送做ios的消息推送

*光推送插件地址:https://github.com/jpush/jpush-phonegap-plugin

1.cordova,git 环境

2.过程遇到的错误

将这个包再次导入

%title插图%num

%title插图%num

修改一处地方

%title插图%num

字典里appkey的修改

%title插图%num

3.

登陆并加标注
var onDeviceReady = function(){
console.log(“JPushPlugin:Device ready!”);
initiateUI();
}
var initiateUI = function(){
try{
window.plugins.jPushPlugin.init();
if(device.platform != “Android”){
window.plugins.jPushPlugin.setBadge(0);//服务器角标清0
window.plugins.jPushPlugin.setDebugModeFromIos();
window.plugins.jPushPlugin.setApplicationIconBadgeNumber(0);//角标
}else{
window.plugins.jPushPlugin.setDebugMode(true);
}
var alias=userName;
window.plugins.jPushPlugin.setAlias(alias);
}catch(exception){
console.log(exception);
}

}
document.addEventListener(“deviceready”, onDeviceReady, false);//初始化设备

4.公用函数的加载

//检索是否session过期

function checkSession(){
try{
$.post(conn+”ds=DS_EASYJOINT_MOBIL_GROUP_LIST”,{},function(data){
var nowHref=window.location.href;
if((data.indexOf(“html”)>-1) && nowHref.indexOf(“login.html”)==-1){
window.location.href=”login.html”;
}
});
}catch(e){
console.log(“checkSession:”+e);
}
}

//推送函数
//window.plugins.jPushPlugin.resumePush(callback)
//var onCallback = function(data) {
// if(data>0){
// //开启
// }else{
// //关闭
// }
//}
function pushMessage(){
var openNotification = function(event){
try{
window.plugins.jPushPlugin.setBadge(0);//服务器角标清0
window.plugins.jPushPlugin.setDebugModeFromIos();
window.plugins.jPushPlugin.setApplicationIconBadgeNumber(0);
checkSession();//过期
}
catch(exception){
console.log(“jpush.openNotification”+exception);
}
}

function onDeviceReadyPush() {
document.addEventListener(“resume”, onResume, false);
window.plugins.jPushPlugin.init();
}
// 处理resume事件
function onResume() {
try{
window.plugins.jPushPlugin.setBadge(0);//服务器角标清0
window.plugins.jPushPlugin.setDebugModeFromIos();
window.plugins.jPushPlugin.setApplicationIconBadgeNumber(0);//角标
checkSession();//过期
}
catch(exception){
console.log(exception);
}
}
document.addEventListener(“deviceready”, onDeviceReadyPush, false);
document.addEventListener(“jpush.openNotification”, openNotification, false);
}

$(function(){
pushMessage();//推送
});

 

ntp服务安装

ntp服务安装
1.查看是否存在对应服务
rpm -qa | grep ntp

2.如果不存在安装对应服务
yum install ntp ntpdate -y

3.查看ntp运行状态
systemctl status ntpd

4.修改配置文件
vim /etc/ntp.conf

注释

#拒* IPv4 的用户与IPv6的用户

#restrict default kod nomodify notrap nopeer noquery
#restrict -6 default kod nomodify notrap nopeer noquery

#放行本机来源

#restrict 127.0.0.1
#restrict -6 ::1

#默认ntp服务器

#server 0.centos.pool.ntp.org iburst

#server 1.centos.pool.ntp.org iburst

#server 2.centos.pool.ntp.org iburst

#server 3.centos.pool.ntp.org iburst

添加

#默认只能通过ntp进行校时

restrict default nomodify notrap nopeer noquery

#ntp服务器地址

server 172.16.1.1

fudge 172.16.1.1 stratum 0

5.重启服务并查看状态
systemctl restart ntpd 或 service ntpd restart

6.查看是否同步
ntpq -p

7.如果失败查看是否开启端口(ntp协议默认端口123)
firewall-cmd –permanent –add-port=123/udp

firewall-cmd –reload

8.设置开机自启
**chkconfig –list ntpd 查看是否开机自启 **

systemctl enable ntpd 或 service ntpd enable
————————————————
版权声明:本文为CSDN博主「Farmermark993」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/zalu9810/article/details/112358788

友情链接: SITEMAP | 旋风加速器官网 | 旋风软件中心 | textarea | 黑洞加速器 | jiaohess | 老王加速器 | 烧饼哥加速器 | 小蓝鸟 | tiktok加速器 | 旋风加速度器 | 旋风加速 | quickq加速器 | 飞驰加速器 | 飞鸟加速器 | 狗急加速器 | hammer加速器 | trafficace | 原子加速器 | 葫芦加速器 | 麦旋风 | 油管加速器 | anycastly | INS加速器 | INS加速器免费版 | 免费vqn加速外网 | 旋风加速器 | 快橙加速器 | 啊哈加速器 | 迷雾通 | 优途加速器 | 海外播 | 坚果加速器 | 海外vqn加速 | 蘑菇加速器 | 毛豆加速器 | 接码平台 | 接码S | 西柚加速器 | 快柠檬加速器 | 黑洞加速 | falemon | 快橙加速器 | anycast加速器 | ibaidu | moneytreeblog | 坚果加速器 | 派币加速器 | 飞鸟加速器 | 毛豆APP | PIKPAK | 安卓vqn免费 | 一元机场加速器 | 一元机场 | 老王加速器 | 黑洞加速器 | 白石山 | 小牛加速器 | 黑洞加速 | 迷雾通官网 | 迷雾通 | 迷雾通加速器 | 十大免费加速神器 | 猎豹加速器 | 蚂蚁加速器 | 坚果加速器 | 黑洞加速 | 银河加速器 | 猎豹加速器 | 海鸥加速器 | 芒果加速器 | 小牛加速器 | 极光加速器 | 黑洞加速 | movabletype中文网 | 猎豹加速器官网 | 烧饼哥加速器官网 | 旋风加速器度器 | 哔咔漫画 | PicACG | 雷霆加速