iOS實現先無動畫pop再push,替換當前控制器
定制網站建設可以根據自己的需求進行定制,網站設計、做網站構思過程中功能建設理應排到主要部位公司網站設計、做網站的運用實際效果公司網站制作網站建立與制做的實際意義
1.先pop 發送通知或代理在前一個頁面執行push操作
iOS開發中會遇到添加成功,發送成功……類似情況,需要先將push前的頁面移除調。如果直接調用pop,立刻去push。如果這兩個命令寫在同一個控制器中,則會發現push根本沒有被執行……因為pop已經將該控制器移除,push根本沒有機會執行。也可以在上一個控制器通過代理/通知/閉包等操作。
這種方法有弊端,有可能會push多次不等。頁面交互非常不好。
2.改變控制器在棧中的位置
所以就選擇了下面的方法,先移除路由棧中當前控制器,再新增新的控制器,最后賦值。
IOS開發中PUSH通過開發者push證書實現的,要實現通知推送只能使用push,無其他代替方法。
PUSH原理及實現方法:
原理圖:
注:
Provider?:應用自己的服務器;
APNS?:Apple Push Notification Service的簡稱,蘋果的PUSH服務器;
實現方法:
一、生成push證書。
1、用付費帳號登錄到IOS開發者中心。
2、生成開發證書,生成開發證書過程中需要通過Keychain生成一個CSR文件,默認名為CertificateSigningRequest.certSigningRequest,這個文件將在生成push證書的時候用到。
二、創建一個App ID。
注:要用push功能的Bundle Identifier一定不能出現通配符,比如com.mycompany.*?,這樣的名字是不能使用push的。
創建過程中Description可以任意填寫,比如叫?push_demo?;
Bundle Identifier一般用?com.company.appname?這樣的格式,例如com.mycompany.demo?;
三、生成Push SSL Certificate。
1、打開?Enable for Apple Push Notification service?選項,該選項下有?Development Push SSL Certificate?和?Production Push SSL Certificate?兩個SSL Certificate可以配置,前面一個是用來的開發的push證書,后面一個是用來發布的。我們以開發push證書為例,點擊?Development Push SSL Certificate?-?Configure?,后面會要求選擇CSR文件,這就是生成開發證書時的CertificateSigningRequest.certSigningRequest文件,選擇好CSR后就生成好相應的SSL Certificate了。下載下來,保存名為?aps_developer.cer?。
2、從Keychain中導出私鑰、設置好密碼,命名為private_key.p12。
3、生成push證書。
將aps_developer.cer轉成pem格式
openssl x509 -in aps_developer.cer -inform DER -out aps_developer.pem -outform PEM
將private_key.p12格式的私鑰轉換成private_key.pem
openssl pkcs12 -nocerts -out private_key.pem -in private_key.p12
4、這一步會要求輸入p12私鑰的密碼,以及設置新生成的pem的密碼。
5、創建用于服務端的SSL p12格式證書,命名為aps_developer.p12
openssl pkcs12 -export -in aps_developer.pem -inkey private_key.pem -certfile CertificateSigningRequest.certSigningRequest -name "aps_developer" -out aps_developer.p12
6、這一步會要求輸入private_key.pem的密碼,注意不是private_key.p12的密碼。如果密碼錯誤,或者CertificateSigningRequest.certSigningRequest文件不匹配都不能正常生成aps_developer.p12文件,如果生成的aps_developer.p12文件大小是0,說明生成過程中出了問題,請檢查pem私鑰、密碼、以及CertificateSigningRequest.certSigningRequest是否正確。
aps_developer.p12就是Provider向APNS發送push消息需要的SSL證書。把這個證書和密碼提供給服務端,服務端就可以發送push消息給APNS了。這時服務端已經可以工作了,但客戶端還必須配置相應的Provisioning Profile才能啟動應用的push功能。
服務器配置需注意的是,由于我們生成的是開發環境的push證書,所以服務器應該連接APNS的sandbox環境地址:gateway.sandbox.push.apple.com:2195?,如果應用正式發布,就要連接正式環境,必須生成相應的發布證書,并連接APNS正式環境地址:gateway.push.apple.com:2195?。
CertificateSigningRequest.certSigningRequest
private_key.p12
aps_developer.cer
四、生成Provisioning Profile
1、新建Profile,命名為push_dev;
2、選擇相應證書;
3、App ID選擇push_demo;
4、選擇設備;
5、下載并安裝該Profile供開發使用;
6、Xcode證書設置、Info.plist設置
用Xcode打開客戶端工程,設置Info.plist的Bundle identifier為com.mycompany.demo?。
打開工程設置,必須將證書設置為與push_dev關聯的證書。
7、客戶端獲取deviceToken
服務端要發送push消息給某一設備還必須知道該設備的deviceToken。應用運行后獲取到deviceToken,然后上傳給服務器,下面介紹應用如何獲取deviceToken。應用必須先注冊使用push功能。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
?[[UIApplication sharedApplication] registerForRemoteNotificationTypes:(UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeBadge)];
?// do something
?// ...
}
在AppDelegate中添加下面方法來獲取deviceToken:
- (void)application:(UIApplication *)app didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
?NSString *token = [NSString stringWithFormat:@"%@", deviceToken];
?NSLog(@"%@", token);
}
- (void)application:(UIApplication *)app didFailToRegisterForRemoteNotificationsWithError:(NSError *)error {
?NSLog(@"%@", error);
}
應用獲取到deviceToken后,上傳給Provider,Provider就可以用這個deviceToken給這個設備push消息了。
在點擊push下一個頁面時,因為各種原因,點一下cell或按鈕沒有響應,用戶可能就多點幾下,這時候會打開好幾個一樣的頁面。
這是因為push后的頁面有耗時操作或者剛好push到另一個頁面時,另一個頁面正好在reloadData卡住主線程。造成點擊cell時卡住了。
這時,我們可以通過重寫導航控制器的方法來解決這個問題。
#import UIKit/UIKit.h
@interfaceNaviViewController?:?UINavigationController
@end
#import "NaviViewController.h"
@interfaceNaviViewController?()
//?記錄push標志
@property(nonatomic,getter=isPushing)BOOLpushing;
@end
@implementationNaviViewController
-?(void)viewDidLoad?{
? ? ? [superviewDidLoad];
? ? ? ?self.delegate=self;
}
-?(void)pushViewController:(UIViewController*)viewControlleranimated:(BOOL)animated?{
? ? if(self.pushing==YES)?{
? ? ? ? ? ? ?NSLog(@"被攔截");
? ? ? ? ? ? ?return;
? ? }else{
? ? ? ? ? ? ?NSLog(@"push");
? ? ? ? ? ? ?self.pushing=YES;
? ? }
[superpushViewController:viewControlleranimated:animated];
}
#pragma?mark?-?UINavigationControllerDelegate
-(void)navigationController:(UINavigationController*)navigationControllerdidShowViewController:(UIViewController*)viewControlleranimated:(BOOL)animated?{
? ? ? ? ?self.pushing=NO;
}
@end
在iOS開發中,頁面跳轉一般有兩種方式:
在SDK開發中,由于需要減小侵入性,通常會使用modal方式彈出SDK的頁面,那么默認喚起的動畫就是從下到上。現在有一個需求,需要從右到左喚起SDK的頁面,所以我們需要用到轉場動畫,將present的動畫改成從右到左,也就是以Push方式實現Present跳轉。
實現模態的轉場動畫的步驟,大概分以下幾步:
下面按照這個步驟來實現功能
創建一個類 WBHCPushAnimatedTransition 來封裝轉場動畫
實現系統的 UIViewControllerAnimatedTransitioning 協議
實現present動畫,實際就是使用UIView動畫來改變 fromVC 和 toVC 的 view 的位置
實現dismiss動畫,和上面的present動畫相反,將fromVC 和 toVC 的 view 的位置還原
這樣,整個轉場動畫的封裝就完成了,下面來實現代理
在要present出來的vc中實現系統代理 UIViewControllerTransitioningDelegate
這樣的話,整個功能就基本實現了
但是,體驗上還缺少一點:沒有側滑返回。所以,接下來,我們實現側滑返回的交互轉場
創建一個繼承自 UIPercentDrivenInteractiveTransition 的類 WBHCPopInteractiveTransition 來封裝交互轉場
為傳入的vc添加拖動手勢
拖動手勢是加在全屏上的,我們需要將它限制到屏幕左側,這樣才是側滑返回,否則是全屏返回
核心是處理手勢交互轉場的過程,我們需要更新轉場百分比 updateInteractiveTransition ,標記 完成轉場 finishInteractiveTransition 和取消轉場 cancelInteractiveTransition
這樣,整個交互轉場的封裝就完成了,下面來實現代理
在要dismiss消失的vc中實現系統代理 UIViewControllerTransitioningDelegate
這樣的話,整個側滑返回的功能就實現了
至此,我們基本上就實現了以Push方式實現Present跳轉,同時可以像原生導航一樣進行側滑返回
由于我現在開發的應用比較依賴消息推送。但在生產環境中(production)來測試消息推送比較麻煩.大部分人認為只能在app發布之后,才能驗證生產環境下的消息推送。其實是不對的這篇文章,是解決如何在不提交app應用的情況下,使用ad-hoc模式來驗證消息推送(push notifications).
1.png
把codeSign 設置我就忽略了接著,進入XCode-Product-Scheme-Edit Scheme。修改Build Configuration為Release
2.png
然后進行打包 savefor adhoc ipa然后。通過itunes裝到有權限的設備上就可以驗證生產證書的推送。
本文標題:iospush開發,高級ios開發
本文鏈接:http://www.yijiale78.com/article42/dsgodec.html
成都網站建設公司_創新互聯,為您提供軟件開發、用戶體驗、企業建站、搜索引擎優化、面包屑導航、做網站
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯