iOS开发之widget实现

前言

原文:Allence 链接:https://www.cnblogs.com/allencelee/p/widegt.html

iOS extension的出现,方便了用户查看应用的服务,比如用户可以在Today的widgets中查看应用的简略信息,然后点击进入相关的应用界面。
暂且不表网络上现有的widget文章,本篇文章主要说明本人具体实现widget的步骤,希望能够帮助到需要实现widget的同行朋友。

image

文章将依次从以下几个问题着手,进行详细说明:
1、如何为现有的工程添加widget;
2、如何绘制UI;
3、如何调起app;
4、如何与host app共享数据。

添加Today Extension

image

如图,为现有的工程添加Today Extension,命名这里不赘述了,大家都懂的。

image

这是添加Today Extension之后的工程目录。
    到这里,为现有的工程添加Today Extension算是完成了,运行程序就可以看到类似图1的简单的效果了,很简单哈。

绘制UI

与网上发表文章的童鞋们一样,我也是个代码控(装B一下),习惯用纯代码来绘制Today的UI。

image

这里,删除默认创建的MainInterface.storyboard,并按图4所示修改Info.plist文件。(当然,习惯使用storyboard的童鞋可以略过,直接操作storyboard即可)

首先,设置widget展示视图的大小。关于widget的背景色,以及具体展示的内容大家按需绘制,这里暂且不表。

运行程序后,会发现一个问题:绘制的内容与左侧边界有一定距离(约30px)。如何解决这个问题呢,如图6所示,TodayViewController遵守的NCWidgetProviding协议给出了解决方案。

调起app

因为extension和containing app是两个完全独立的进程,所以它们之间不能直接通信(不能像应用内部点击按钮,跳转到指定页面)。为了实现widget调起app,这里通过openURL的方式来启动containing app。

- (void)openURLContainingAPP{ 
//通过extensionContext借助host app调起app
 [self.extensionContext openURL:[NSURL URLWithString:@"appextension://xxx"] 
completionHandler:^(BOOL success) { NSLog(@"open url result:%d",success); }]; 
}

数据共享

通过App Groups提供的同一group内app共同读写区域,可以用NSUserDefaults和NSFileManager两种方式实现extension和containing app之间的数据共享。

1 通过NSUserDefaults共享数据
保存数据 - 
(void)saveDataByNSUserDefaults{ NSUserDefaults *shared = [[NSUserDefaults alloc]
 initWithSuiteName:@"group.c om.xxx"]; [shared setObject:@"asdfasdf" forKey:@"widget"]; 
[shared synchronize]; 
}
读取数据 -
 (NSString *)readDataFromNSUserDefaults{ NSUserDefaults *shared = [[NSUserDefaults alloc] 
initWithSuiteName:@"group.c om.xxx"]; NSString *value = [shared valueForKey:@"widget"]; 
return value;
 }
2 通过NSFileManager共享数据
保存数据 
- (BOOL)saveDataByNSFileManager{ NSError *err = nil; NSURL *containerURL = [[NSFileManager 
defaultManager] containerURLForSecuri tyApplicationGroupIdentifier:@"group.com.xxx"]; 
containerURL = [containerURL URLByAppendingPathComponent:@"Library/Caches/ widget"]; 
NSString *value = @"asdfasdfasf"; BOOL result = [value writeToURL:containerURL
atomically:YES encoding:NSUTF8StringEncoding error:&err]; if (!result) { NSLog(@"%@",err); } 
else { NSLog(@"save value:%@ success.",value); } return result; 

}
读取数据 
-(NSString *)readDataByNSFileManager{ NSError *err = nil; NSURL *containerURL =
 [[NSFileManager defaultManager] containerURLForSecuri 
tyApplicationGroupIdentifier:@"group.com.xxx"]; containerURL = [containerURL 
URLByAppendingPathComponent:@"Library/Caches/ widget"]; NSString *value = [NSString 
stringWithContentsOfURL:containerURL encoding: NSUTF8StringEncoding error:&err]; return
 value; 
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值