今天要分享的是通知中心擴展中的-Today擴展(ios8推出),ios目前可以使用的擴展有:today擴展(widget-即通知欄的今天一欄)、鍵盤自定義、文件管理晤愧、照片編輯擴展、通知擴展(推送)蛉腌、分享擴展等官份。擴展與擁有這個擴展主應用的生命周期是獨立的。他們是兩個獨立的進程烙丛。
一舅巷、目標:
我項目是希望在widget中添加一個H5的頁面方便以后的自定義。點擊對應按鈕去到相應界面河咽,我也不知道這樣算不算濫用widget钠右,因為之前看見過有人的應用被蘋果拒絕就是因為濫用widget導致的。
二忘蟹、實現(xiàn):
1.因為widget是一個單獨的進程所以需要創(chuàng)建一個target:
2.代碼
- (void)viewDidLoad {
[super viewDidLoad];
// 調(diào)整Widget的高度
self.preferredContentSize = CGSizeMake(0, 200);
// 1飒房、創(chuàng)建UIWebView:
UIWebView *mWebView = [[UIWebView alloc]initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, 200)];
// 2、設(shè)置屬性:
mWebView.scalesPageToFit = YES;// 自動對頁面進行縮放以適應屏幕
// 檢測所有數(shù)據(jù)類型 設(shè)定電話號碼媚值、網(wǎng)址狠毯、電子郵件和日期等文字變?yōu)殒溄游淖? [mWebView setDataDetectorTypes:UIDataDetectorTypeAll];
mWebView.delegate = self;
// 打開URL
NSURLRequest *request =[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.baidu.com"]];
[mWebView loadRequest:request];
[self.view addSubview:mWebView];
[self makeButtonWithTitle:@"返回" frame:CGRectMake(0, 0, 80, 64) button:_backBtn];
[self makeButtonWithTitle:@"前進" frame:CGRectMake(self.view.frame.size.width - 80, 0, 80, 64) button:_forWardBtn];
[self makeButtonWithTitle:@"刷新" frame:CGRectMake(100, 0, 80, 64) button:_refreshBtn];
}
// 取消widget默認的inset,讓應用靠左
- (UIEdgeInsets)widgetMarginInsetsForProposedMarginInsets:(UIEdgeInsets)defaultMarginInsets {
return UIEdgeInsetsZero;
}
- (void)makeButtonWithTitle:(NSString *)title frame:(CGRect)frame button:(UIButton *)btn {
btn = [UIButton buttonWithType:UIButtonTypeCustom];
[btn setTitle:title forState:UIControlStateNormal];
[btn setTitleColor:[UIColor redColor] forState:UIControlStateNormal];
[btn addTarget:self action:@selector(skip:) forControlEvents:UIControlEventTouchUpInside];
[btn setFrame:frame];
if ([title isEqualToString:@"返回"]) {
btn.tag = 101;
} else if([title isEqualToString:@"前進"]) {
btn.tag = 102;
}else {
btn.tag = 103;
}
[self.view addSubview:btn];
}
- (void)skip:(UIButton *)button
{
if (button.tag == 101) {
[self.extensionContext openURL:[NSURL URLWithString:@"iOSWidgetApp://action=GotoHomePage"] completionHandler:^(BOOL success) {
NSLog(@"101 open url result:%d",success);
}];
}
else if(button.tag == 102) {
[self.extensionContext openURL:[NSURL URLWithString:@"iOSWidgetApp://action=GotoOtherPage"] completionHandler:^(BOOL success) {
NSLog(@"102 open url result:%d",success);
}];
}else {
[self.extensionContext openURL:[NSURL URLWithString:@"iOSWidgetApp://action=GotoOtherPages"] completionHandler:^(BOOL success) {
NSLog(@"102 open url result:%d",success);
}];
}
}
運行與結(jié)果展示:
擴展與主程序的交互-數(shù)據(jù)共享
這就要涉及擴展與應用之間的數(shù)據(jù)共享了-App Groups.
-
首先在主應用的target > Capabilities下 打開App Groups 點擊+ 在group.后面輸入標識符褥芒,
再去擴展的target下進行相同的操作嚼松,記得group.后的標識符要一致。
-
代碼:
在上面的擴展代碼里面已經(jīng)定義了點擊事件锰扶,這里主要是主應用接收到信息后進行判斷和處理献酗。
在這之前還需要先配置URL schems,在主程序的plist里面:
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {
NSString* prefix = @"iOSWidgetApp://action=";
UIWebView *webView = [[UIWebView alloc]initWithFrame:[UIScreen mainScreen].bounds];
webView.backgroundColor = [UIColor clearColor];
webView.delegate = self;
[webView setUserInteractionEnabled:YES];//是否支持交互
[webView setOpaque:NO];//opaque是不透明的意思
[webView setScalesPageToFit:YES];//自動縮放以適應屏幕
webView .scrollView.bounces = NO;// 禁止UIWebView下拉拖動效果
NSString *path;
if ([[url absoluteString] rangeOfString:prefix].location != NSNotFound) {
NSString* action = [[url absoluteString] substringFromIndex:prefix.length];
if ([action isEqualToString:@"GotoHomePage"]) {
path = [[NSBundle mainBundle] pathForResource:@"help" ofType:@"html"];
}
else if([action isEqualToString:@"GotoOtherPage"]) {
path = [[NSBundle mainBundle] pathForResource:@"setting" ofType:@"html"];
}else {
path = [[NSBundle mainBundle] pathForResource:@"healthyArticle" ofType:@"html"];
}
NSURL *urll = [NSURL fileURLWithPath:path];
NSURLRequest* request = [NSURLRequest requestWithURL:urll] ;
[webView loadRequest:request];
[self.rootView.view addSubview:webView];
self.rootView.view.backgroundColor = [UIColor whiteColor];
}
return YES;
}
因為我是需要到對應的H5頁面所以是添加的H5頁面。
注意:
1.當程序內(nèi)存不足時坷牛,蘋果優(yōu)先會殺死擴展罕偎,因此需要注意內(nèi)存的管理。
2.在配置team是賬號需要一致(我測試的時候免費賬號好像還不行漓帅,需要付費的賬號)
3.在iOS10上面還可以從左滑主頁面和鎖屏進入widget锨亏。
4.today只有在下拉的時候才會更新,通知欄兩邊的更新機制是不一樣的忙干。
5.一般更新路徑:viewDidLoad->viewWillAppear,但是如果你下拉過于頻繁就只會執(zhí)行viewWillAppear里面的浪藻,因此更新代碼最好放在viewWillAppear里面捐迫。