iOS實用技巧 - 私有推送實現方法

轉載於: http://my.oschina.net/non6/blog/308827

可以參考:http://blog.csdn.net/zhangkongzhongyun/article/details/38678137

 在開發企業app的時候,有的時候基於安全性的考慮,不允許設備連接外網。這就出現了一個問題,就是iOS的推送功能沒法工作了,因爲iOS的推送功能是固化在系統裏,必須連接蘋果的APNS服務器才能工作的,爲了能讓這類只能工作在內網裏的app也能擁有推送功能,就需要我們自己來實現推送功能了。

  自主推送的實現方法是利用iOS的voip類app可以駐留在後臺的功能。這類app,系統在設備開機時即被啓動,app可以將自己的一個socket委託給系統,在socket有數據到達時,系統就會喚醒app,給它一段很短的cpu時間來處理數據,再加上UIApplication的keepAliveTimeout handler(最小10分鐘間隔一次),可以每隔一段時間就重新建立一次連接,來達到保持socket長連接的需求。

注:由於voip類app可以使app常駐在後臺並維持socket長連接,因此蘋果對這類應用有及其嚴格的審查,所有不是真正的voip的app都會被拒絕!切記!

1.設置應用爲voip應用

打開<app>-info.plist文件,加入如下的key

Required background modes,追加App provides Voice over IP services


2.將socket設置成異步模式,並將socket設置成VOIP類的,以便系統能夠託管它。

1
2
3
4
5
CFStreamCreatePairWithSocket(NULL, (CFSocketNativeHandle)(mosq->sock), &readStream, NULL);//保證不關閉原來的socket CFReadStreamSetProperty(readStream, kCFStreamPropertyShouldCloseNativeSocket, kCFBooleanFalse);//設置成voip socket CFReadStreamSetProperty(readStream, kCFStreamNetworkServiceType, kCFStreamNetworkServiceTypeVoIP);


3.安裝keepAliveTimeout handler,讓系統每隔一段時間重新建立連接

1
2
3
4
    UIApplication *application = [UIApplication sharedApplication];
    [application setKeepAliveTimeout:600 handler:^{
        [self reconnect];
    }];

我參考了jmsnil的MQTTExample工程,這是一個使用mqtt的例子,我把它做了一些修改,以便能在後臺運行接收推送。

原工程地址:

https://github.com/jmesnil/MQTTExample

我修改的示例工程地址:

https://github.com/Guou/Demo-mqtt-push

打開終端,輸入下面的命令即可獲得通知

1
curl -X PUT --data-binary "1"  http://eclipse.ttbridge.com/%2FMQTTExample%2Ftestcnpush


該例子只可以工作在真機上,如果您是iOS7以下,請把application:didFinishLaunchingWithOptions:中本地通知權限請求的代碼刪掉。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章